2010-11-21 6 views
2

Ich benutze die Windows-Multimedia-APIs zur Aufzeichnung und Verarbeitung von Wave-Audio (waveInOpen und Freunde). Ich möchte eine kleine Anzahl von Puffern in einer Round-Robin-Mode verwenden.Können Sie Puffer mit Windows-Wave-Audioeingang wiederverwenden?

Ich weiß, dass Sie angeblich waveInPrepareHeader verwenden, bevor ein Puffer zum Gerät hinzufügen, und dass man eigentlich waveInUnprepareHeader nennen, nachdem die Welle Gerät „die Puffer an die Anwendung zurückgegeben“ und bevor Sie es freigeben.

Meine Frage ist, muss ich unvorbereitet und neu vorbereiten, um einen Puffer wieder zu verwenden? Oder kann ich einfach einen zuvor verwendeten Puffer zum Gerät hinzufügen?

Ist es auch wichtig, in welchem ​​Thread ich das mache? Ich verwende die Callback-Funktion, die scheinbar auf einem Worker-Thread aufgerufen wird, der zum Audiosystem gehört. Kann ich während des Rückrufs waveInUnprepareHeader, waveInPrepareHeader und waveInAddBuffer anrufen?

Antwort

2

Ja, meine Erfahrung musste Sie jedes Mal anrufen und vorbereiten. Aus dem Speicher wird ein Fehler zurückgegeben, wenn Sie versuchen, denselben zu verwenden.

Und Sie rufen in der Regel die Vorbereitung und Unvorbereiter auf jeden Thread, mit dem Sie die Rückrufe bearbeiten.

+0

Danke. Es sieht so aus, als ob der Versuch, waveInUnprepare während des Callbacks aufzurufen, ein Problem während eines waveInReset ist - es verursacht einen Deadlock. –

+0

Ja, Deadlocks in waveInReset (und waveOutReset) sind ein Problem und variieren je nachdem, welchen Soundkartentreiber Sie haben. –

0

Wenn Sie die Puffer erstellen, rufen Sie waveInPrepareHeader. Dann können Sie einfach das vorbereitete-Flag festlegen, bevor Sie waveInAddBuffer auf einem Puffer aufrufen, der von dem Gerät zurückgegeben wurde.

Sie können dies auf dem Callback-Thread (oder im Message-Handler) tun.

+0

In meinen Tests hat das Feld dwFlags WHDR_PREPARED, auch nachdem das Gerät mit dem Puffer fertig ist, also bin ich mir nicht sicher, was genau dieses Feld bedeutet. Ich nehme an, dass es mit dem Soundtreiber variieren könnte. –

+0

Es kann auch zwischen verschiedenen Versionen von Windows AFAIK variieren. Auf jeden Fall hatte ich noch nie ein Problem beim Aufruf von waveInAddBuffer ohne die Aufrufe von waveInUnprepareHeader und waveInPrepareHeader. – Han

Verwandte Themen