![]() |
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 ? |
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 |
Re: Wie waveOutWrite visualisieren ?
Irgend wie sehr verwirrend alles.
Wie kann ich denn ein eigene Wavestructur in der Callbackfunktion abrufen ? |
Re: Wie waveOutWrite visualisieren ?
Du speicherst einen Pointer auf deine Daten in dwUser.
|
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. |
Re: Wie waveOutWrite visualisieren ?
Delphi-Quellcode:
Hoffe das Hilft ein wenig...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) |
Re: Wie waveOutWrite visualisieren ?
Ersteinmal, danke.
Ich werde das mal auf einen anderen Tag verlegen. Heute kommt bei mir eh nix mehr rum. |
Re: Wie waveOutWrite visualisieren ?
Es hindert dich auch niemand daran direkt Audorra (bzw. das WaveOut-Modul) zu verwenden :wink:
|
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. |
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 11:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz