WAVEFORMATEXTENSIBLE-Struktur (ksmedia.h)
Die WAVEFORMATEXTENSIBLE-Struktur gibt das Format eines Audiowellenstroms an.
Syntax
typedef struct {
WAVEFORMATEX Format;
union {
WORD wValidBitsPerSample;
WORD wSamplesPerBlock;
WORD wReserved;
} Samples;
DWORD dwChannelMask;
GUID SubFormat;
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;
Member
Format
Gibt das Wellendatenformat des Datenstroms an. Dieses Element ist eine Struktur vom Typ WAVEFORMATEX. Das wFormat-Element von WAVEFORMATEX sollte auf WAVE_FORMAT_EXTENSIBLE festgelegt werden. Das wBitsPerSample-Element von WAVEFORMATEX ist eindeutig als die Größe des Containers für jedes Beispiel definiert. Beispielcontainer sind immer bytebündig, und wBitsPerSample muss ein Vielfaches von acht sein.
Samples
Samples.wValidBitsPerSample
Gibt die Genauigkeit des Beispiels in Bits an. Der Wert dieses Members sollte kleiner oder gleich der im Format angegebenen Containergröße sein. wBitsPerSample-Member . Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".
Samples.wSamplesPerBlock
Gibt die Anzahl von Beispielen an, die in einem komprimierten Block enthalten sind. Dieser Wert ist nützlich zum Schätzen der Pufferanforderungen für komprimierte Formate, die eine feste Anzahl von Beispielen in jedem Block aufweisen. Legen Sie diesen Member auf 0 fest, wenn jeder Block komprimierter Audiodaten eine variable Anzahl von Beispielen enthält. In diesem Fall müssen Pufferschätzungs- und Pufferpositionsinformationen auf andere Weise abgerufen werden.
Samples.wReserved
Reserviert für die interne Verwendung durch das Betriebssystem. Initialisieren Sie mit null.
dwChannelMask
Gibt die Zuweisung von Kanälen im Mehrkanalstream zu Sprecherpositionen an. Die Codierung entspricht der Codierung, die für das ActiveSpeakerPositions-Element der KSAUDIO_CHANNEL_CONFIG-Struktur verwendet wird. Weitere Informationen finden Sie im Abschnitt Hinweise.
SubFormat
Gibt das Unterformat an. Weitere Informationen finden Sie im Abschnitt Hinweise.
Hinweise
WAVEFORMATEXTENSIBLE ist eine erweiterte Form der WAVEFORMATEX-Struktur . WAVEFORMATEX kann nur eine Teilmenge der Formate eindeutig beschreiben, die durch WAVEFORMATEXTENSIBLE beschrieben werden können. WAVEFORMATEXTENSIBLE unterliegt nicht den Einschränkungen von WAVEFORMATEX, die nicht eindeutig Formate mit mehr als zwei Kanälen angeben können oder für die die Anzahl der gültigen Bits pro Beispiel nicht der Beispielcontainergröße entspricht. Weitere Informationen finden Sie unter Audiodatenformate und Datenbereiche.
Häufig enthält der wValidBitsPerSample-Member , der die Beispielgenauigkeit angibt, den gleichen Wert wie das Format. wBitsPerSample-Member , das die Beispielcontainergröße angibt. Diese Werte können sich jedoch unterscheiden. Wenn die Wellendaten beispielsweise von einem 20-Bit-A/D-Konverter stammen, sollte wValidBitsPerSample 20, aber Format sein. wBitsPerSample kann 24 oder 32 sein. Wenn wValidBitsPerSample kleiner als Format ist. wBitsPerSample, die gültigen Bits (die tatsächlichen PCM-Daten) werden im Container linksbündig ausgerichtet. Die nicht verwendeten Bits im geringstmöglichen Teil des Containers sollten auf 0 festgelegt werden.
Beispielcontainer beginnen und enden auf Bytegrenzen und dem Wert von Format. wBitsPerSample sollte immer ein Vielfaches von acht sein. Außerdem sollte der Wert von wValidBitsPerSample niemals den wert von Format überschreiten. wBitsPerSample. Treiber sollten Wellenformate ablehnen, die gegen diese Regeln verstoßen.
Der dwChannelMask-Member der WAVEFORMATEXTENSIBLE-Struktur enthält eine Maske, die angibt, welche Kanäle im Mehrkanalstream vorhanden sind. Das am wenigsten signifikante Bit stellt den linken Frontlautsprecher dar, das nächste Bit entspricht dem front-rechts-Lautsprecher usw. Die folgenden Flagbits sind in der Headerdatei Ksmedia.h definiert.
Sprecherposition | Flagbit |
---|---|
SPEAKER_FRONT_LEFT | 0x1 |
SPEAKER_FRONT_RIGHT | 0x2 |
SPEAKER_FRONT_CENTER | 0x4 |
SPEAKER_LOW_FREQUENCY | 0x8 |
SPEAKER_BACK_LEFT | 0x10 |
SPEAKER_BACK_RIGHT | 0x20 |
SPEAKER_FRONT_LEFT_OF_CENTER | 0x40 |
SPEAKER_FRONT_RIGHT_OF_CENTER | 0x80 |
SPEAKER_BACK_CENTER | 0x100 |
SPEAKER_SIDE_LEFT | 0x200 |
SPEAKER_SIDE_RIGHT | 0x400 |
SPEAKER_TOP_CENTER | 0x800 |
SPEAKER_TOP_FRONT_LEFT | 0x1000 |
SPEAKER_TOP_FRONT_CENTER | 0x2000 |
SPEAKER_TOP_FRONT_RIGHT | 0x4000 |
SPEAKER_TOP_BACK_LEFT | 0x8000 |
SPEAKER_TOP_BACK_CENTER | 0x10000 |
SPEAKER_TOP_BACK_RIGHT | 0x20000 |
Die in dwChannelMask angegebenen Kanäle sollten in der in der vorherigen Tabelle angegebenen Reihenfolge vorhanden sein, beginnend am oberen Rand.
Wenn z. B. nur front-links und front-center angegeben werden, sollten sich front-links und front-center in den Kanälen 0 bzw. 1 des verschachtelten Datenstroms befinden.
Ein zweites Beispiel: Wenn nChannels (im Formatelement ; siehe WAVEFORMATEX) auf 4 und dwChannelMask auf 0x00000033 festgelegt ist, sind die Audiokanäle für die Wiedergabe in den Lautsprechern vorne links, vorne rechts, hinten links und hinten rechts vorgesehen. Die Kanaldaten sollten in dieser Reihenfolge in jedem Block verschachtelt werden.
Kanalstandorte, die über die vordefinierten hinausgehen, gelten als reserviert.
Alternativ kann die Kanalmaske als eine der folgenden Konstanten angegeben werden, die in Ksmedia.h definiert sind und bitweise ORed-Kombinationen der vorherigen Flags sind, die Standardlautsprecherkonfigurationen darstellen:
KSAUDIO_SPEAKER_MONO
KSAUDIO_SPEAKER_STEREO
KSAUDIO_SPEAKER_QUAD
KSAUDIO_SPEAKER_SURROUND
KSAUDIO_SPEAKER_5POINT1
KSAUDIO_SPEAKER_7POINT1
KSAUDIO_SPEAKER_DIRECTOUT
Ein Hardwaregerät kann durch eine KSPROPERTY_AUDIO_CHANNEL_CONFIG Set-Eigenschaftsanforderung auf eine dieser Lautsprecherkonfigurationen festgelegt werden. Weitere Informationen zum Festlegen von Lautsprecherkonfigurationen finden Sie unter KSAUDIO_CHANNEL_CONFIG.
In der Regel entspricht die Anzahl in nChannels der Anzahl der in dwChannelMask festgelegten Bits. Dies ist jedoch nicht unbedingt der Fall. Wenn nChannels kleiner als die Anzahl der in dwChannelMask festgelegten Bits ist, werden die zusätzlichen (wichtigsten) Bits in dwChannelMask ignoriert. Wenn nChannels die in dwChannelMask festgelegte Anzahl von Bits überschreitet, werden die Kanäle, die keine entsprechenden Maskenbits aufweisen, keiner physischen Lautsprecherposition zugewiesen. In jeder anderen Lautsprecherkonfiguration als KSAUDIO_SPEAKER_DIRECTOUT ignoriert eine Audiosenke wie KMixer (siehe KMixer-Systemtreiber) einfach diese überschüssigen Kanäle und mischt nur die Kanäle mit entsprechenden Maskenbits.
KSAUDIO_SPEAKER_DIRECTOUT stellt eine Konfiguration ohne Lautsprecher dar und wird in Ksmedia.h als null definiert. In dieser Konfiguration rendert das Audiogerät den ersten Kanal an den ersten Port des Geräts, den zweiten Kanal an den zweiten Port des Geräts usw. Dies ermöglicht es einer Audioerstellungsanwendung, Mehrkanaldaten direkt und ohne Änderung an ein Gerät wie einen digitalen Mixer oder ein digitales Audiospeichergerät (Festplatte oder ADAT) auszugeben. Die Kanäle 0 bis 30 können beispielsweise Schlagzeug, Gitarre, Bass, Stimme usw. enthalten. Für diese Art von Audiorohdaten sind Sprecherpositionen bedeutungslos, und das Zuweisen von Sprecherpositionen zu den Eingabe- oder Ausgabestreams könnte dazu führen, dass eine Komponente wie KMixer unangemessen eingreift, indem sie eine unerwünschte Formatkonvertierung durchführt. Wenn ein Gerät die rohen Audiodatenströme nicht verarbeiten kann, sollte es eine Anforderung zum Ändern der Lautsprecherkonfiguration in KSAUDIO_SPEAKER_DIRECTOUT ablehnen. Weitere Informationen finden Sie unter DSSPEAKER_DIRECTOUT Lautsprecherkonfiguration.
Weitere Informationen zu Multichannel-Konfigurationen finden Sie im Whitepaper Multiple Channel Audio Data and WAVE Files auf der Audiotechnologie-Website .
Das SubFormat-Element enthält eine GUID, die das allgemeine Datenformat für einen Wellendatenstrom angibt. Diese GUID kann beispielsweise angeben, dass der Stream ganzzahlige PCM-Daten enthält. Die anderen Member stellen zusätzliche Informationen bereit, z. B. die Stichprobengröße und die Anzahl der Kanäle. Die Bedeutung der SubFormat-GUID ähnelt der des 16-Bit-Formattags im wFormatTag-Element der WAVEFORMATEX-Struktur.
Bevor WAVEFORMATEXTENSIBLE in Windows 98 Second Edition eingeführt wurde, war WAVEFORMATEX die bevorzugte Struktur für die Angabe von Wellenformaten. Zu diesem Zeitpunkt mussten Anbieter jedes neue Wellenformat bei Microsoft registrieren, damit dem Format ein offizielles Formattag zugewiesen werden konnte. Eine Liste der registrierten Formattags wird in der öffentlichen Headerdatei Mmreg.h angezeigt.
Mit WAVEFORMATEXTENSIBLE ist die Registrierung von Formaten nicht mehr erforderlich. Anbieter können ihren neuen Formaten nach Bedarf subFormat-GUIDs unabhängig zuweisen. Microsoft listet jedoch einige der beliebtesten SubFormat-GUIDs in der öffentlichen Headerdatei Ksmedia.h auf. Vor dem Definieren einer neuen SubFormat-GUID sollten Anbieter die Liste der KSDATAFORMAT_SUBTYPE_Xxx-Konstanten in Ksmedia.h überprüfen, um festzustellen, ob bereits eine geeignete GUID für ein bestimmtes Format definiert wurde.
Aus Gründen der Abwärtskompatibilität kann jedes Wellenformat, das von einer eigenständigen WAVEFORMATEX-Struktur angegeben werden kann, auch durch eine WAVEFORMATEXTENSIBLE-Struktur definiert werden. Daher verfügt jedes Formattag in Mmreg.h über eine entsprechende SubFormat-GUID . In der folgenden Tabelle sind einige typische Formattags und die entsprechenden SubFormat-GUIDs aufgeführt.
Formattag | SubFormat-GUID |
---|---|
WAVE_FORMAT_PCM | KSDATAFORMAT_SUBTYPE_PCM |
WAVE_FORMAT_IEEE_FLOAT | KSDATAFORMAT_SUBTYPE_IEEE_FLOAT |
WAVE_FORMAT_DRM | KSDATAFORMAT_SUBTYPE_DRM |
WAVE_FORMAT_ALAW | KSDATAFORMAT_SUBTYPE_ALAW |
WAVE_FORMAT_MULAW | KSDATAFORMAT_SUBTYPE_MULAW |
WAVE_FORMAT_ADPCM | KSDATAFORMAT_SUBTYPE_ADPCM |
Weitere Informationen finden Sie unter Konvertieren zwischen Formattags und Unterformat-GUIDs.
Da WAVEFORMATEXTENSIBLE eine erweiterte Version von WAVEFORMATEX ist, kann es zusätzliche Formate beschreiben, die nicht allein von WAVEFORMATEX beschrieben werden können. Anbieter können ihre eigenen SubFormat-GUIDs definieren, um proprietäre Formate zu identifizieren, für die keine Wellenformattags vorhanden sind.
Anforderungen
Anforderung | Wert |
---|---|
Header | ksmedia.h (einschließlich Mmreg.h, Ksmedia.h, Mmreg.h) |