Audiodatenblöcke

[Das dieser Seite zugeordnete Feature Waveform Audio ist ein Legacyfeature. Es wurde durch WASAPI und Audio Graphs ersetzt. WASAPI- und Audiodiagramme wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit WASAPI und Audio graphs anstelle von Waveform Audio verwenden. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Für die Funktionen waveInAddBuffer und waveOutWrite müssen Anwendungen Datenblöcke zuordnen, die zu Aufzeichnungs- oder Wiedergabezwecken an die Gerätetreiber übergeben werden. Beide Funktionen verwenden die WAVEHDR-Struktur , um den Datenblock zu beschreiben.

Bevor Sie eine dieser Funktionen zum Übergeben eines Datenblocks an einen Gerätetreiber verwenden, müssen Sie Arbeitsspeicher 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-Audioeingabedatenblock vor.
waveInUnprepareHeader Bereinigt die Vorbereitung für einen Signalform-Audioeingabedatenblock.
waveOutPrepareHeader Bereitet einen Waveform-Audioausgabedatenblock vor.
waveOutUnprepareHeader Bereinigt die Vorbereitung für einen Waveform-Audioausgabedatenblock.

 

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 diesen zurückgibt, müssen Sie diese Vorbereitung sauber, indem Sie den Datenblock entweder an waveInUnprepareHeader oder waveOutUnprepareHeader übergeben, bevor der zugewiesene Arbeitsspeicher freigegeben werden kann.

Solange die Eingangs- und Ausgabedaten für Waveform-Audio nicht klein genug sind, um in einem einzelnen Datenblock enthalten zu sein, müssen Anwendungen den Gerätetreiber kontinuierlich mit Datenblöcken versorgen, bis die Wiedergabe oder Aufzeichnung abgeschlossen ist.

Selbst wenn ein einzelner Datenblock verwendet wird, muss eine Anwendung in der Lage sein, zu bestimmen, wann ein Gerätetreiber mit dem Datenblock fertig ist, damit die Anwendung den Speicher freigeben kann, der dem Datenblock und der Headerstruktur zugeordnet ist. Es gibt mehrere Möglichkeiten, zu bestimmen, wann ein Gerätetreiber mit einem Datenblock fertig ist:

  • Durch Angeben einer Rückruffunktion zum Empfangen einer vom Treiber gesendeten Nachricht, wenn sie mit einem Datenblock abgeschlossen ist
  • Mithilfe eines Ereignisrückrufs
  • Durch Angeben eines Fensters oder Threads zum Empfangen einer vom Treiber gesendeten Nachricht, wenn er mit einem Datenblock abgeschlossen 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 hörbaren Lücke bei der Wiedergabe oder zu einem Verlust eingehender aufgezeichneter Informationen kommen. Dies erfordert mindestens ein Doppelpufferschema, bei dem mindestens ein Datenblock vor dem Gerätetreiber bleibt.

In den folgenden Themen wird beschrieben, wie Sie ermitteln können, wann ein Gerätetreiber mit einem Datenblock fertig ist:

Verwenden einer Rückruffunktion zum Verarbeiten von Treibermeldungen