Erweiterbare Wave-Format-Deskriptoren

Die folgende Abbildung zeigt den Datenformatdeskriptor für einen Wave-Audiostream.

Diagramm, das einen Wellenformatdeskriptor für einen Audiostream veranschaulicht.

Wie in der Abbildung dargestellt, variiert die Menge zusätzlicher Formatinformationen, die der KSDATAFORMAT-Struktur folgen, je nach Datenformat.

Audiosysteme verwenden diese Art von Formatdeskriptor auf verschiedene Arten:

  • Ein Formatdeskriptor wie in der vorherigen Abbildung wird als Aufrufparameter an die NewStream-Methode eines Miniporttreibers übergeben (z. B. siehe IMiniportWaveCyclic::NewStream).

  • Der ResultantFormat-Parameter der IMiniport::D ataRangeIntersection-Methode verweist auf einen Puffer, in den die Methode einen Formatdeskriptor schreibt, wie in der vorherigen Abbildung dargestellt.

  • Die KSPROPERTY_PIN_DATAINTERSECTION Get-Property-Anforderung ruft einen Formatdeskriptor ab, der in der vorherigen Abbildung dargestellt ist.

  • Die KSPROPERTY_PIN_PROPOSEDATAFORMAT Set-Eigenschaftsanforderung akzeptiert einen Formatdeskriptor wie den in der vorherigen Abbildung gezeigten.

  • Ein ähnliches Format wird für den Connect-Aufrufparameter der KsCreatePin-Funktion verwendet. Dieser Parameter verweist auf die KSPIN_CONNECT-Struktur am Anfang eines Puffers, der auch einen Formatdeskriptor enthält. Der Formatdeskriptor, der unmittelbar der KSPIN_CONNECT-Struktur folgt, beginnt mit einer KSDATAFORMAT-Struktur wie in der vorherigen Abbildung dargestellt.

Die Formatinformationen, die der KSDATAFORMAT-Struktur folgen, sollten eine WAVEFORMATEXTENSIBLE-Struktur sein. WAVEFORMATEXTENSIBLE ist eine erweiterte Version von WAVEFORMATEX, die eine größere Bandbreite von Formaten als WAVEFORMATEX beschreiben kann.

WAVEFORMAT ist veraltet und wird in keiner Version von Microsoft Windows vom WDM-Audiosubsystem unterstützt. DIE PCMWAVEFORMAT-Struktur ist eine erweiterte Version von WAVEFORMAT, die ebenfalls veraltet ist.

Die vier Wellenformatstrukturen – WAVEFORMAT, PCMWAVEFORMAT, WAVEFORMATEX und WAVEFORMATEXTENSIBLE – beginnen alle mit den gleichen fünf Elementen, beginnend mit wFormatTag. In der obigen Abbildung sind diese vier Strukturen übereinander angeordnet, um die teile der strukturen hervorzuheben, die identisch sind.

WAVEFORMATEXTENSIBLE erweitert WAVEFORMATEX durch Hinzufügen von drei Membern, beginnend mit Samples.wValidBitsPerSample. (Samples ist eine Union, deren anderes Element, wValidSamplesPerBlock, anstelle von wValidBitsPerSample für einige komprimierte Formate verwendet wird.) Das wFormatTag-Element , das unmittelbar dem Ende der KSDATAFORMAT-Struktur im Puffer folgt, gibt an, welche Art von Formatinformationen KSDATAFORMAT folgen.

Im Gegensatz zu WAVEFORMATEX kann WAVEFORMATEXTENSIBLE die folgenden Aktionen ausführen:

  1. Geben Sie die Anzahl der Bits pro Beispiel getrennt von der Größe des Beispielcontainers an. Beispielsweise kann ein 20-Bit-Beispiel linksrechtig in einem Container mit drei Byte gespeichert werden. WAVEFORMATEX, das die Anzahl der Datenbits pro Beispiel nicht von der Größe des Beispielcontainers unterscheidet, kann ein solches Format nicht eindeutig beschreiben.

  2. Weisen Sie Audiokanälen in Mehrkanalstreams bestimmte Lautsprecherstandorte zu. WAVEFORMATEX verfügt nicht über diese Funktion und kann nur Mono- und (Zweikanal-)Stereostreams unterstützen.

Legacy-Verwendung von WAVEFORMATEX

Jedes Format, das von WAVEFORMATEX beschrieben wird, kann auch durch WAVEFORMATEXTENSIBLE beschrieben werden. Informationen zum Konvertieren einer WAVEFORMATEX-Struktur in WAVEFORMATEXTENSIBLE finden Sie unter Konvertieren zwischen Formattags und Unterformat-GUIDs.

WAVEFORMATEX reicht aus, um Formate mit Beispielgrößen von 8 oder 16 Bit zu beschreiben, aber WAVEFORMATEXTENSIBLE ist erforderlich, um Formate mit einer Stichprobengenauigkeit von mehr als 16 Bit angemessen zu beschreiben. Zwei Beispiele:

  • Ein Stream mit einer Beispielgenauigkeit von 24 Bit kann eine 32-Bit-Containergröße für eine effiziente Verarbeitung verwenden, kann jedoch in einen 24-Bit-Container konvertiert werden, um die Speichereffizienz ohne Datenverlust zu verbessern.

  • Bei der Verarbeitung eines Datenstroms mit 24-Bit-Beispieldaten kann ein Renderinggerät, das nur eine Genauigkeit von 20 Bit bietet, dithering verwenden, um die Genauigkeit des Ausgabesignals zu verbessern. Das Dithering erfordert jedoch zusätzliche Verarbeitungszeit, und wenn der ursprüngliche Datenstrom nur auf 20 Bit genau ist, ist die zusätzliche Verarbeitung unnötig.

In beiden Beispielen ist es nur möglich, die Signalqualität zu erhalten und gleichzeitig den richtigen Kompromiss zwischen Verarbeitungs- und Speichereffizienz zu treffen, wenn sowohl die Probengenauigkeit als auch die Containergröße bekannt sind.

Wenn ein einfaches Format entweder durch eine WAVEFORMATEX- oder eine WAVEFORMATEXTENSIBLE-Struktur eindeutig beschrieben werden kann, hat ein Audiotreiber die Möglichkeit, eine der beiden Strukturen auszuwählen, um das Format zu beschreiben. Audiotreiber haben jedoch in der Regel WAVEFORMATEX verwendet, um Mono- und (Zweikanal-)Stereo-PCM-Formate mit 8-Bit- oder 16-Bit-Beispielen anzugeben, und einige ältere Anwendungen erwarten möglicherweise, dass alle Audiotreiber WAVEFORMATEX verwenden, um diese Formate anzugeben.

Wenn ein Treiber ein Audioformat unterstützt, das eindeutig als WAVEFORMATEX- oder WAVEFORMATEXTENSIBLE-Struktur angegeben werden kann, sollte der Treiber das Format unabhängig davon erkennen, welche der beiden Strukturen eine Clientanwendung oder Komponente zum Angeben der Struktur verwendet. Wenn ein Audiogerät beispielsweise ein 44,1-kHz-, 16-Bit-Stereo-PCM-Format unterstützt, sollte der KSPROPERTY_PIN_PROPOSEDATAFORMAT-Eigenschaftshandler des Miniporttreibers und seine Implementierung der NewStream-Methode dieses Format akzeptieren, unabhängig davon, ob das Format als WAVEFORMATEX- oder WAVEFORMATEXTENSIBLE-Struktur angegeben ist.

Um die Verarbeitung von Formatdaten zu vereinfachen, verwenden Treiber in der Regel WAVEFORMATEXTENSIBLE-Strukturen, um Formate intern darzustellen. Dieser Ansatz erfordert möglicherweise die Konvertierung einer WAVEFORMATEX-Eingabestruktur in eine interne WAVEFORMATEXTENSIBLE-Darstellung oder die Konvertierung einer internen WAVEFORMATEXTENSIBLE-Darstellung in eine WAVEFORMATEX-Ausgabestruktur.

In WAVEFORMATEXTENSIBLE ist dwBitsPerSample die Containergröße und wValidBitsPerSample die Anzahl der gültigen Datenbits pro Beispiel. Container sind im Arbeitsspeicher immer bytebündig, und die Containergröße muss als Vielfaches von acht Bits angegeben werden.