Geräte und Datentypen
[Das dieser Seite zugeordnete Feature Waveform Audio ist ein Legacyfeature. Es wurde von WASAPI und Audio Graphs abgelöst. WASAPI- und Audiographen wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit WASAPI - und Audiographen anstelle von Waveform Audio verwenden sollte. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
In diesem Abschnitt wird die Arbeit mit Waveform-Audio-Geräten beschrieben, und es wird beschrieben, wie Sie sie öffnen, schließen und nach ihren Funktionen abfragen können. Außerdem wird beschrieben, wie Die Geräte in einem System mithilfe von Gerätehandles und Gerätebezeichnern nachverfolgt werden.
Öffnen Waveform-Audio Ausgabegeräte
Verwenden Sie die waveOutOpen-Funktion , um ein Waveform-Audioausgabegerät für die Wiedergabe zu öffnen. Diese Funktion öffnet das Gerät, das dem angegebenen Gerätebezeichner zugeordnet ist, und gibt ein Handle des geöffneten Geräts zurück, indem das Handle eines angegebenen Speicherorts geschrieben wird.
Einige Multimediacomputer verfügen über mehrere Waveform-Audio-Ausgabegeräte. Wenn Sie kein bestimmtes Waveform-Audioausgabegerät in einem System öffnen möchten, sollten Sie beim Öffnen eines Geräts das flag WAVE_MAPPER für den Gerätebezeichner verwenden. Die waveOutOpen-Funktion wählt das Gerät im System aus, das das angegebene Datenformat am besten wiedergeben kann.
Abfragen von Audiogeräten
Windows bietet die folgenden Funktionen, um zu bestimmen, wie viele Geräte eines bestimmten Typs in einem System verfügbar sind.
Funktion | BESCHREIBUNG |
---|---|
auxGetNumDevs | Ruft die Anzahl der im System vorhandenen Hilfsausgabegeräte ab. |
waveInGetNumDevs | Ruft die Anzahl der im System vorhandenen Waveform-Audioeingabegeräte ab. |
waveOutGetNumDevs | Ruft die Anzahl der im System vorhandenen Waveform-Audioausgabegeräte ab. |
Audiogeräte werden durch einen Gerätebezeichner identifiziert. Der Gerätebezeichner wird implizit aus der Anzahl der in einem System vorhandenen Geräte bestimmt. Gerätebezeichner reichen von null bis 1 weniger als die Anzahl der vorhandenen Geräte. Wenn beispielsweise zwei Wellenform-Audioausgabegeräte in einem System vorhanden sind, sind die gültigen Gerätebezeichner 0 und 1.
Nachdem Sie ermittelt haben, wie viele Geräte eines bestimmten Typs in einem System vorhanden sind, können Sie eine der folgenden Funktionen verwenden, um die Funktionen der einzelnen Geräte abzufragen.
Funktion | BESCHREIBUNG |
---|---|
auxGetDevCaps | Ruft die Funktionen eines angegebenen Hilfsausgabegeräts ab. |
waveInGetDevCaps | Ruft die Funktionen eines angegebenen Waveform-Audioeingabegeräts ab. |
waveOutGetDevCaps | Ruft die Funktionen eines angegebenen Waveform-Audioausgabegeräts ab. |
Jede dieser Funktionen füllt eine Struktur mit Informationen zu den Funktionen eines angegebenen Geräts aus. In der folgenden Tabelle sind die Strukturen aufgeführt, die jeder dieser Funktionen entsprechen.
Funktion | Struktur |
---|---|
auxGetDevCaps | AUXCAPS |
waveInGetDevCaps | WAVEINCAPS |
waveOutGetDevCaps | WAVEOUTCAPS |
Standardformate werden im dwFormats-Element der WAVEOUTCAPS-Struktur aufgeführt. Waveform-Audio-Geräte können nicht standardmäßige Formate unterstützen. Um zu bestimmen, ob ein bestimmtes Format (Standard oder Nichtstandard) von einem Gerät unterstützt wird, können Sie die waveOutOpen-Funktion mit dem flag WAVE_FORMAT_QUERY aufrufen. Dieses Flag öffnet das Gerät nicht. Sie geben das betreffende Format in der WAVEFORMATEX-Struktur an, auf die der pwfx-Parameter verweist, der an waveOutOpen übergeben wird.
Waveform-Audio-Ausgabegeräte variieren in den Funktionen, die sie unterstützen. Der dwSupport-Member der WAVEOUTCAPS-Struktur gibt an, ob ein Gerät Funktionen wie Lautstärke- und Tonhöhenänderungen unterstützt.
Gerätehandles und Gerätebezeichner
Jede Funktion, die ein Audiogerät öffnet, gibt einen Gerätebezeichner, einen Zeiger auf einen Speicherort und einige Parameter an, die für jeden Gerätetyp eindeutig sind. Der Speicherort des Arbeitsspeichers wird mit einem Gerätehandle gefüllt. Verwenden Sie dieses Gerätehandle, um das geöffnete Audiogerät beim Aufrufen anderer Audiofunktionen zu identifizieren.
Der Unterschied zwischen Bezeichnern und Handles für Audiogeräte ist subtil, aber wichtig:
- Gerätebezeichner werden implizit aus der Anzahl der in einem System vorhandenen Geräte bestimmt. Diese Zahl wird mithilfe der Funktion auxGetNumDevs, waveInGetNumDevs oder waveOutGetNumDevs abgerufen.
- Gerätehandles werden zurückgegeben, wenn Gerätetreiber mithilfe der WaveInOpen - oder waveOutOpen-Funktion geöffnet werden.
Es gibt keine Funktionen, die zusätzliche Audiogeräte öffnen oder schließen. Zusätzliche Audiogeräte müssen nicht wie Waveform-Audiogeräte geöffnet und geschlossen werden, da ihnen keine kontinuierliche Datenübertragung zugeordnet ist. Alle zusätzlichen Audiofunktionen verwenden Gerätebezeichner, um Geräte zu identifizieren.
Waveform-Audio Ausgabedatentypen
Die folgenden Datentypen sind für Waveform-Audio-Ausgabefunktionen definiert.
type | BESCHREIBUNG |
---|---|
HWAVEOUT | Handle für ein offenes Waveform-Audioausgabegerät. |
WAVEFORMATEX | Struktur, die die Datenformate angibt, die von einem bestimmten Waveform-Audioeingabegerät unterstützt werden. Diese Struktur wird auch für Waveform-Audio-Eingabegeräte verwendet. |
WAVEHDR | Struktur, die als Header für einen Block von Waveform-Audio-Eingabedaten verwendet wird. Diese Struktur wird auch für Waveform-Audio-Eingabegeräte verwendet. |
WAVEOUTCAPS | Struktur, die zum Abfragen der Funktionen eines bestimmten Waveform-Audioausgabegeräts verwendet wird. |
Angeben Waveform-Audio Datenformate
Wenn Sie die waveOutOpen-Funktion aufrufen, um einen Gerätetreiber für die Wiedergabe zu öffnen oder abzufragen, ob der Treiber ein bestimmtes Datenformat unterstützt, verwenden Sie den pwfx-Parameter , um einen Zeiger auf eine WAVEFORMATEX-Struktur anzugeben, die das angeforderte Waveform-Audiodatenformat enthält. WAVEFORMATEX ersetzt die STRUKTUREN WAVEFORMAT und PCMWAVEFORMAT .
Für Audiodaten, die in mehr als zwei Kanäle unterteilt sind oder eine Beispielgröße haben, die kein Vielfaches von 8 ist, sollten Sie WAVEFORMATEXTENSIBLE verwenden. Diese Struktur konfiguriert einfach die zusätzlichen Bytes, auf die vom cbSize-Member von WAVEFORMATEX verwiesen wird, um zusätzliche Informationen zum Format zu geben. WAVEFORMATEXTENSIBLE kann als WAVEFORMATEX umgewandelt werden.
Es gibt auch zwei Zwischenablageformate, die Sie zum Darstellen von Audiodaten verwenden können: CF_WAVE und CF_RIFF. Verwenden Sie das CF_WAVE-Format, um Daten in einem der Standardformate darzustellen, z. B. 11 kHz oder 22 kHz PCM. Verwenden Sie das CF_RIFF-Format, um komplexere Datenformate darzustellen, die nicht als Standardmäßige Waveform-Audiodateien dargestellt werden können.
Schreiben Waveform-Audio Daten
Nach dem erfolgreichen Öffnen eines Waveform-Audioausgabegerätetreibers können Sie mit der Wiedergabe eines Sounds beginnen. Windows stellt die waveOutWrite-Funktion zum Senden von Datenblöcken an Waveform-Audioausgabegeräte bereit.
Verwenden Sie die WAVEHDR-Struktur , um den Waveform-Audiodatenblock anzugeben, den Sie mit waveOutWrite senden. Diese Struktur enthält einen Zeiger auf einen gesperrten Datenblock, die Länge des Datenblocks und einige Flags. Dieser Datenblock muss vor der Verwendung vorbereitet werden. Informationen zum Vorbereiten eines Datenblocks finden Sie unter Audiodatenblöcke.
Nachdem Sie einen Datenblock mithilfe von waveOutWrite an ein Ausgabegerät gesendet haben, müssen Sie warten, bis der Gerätetreiber mit dem Datenblock fertig ist, bevor Sie ihn freigeben. Wenn Sie mehrere Datenblöcke senden, müssen Sie die Vervollständigung von Datenblöcken überwachen, um zu wissen, wann zusätzliche Blöcke gesendet werden sollen. Weitere Informationen zu Datenblöcken finden Sie unter Audiodatenblöcke.
PCM-Waveform-Audio-Datenformat
Das lpData-Element der WAVEHDR-Struktur verweist auf die Waveform-Audiodatenbeispiele. Bei 8-Bit-PCM-Daten wird jedes Beispiel durch ein einzelnes Datenbyte ohne Vorzeichen dargestellt. Für 16-Bit-PCM-Daten wird jedes Beispiel durch einen 16-Bit-Vorzeichenwert dargestellt. In der folgenden Tabelle sind die maximalen, minimalen und mittleren Werte für PCM-Waveform-Audiodaten zusammengefasst.
Datenformat | Maximalwert | Minimalwert | Mittelpunktwert |
---|---|---|---|
8-Bit-PCM | 255 (0xFF) | 0 | 128 (0x80) |
16-Bit-PCM | 32.767 (0x7FFF) | –32.768 (0x8000) | 0 |
PCM-Datenverpackung
Die Reihenfolge der Datenbytes variiert zwischen 8-Bit- und 16-Bit-Formaten sowie zwischen Mono- und Stereoformaten. In der folgenden Liste wird das Datenpacken für die verschiedenen PCM-Waveform-Audio-Datenformate beschrieben.
PCM Waveform-Audioformat | BESCHREIBUNG |
---|---|
8-Bit Mono | Jedes Beispiel ist 1 Byte, das einem einzelnen Audiokanal entspricht. Auf Stichprobe 1 folgen die Beispiele 2, 3, 4 usw. |
8-Bit-Stereo | Jedes Beispiel ist 2 Bytes. Auf Stichprobe 1 folgen die Beispiele 2, 3, 4 usw. Für jedes Beispiel ist das erste Byte Kanal 0 (der linke Kanal) und das zweite Byte Kanal 1 (der rechte Kanal). |
16-Bit Mono | Jedes Beispiel ist 2 Bytes. Auf Stichprobe 1 folgen die Beispiele 2, 3, 4 usw. Für jedes Beispiel ist das erste Byte das Byte mit niedriger Reihenfolge von Kanal 0 und das zweite Byte das hochgeordnete Byte von Kanal 0. |
16-Bit-Stereo | Jedes Beispiel ist 4 Bytes. Auf Stichprobe 1 folgen die Beispiele 2, 3, 4 usw. Für jedes Beispiel ist das erste Byte das Byte mit niedriger Reihenfolge von Kanal 0 (linker Kanal). das zweite Byte ist das hochgeordnete Byte von Kanal 0; das dritte Byte ist das Low-Order-Byte von Kanal 1 (rechter Kanal); und das vierte Byte ist das hochgeordnete Byte von Kanal 1. |
Sonstige | Jedes Beispiel ist in einem Block enthalten, der ein Vielfaches von 4 Bytes ist, aber die Beispiele können nicht bytebündig sein. Die Anordnung der Kanäle wird durch eine Maske angegeben. Weitere Informationen finden Sie unter WAVEFORMATEXTENSIBLE. |
Schließen Waveform-Audio Ausgabegeräte
Nachdem die Waveform-Audiowiedergabe abgeschlossen ist, rufen Sie waveOutClose auf, um das Ausgabegerät zu schließen. Wenn waveOutClose aufgerufen wird, während eine Waveform-Audiodatei wiedergegeben wird, schlägt der Schließenvorgang fehl, und die Funktion gibt einen Fehlercode zurück, der angibt, dass das Gerät nicht geschlossen wurde. Wenn Sie nicht auf das Ende der Wiedergabe warten möchten, bevor Sie das Gerät schließen, rufen Sie die waveOutReset-Funktion auf, bevor Sie schließen. Dadurch wird die Wiedergabe beendet und das Gerät kann geschlossen werden. Stellen Sie sicher, dass Sie die WaveOutUnprepareHeader-Funktion verwenden, um die Vorbereitung für alle Datenblöcke zu sauber, bevor Sie das Gerät schließen.