Audiodatenblöcke
Die Funktionen waveInAddBuffer und waveOutWrite erfordern, dass Anwendungen Datenblöcke zuordnen, die zu Aufzeichnungs- oder Wiedergabezwecken an die Gerätetreiber übergeben werden. Beide Funktionen verwenden die WAVEHDR-Struktur, um ihren Datenblock zu beschreiben.
Bevor Sie eine dieser Funktionen verwenden, um einen Datenblock an einen Gerätetreiber zu übergeben, müssen Sie Speicher für den Datenblock und die Headerstruktur zuordnen, die den Datenblock beschreibt. Die Header können mithilfe der folgenden Funktionen vorbereitet und nicht vorbereitet werden.
| Funktion | Beschreibung |
|---|---|
| waveInPrepareHeader | Bereitet einen Waveform-Audio-Eingabedatenblock vor. |
| waveInUnprepareHeader | Bereinigt die Vorbereitung für einen Waveform-Audio-Eingabedatenblock. |
| waveOutPrepareHeader | Bereitet einen Waveform-Audio-Ausgabedatenblock vor. |
| waveOutUnprepareHeader | Bereinigt die Vorbereitung für einen Waveform-Audio-Ausgabedatenblock. |
Bevor Sie einen Audiodatenblock an einen Gerätetreiber übergeben, müssen Sie den Datenblock vorbereiten, indem Sie ihn entweder an waveInPrepareHeader oder waveOutPrepareHeaderübergeben. Wenn der Gerätetreiber mit dem Datenblock fertig ist und ihn zurückgibt, müssen Sie diese Vorbereitung bereinigen, indem Sie den Datenblock entweder an waveInUnprepareHeader oder waveOutUnprepareHeader übergeben, bevor der zugeordnete Arbeitsspeicher freigegeben werden kann.
Sofern die Waveform-Audio-Eingabe- und -Ausgabedaten nicht klein genug sind, um in einem einzelnen Datenblock enthalten zu sein, müssen Anwendungen dem Gerätetreiber kontinuierlich Datenblöcke bereitstellen, bis die Wiedergabe oder Aufzeichnung abgeschlossen ist.
Selbst wenn ein einzelner Datenblock verwendet wird, muss eine Anwendung bestimmen können, wann ein Gerätetreiber mit dem Datenblock fertig ist, damit die Anwendung den dem Datenblock und der Headerstruktur zugeordneten Arbeitsspeicher freigeben kann. Es gibt mehrere Möglichkeiten, zu bestimmen, wann ein Gerätetreiber mit einem Datenblock fertig ist:
- Durch Angeben einer Rückruffunktion zum Empfangen einer Nachricht, die vom Treiber gesendet wird, wenn er mit einem Datenblock fertig ist
- Mithilfe eines Ereignisrückrufs
- Durch Angeben eines Fensters oder Threads zum Empfangen einer Nachricht, die vom Treiber gesendet wird, wenn er mit einem Datenblock fertig ist
- Durch Abfragen des WHDR _ DONE-Bits im dwFlags-Member der WAVEHDR-Struktur, die mit jedem Datenblock gesendet wird
Wenn eine Anwendung bei Bedarf keinen Datenblock für den Gerätetreiber erhält, kann es zu einer akustischen Lücke bei der Wiedergabe oder einem Verlust eingehender aufgezeichneter Informationen kommen. Dies erfordert mindestens ein Schema mit doppelter Pufferung, da dem Gerätetreiber mindestens ein Datenblock voraus bleibt.
In den folgenden Themen werden Möglichkeiten beschrieben, um zu bestimmen, wann ein Gerätetreiber mit einem Datenblock fertig ist:
Verwenden einer Rückruffunktion zum Verarbeiten von Treibermeldungen