Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Wie waveOutWrite visualisieren ? (https://www.delphipraxis.net/139506-wie-waveoutwrite-visualisieren.html)

turboPASCAL 30. Aug 2009 09:43


Wie waveOutWrite visualisieren ?
 
Hi,

ich habe folgendes Problem. Ich möchte Daten die über waveOutWrite ausgegeben werden
visualisieren. Das Problem an der Sache ist das der Puffer für waveOutWrite sehr gross
ist und somit nicht so einfach visualisiert werden kann.

Ich möchte jeweils nur 256 Bytes visualisieren, der waveOutWrite-Puffer ist aber zB. 4096 Bytes gross.
Demzufolge wäre die Visualisierung asynchron, weil ja immer nur die ersten 256 Bytes dargestellt werden.

Wie könnte man dies realisieren ohne über den Stereomix zu gehen ?

igel457 30. Aug 2009 10:26

Re: Wie waveOutWrite visualisieren ?
 
Gibst du die Daten über WaveOut aus, oder ein anderes Programm?

Falls ersteres der Fall ist, schau dir mal den Quellcode von Audorra an. Du kannst bei WaveOut eine Callbackfunktion registrieren und mit jedem Buffer "Userdata" verknüpfen. Dort schreibst du einfach den entsprechenden Timecode des Buffers rein, den du über die Callbackfunktion zurückbekommst. Nun Streamst du die Daten nicht nur an WaveOut sondern auch an einen Visualisierungsthread, der die Timecodedaten der Daten und der aktuellen Wiedergabe hat und synchronisierst dort.

Siehe:
AuFilterGraph.TAuAnalyzeThread.Excecute
AuWaveOut32Driver.stream_callback

turboPASCAL 30. Aug 2009 12:51

Re: Wie waveOutWrite visualisieren ?
 
Irgend wie sehr verwirrend alles.

Wie kann ich denn ein eigene Wavestructur in der Callbackfunktion abrufen ?

igel457 30. Aug 2009 14:41

Re: Wie waveOutWrite visualisieren ?
 
Du speicherst einen Pointer auf deine Daten in dwUser.

turboPASCAL 30. Aug 2009 14:52

Re: Wie waveOutWrite visualisieren ?
 
Könntest du mir ein Beispiel machen ? Pseudocode oder Pi * :thumb: würde reichen.

Ich verstehe einfach nicht wie dwUser beine Datenstrucktur befüllen soll.

igel457 30. Aug 2009 15:37

Re: Wie waveOutWrite visualisieren ?
 
Delphi-Quellcode:

FBlocks: array of TWaveHdr;

type
  TMyStruct = record
    [...]
  end;
  PMyStruct = ^TMyStruct;

//Schreiben
var
  struct: PMyStruct;
begin
  New(struct);
  struct^.TimeCode = 1923820;
  @FBlocks[FCurrentBlock].dwUser = struct;

  waveOutPrepareHeader(Fhwo, @FBlocks[FCurrentBlock], SizeOf(FBlocks[FCurrentBlock]));
  waveOutWrite(Fhwo, @FBlocks[FCurrentBlock], SizeOf(FBlocks[FCurrentBlock]));
end;

//Callback
//dwParam1: Pointer of Block
procedure stream_callback(hwo: HWAVEOUT; uMsg: Cardinal; dwInstance, dwParam1, dwParam2: DWORD);stdcall;
begin
  if (uMsg = WOM_DONE) then
  begin
    with TAuWaveOutStreamDriver(Pointer(dwInstance)) do
    begin
      FFreeblocks := FFreeblocks + 1;
      FSyncData := PAuSyncData(PWaveHdr(dwParam1)^.dwUser)^;
     
      Dispose(PWaveHdr(dwParam1)^.dwUser);
    end;
  end;
end;

//Öffnen
                                                                           //\/ dwInstance
waveOutOpen(@Fhwo, Cardinal(FDevId), @FFormat, Cardinal(@stream_callback), Cardinal(self),
    CALLBACK_FUNCTION)
Hoffe das Hilft ein wenig...

turboPASCAL 30. Aug 2009 17:08

Re: Wie waveOutWrite visualisieren ?
 
Ersteinmal, danke.

Ich werde das mal auf einen anderen Tag verlegen. Heute kommt bei mir eh nix mehr rum.

igel457 30. Aug 2009 20:13

Re: Wie waveOutWrite visualisieren ?
 
Es hindert dich auch niemand daran direkt Audorra (bzw. das WaveOut-Modul) zu verwenden :wink:

turboPASCAL 30. Aug 2009 22:06

Re: Wie waveOutWrite visualisieren ?
 
Das würde die Sache vill. vereinfachen.
Allerdings ist das Programm an sich nonVCL. ;)

Des weiteren würde ich nichts dazu lernen.

igel457 30. Aug 2009 22:34

Re: Wie waveOutWrite visualisieren ?
 
Wenn du SysUtils und Classes nicht als VCL zählst ist Audorra auch nonVCL (ist ja auch eine Demo für ein pures Konsolenprogramm dabei) und die WaveOut-Unit kannst du ja auch getrennt nutzen.

Dein zweiter Grund ist aber natürlich ausschlaggebend. :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz