Freigeben über


Erweiterbare Wave-Format Deskriptoren

Die folgende Abbildung zeigt den Datenformatdeskriptor für einen Wellenaudiostrom.

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

Wie in der Abbildung angegeben, variiert die Menge der zusätzlichen Formatinformationen nach der KSDATAFORMAT-Struktur je nach Datenformat.

Audiosysteme verwenden diese Art von Formatdeskriptor auf verschiedene Arten:

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

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

  • Die KSPROPERTY_PIN_DATAINTERSECTION get-property request ruft einen Formatdeskriptor wie die in der vorherigen Abbildung gezeigte ab.

  • Die KSPROPERTY_PIN_PROPOSEDATAFORMAT Set-Property-Anforderung akzeptiert einen Formatdeskriptor wie die in der vorherigen Abbildung gezeigte.

  • 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, die auch einen Formatdeskriptor enthält. Der Formatdeskriptor, der unmittelbar auf die KSPIN_CONNECT Struktur folgt, beginnt mit einer KSDATAFORMAT-Struktur wie der in der vorherigen Abbildung gezeigten.

Die Formatinformationen, die auf die KSDATAFORMAT-Struktur folgen, sollten eine WAVEFORMATEXTENSIBLE-Struktur sein. WAVEFORMATEXTENSIBLE ist eine erweiterte Version von WAVEFORMATEX, die eine breitere Palette von Formaten beschreiben kann als WAVEFORMATEX.

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

Die vier Wellenformatstrukturen --WAVEFORMAT, PCMWAVEFORMAT, WAVEFORMATEX und WAVEFORMATEXTENSIBLE --alle beginnen mit den gleichen fünf Mitgliedern, beginnend mit wFormatTag. Die vorstehende Abbildung zeigt diese vier Strukturen, die einander überlagert sind, um die Teile der identischen Strukturen hervorzuheben.

WAVEFORMATEXTENSIBLE erweitert WAVEFORMATEX durch Hinzufügen von drei Membern, beginnend mit Samples.wValidBitsPerSample. (Samples sind ein Vereinigungstyp, dessen anderes Mitglied wValidSamplesPerBlock anstelle von wValidBitsPerSample für einige komprimierte Formate verwendet wird.) Das wFormatTag-Mitglied, das unmittelbar auf das Ende der KSDATAFORMAT-Struktur im Puffer folgt, gibt an, welche Art von Formatinformationen KSDATAFORMAT folgt.

Im Gegensatz zu WAVEFORMATEX kann WAVEFORMATEXTENSIBLE folgende 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 innerhalb eines Drei-Byte-Containers linksbündig gespeichert werden. WAVEFORMATEX, bei dem die Anzahl der Datenbits pro Beispiel nicht von der Größe des Beispielcontainers unterschieden werden kann, kann ein solches Format nicht eindeutig beschreiben.

  2. Weisen Sie spezifische Sprecherpositionen den Audiokanälen in Mehrkanalstreams zu. WAVEFORMATEX besitzt diese Fähigkeit nicht und kann nur Mono- und (zweikanalige) Stereostreams angemessen unterstützen.

Legacy-Verwendung von WAVEFORMATEX

Jedes format, das von WAVEFORMATEX beschrieben wird, kann auch von WAVEFORMATEXTENSIBLE beschrieben werden. Informationen zum Konvertieren einer WAVEFORMATEX-Struktur in WAVEFORMATEXTENSIBLE finden Sie unter Converting Between Format Tags and Subformat GUIDs.

WAVEFORMATEX ist ausreichend für die Beschreibung von Formaten mit 8 oder 16 Bit, 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 Bits kann eine 32-Bit-Containergröße für eine effiziente Verarbeitung verwenden, kann jedoch konvertiert werden, um einen 24-Bit-Container zu verwenden, um die Speichereffizienz zu verbessern, ohne dass Daten verloren gehen.

  • Bei der Verarbeitung eines Datenstroms mit 24-Bit-Abtastdaten kann ein Renderinggerät, das nur 20 Bit Genauigkeit bietet, Dithering verwenden, um die Wiedergabetreue des Ausgabesignals zu verbessern. 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 die Beibehaltung der Signalqualität beim richtigen Kompromiss zwischen Verarbeitung und Speichereffizienz nur möglich, 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 (zweikanalige) 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 erkennen, unabhängig davon, welche der beiden Strukturen, die eine Clientanwendung oder Komponente verwendet, um die Struktur anzugeben. 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. Bei diesem Ansatz kann die Umwandlung einer Input WAVEFORMATEX-Struktur in eine interne WAVEFORMATEXTENSIBLE-Darstellung oder die Umwandlung einer internen WAVEFORMATEXTENSIBLE-Darstellung in eine WAVEFORMATEX-Ausgabestruktur erforderlich sein.

In WAVEFORMATEXTENSIBLE ist dwBitsPerSample die Containergröße, und wValidBitsPerSample ist die Anzahl gültiger Datenbits pro Beispiel. Container werden im Arbeitsspeicher immer byte-ausgerichtet, und die Containergröße muss als Vielfaches von acht Bits angegeben werden.