Struttura WAVEFORMATEXTENSIBLE (ksmedia.h)
La struttura WAVEFORMATEXTENSIBLE specifica il formato di un flusso d'onda audio.
Sintassi
typedef struct {
WAVEFORMATEX Format;
union {
WORD wValidBitsPerSample;
WORD wSamplesPerBlock;
WORD wReserved;
} Samples;
DWORD dwChannelMask;
GUID SubFormat;
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;
Membri
Format
Specifica il formato di dati wave del flusso. Questo membro è una struttura di tipo WAVEFORMATEX. Il membro wFormat di WAVEFORMATEX deve essere impostato su WAVE_FORMAT_EXTENSIBLE. Il wBitsPerSample membro di WAVEFORMATEX viene definito in modo univoco come dimensione del contenitore per ogni campione. I contenitori di esempio sono sempre allineati a byte e wBitsPerSample devono essere multipli di otto.
Samples
Samples.wValidBitsPerSample
Specifica la precisione del campione in bit. Il valore di questo membro deve essere minore o uguale alla dimensione del contenitore specificata nella Format.membro wBitsPerSample. Per altre informazioni, vedere la sezione Osservazioni seguente.
Samples.wSamplesPerBlock
Specifica il numero di campioni contenuti in un blocco compresso. Questo valore è utile per stimare i requisiti del buffer per i formati compressi con un numero fisso di campioni all'interno di ogni blocco. Impostare questo membro su zero se ogni blocco di dati audio compressi contiene un numero variabile di campioni. In questo caso, le informazioni sulla stima del buffer e sulla posizione del buffer devono essere ottenute in altri modi.
Samples.wReserved
Riservato per l'uso interno da parte del sistema operativo. Inizializzare su zero.
dwChannelMask
Specifica l'assegnazione dei canali nel flusso multicanale alle posizioni del parlante. La codifica è uguale a quella usata per il ActiveSpeakerPositions membro della struttura KSAUDIO_CHANNEL_CONFIG. Per altre informazioni, vedere la sezione osservazioni.
SubFormat
Specifica il formato secondario. Per altre informazioni, vedere la sezione osservazioni.
Osservazioni
WAVEFORMATEXTENSIBLE è una forma estesa della struttura WAVEFORMATEX. WAVEFORMATEX può descrivere in modo univoco solo un subset dei formati che possono essere descritti da WAVEFORMATEXTENSIBLE. WAVEFORMATEXTENSIBLE non è soggetto alle limitazioni di WAVEFORMATEX, che non è in grado di specificare in modo ambiguo i formati con più di due canali o per i quali il numero di bit validi per campione non è uguale alle dimensioni del contenitore campione. Per altre informazioni, vedere formati di dati audio e intervalli di dati.
Spesso, il membro wValidBitsPerSample, che specifica la precisione del campione, contiene lo stesso valore del Format.membro wBitsPerSample, che specifica le dimensioni del contenitore di esempio. Tuttavia, questi valori possono essere diversi. Ad esempio, se i dati delle onde provengono da un convertitore A/D a 20 bit, wValidBitsPerSample deve essere 20 ma Format. wBitsPerSample potrebbe essere 24 o 32. Se wValidBitsPerSample è minore di Format.wBitsPerSample, i bit validi (i dati PCM effettivi) vengono allineati a sinistra all'interno del contenitore. I bit inutilizzati nella parte meno significativa del contenitore devono essere impostati su zero.
I contenitori di esempio iniziano e terminano sui limiti dei byte e il valore di Format. wBitsPerSample deve essere sempre un multiplo di otto. Inoltre, il valore di wValidBitsPerSample non deve mai superare quello di Format.wBitsPerSample. I driver devono rifiutare i formati d'onda che violano queste regole.
Il membro dwChannelMask della struttura WAVEFORMATEXTENSIBLE contiene una maschera che indica quali canali sono presenti nel flusso multicanale. Il bit meno significativo rappresenta l'altoparlante anteriore sinistro, il bit successivo corrisponde all'altoparlante anteriore destro e così via. I bit di flag seguenti sono definiti nel file di intestazione Ksmedia.h.
Posizione voce | Bit flag |
---|---|
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 |
I canali specificati in dwChannelMask devono essere presenti nell'ordine indicato nella tabella precedente, a partire dalla parte superiore.
Ad esempio, se vengono specificati solo front-left e front-center, front-left e front-center devono essere rispettivamente nei canali 0 e 1 del flusso interleaved.
Come secondo esempio, se nChannels (nel membro Format; vedere WAVEFORMATEX) è impostato su 4 e dwChannelMask è impostato su 0x00000033, i canali audio sono destinati alla riproduzione negli altoparlanti front-left, front-right, back-left e back-right. I dati del canale devono essere interleaved in tale ordine all'interno di ogni blocco.
Le posizioni dei canali oltre quelle predefinite vengono considerate riservate.
In alternativa, la maschera di canale può essere specificata come una delle costanti seguenti, definite in Ksmedia.h e sono combinazioni ORed bit per bit dei flag precedenti che rappresentano configurazioni standard degli altoparlanti:
KSAUDIO_SPEAKER_MONO
KSAUDIO_SPEAKER_STEREO
KSAUDIO_SPEAKER_QUAD
KSAUDIO_SPEAKER_SURROUND
KSAUDIO_SPEAKER_5POINT1
KSAUDIO_SPEAKER_7POINT1
KSAUDIO_SPEAKER_DIRECTOUT
Un dispositivo hardware può essere impostato su una di queste configurazioni altoparlanti da una richiesta di KSPROPERTY_AUDIO_CHANNEL_CONFIG proprietà set. Per altre informazioni sull'impostazione delle configurazioni del parlante, vedere KSAUDIO_CHANNEL_CONFIG.
In genere, il conteggio in nChannels è uguale al numero di bit impostati in dwChannelMask, ma questo non è necessariamente così. Se nChannels è minore del numero di bit impostati in dwChannelMask, i bit aggiuntivi (più significativi) in dwChannelMask vengono ignorati. Se nChannels supera il numero di bit impostati in dwChannelMask, i canali senza bit di maschera corrispondenti non vengono assegnati ad alcuna posizione del parlante fisico. In qualsiasi configurazione dell'altoparlante diverso da KSAUDIO_SPEAKER_DIRECTOUT, un sink audio come KMixer (vedere KMixer System Driver) ignora semplicemente questi canali in eccesso e combina solo i canali con bit maschera corrispondenti.
KSAUDIO_SPEAKER_DIRECTOUT rappresenta una configurazione senza altoparlanti ed è definita in Ksmedia.h come zero. In questa configurazione, il dispositivo audio esegue il rendering del primo canale alla prima porta del dispositivo, al secondo canale alla seconda porta del dispositivo e così via. Ciò consente a un'applicazione di creazione audio di restituire dati multicanale direttamente e senza modifiche a un dispositivo, ad esempio un mixer digitale o un dispositivo di archiviazione audio digitale (disco rigido o ADAT). Ad esempio, i canali da 0 a 30 possono contenere, rispettivamente, batteria, chitarra, basso, voce e così via. Per questo tipo di dati audio non elaborati, le posizioni dell'altoparlante sono senza significato e l'assegnazione delle posizioni degli altoparlanti ai flussi di input o output potrebbe causare l'intervento inappropriato di un componente come KMixer eseguendo una conversione di formato indesiderata. Se un dispositivo non è in grado di elaborare i flussi audio non elaborati, deve rifiutare una richiesta di modificare la configurazione dell'altoparlante in KSAUDIO_SPEAKER_DIRECTOUT. Per altre informazioni, vedere DSSPEAKER_DIRECTOUT Configurazione voce.
Per altre informazioni sulle configurazioni multicanale, vedere il white paper intitolato Multiple Channel Audio Data and WAVE Files nel sito Web tecnologia audio.
Il membro SubFormat contiene un GUID che specifica il formato dati generale per un flusso d'onda. Ad esempio, questo GUID potrebbe specificare che il flusso contiene dati PCM interi. Gli altri membri forniscono informazioni aggiuntive, ad esempio le dimensioni del campione e il numero di canali. Il significato del GUID SubFormat è simile a quello del tag di formato a 16 bit nel membro wFormat Tag della struttura WAVEFORMATEX.
Prima dell'introduzione di WAVEFORMATEXTENSIBLE in Windows 98 Second Edition, WAVEFORMATEX era la struttura preferita per specificare i formati di onda. In quel momento, i fornitori hanno bisogno di registrare ogni nuovo formato wave con Microsoft in modo che un tag di formato ufficiale possa essere assegnato al formato. Un elenco di tag di formato registrato viene visualizzato nel file di intestazione pubblica Mmreg.h.
Con WAVEFORMATEXTENSIBLE, la registrazione dei formati non è più necessaria. I fornitori possono assegnare in modo indipendente GUID SubFormat ai nuovi formati in base alle esigenze. Tuttavia, Microsoft elenca alcuni dei GUID SubFormat più diffusi nel file di intestazione pubblica Ksmedia.h. Prima di definire un nuovo GUID di SubFormat, i fornitori devono controllare l'elenco delle costantiKSDATAFORMAT_SUBTYPE_ Xxx in Ksmedia.h per verificare se è già stato definito un GUID appropriato per un formato specifico.
Per garantire la compatibilità con le versioni precedenti, qualsiasi formato di onda che può essere specificato da una struttura WAVEFORMATEX autonoma può essere definito anche da una struttura WAVEFORMATEXTENSIBLE. Pertanto, ogni tag di formato in Mmreg.h ha un GUID SubFormat corrispondente. La tabella seguente illustra alcuni tag di formato tipici e i relativi GUID SubFormat.
Tag di formato | 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 |
Per altre informazioni, vedere Conversione tra tag di formato e GUID sottoformati.
Poiché WAVEFORMATEXTENSIBLE è una versione estesa di WAVEFORMATEX, può descrivere formati aggiuntivi che non possono essere descritti solo da WAVEFORMATEX. I fornitori sono liberi di definire i propri GUID SubFormat per identificare i formati proprietari per cui non esistono tag di formato onda.
Fabbisogno
Requisito | Valore |
---|---|
intestazione | ksmedia.h (include Mmreg.h, Ksmedia.h, Mmreg.h) |