Struttura WAVEFORMATEXTENSIBLE (ksmedia.h)
La struttura WAVEFORMATEXTENSIBLE specifica il formato di un flusso di onde audio.
Sintassi
typedef struct {
WAVEFORMATEX Format;
union {
WORD wValidBitsPerSample;
WORD wSamplesPerBlock;
WORD wReserved;
} Samples;
DWORD dwChannelMask;
GUID SubFormat;
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;
Members
Format
Specifica il formato di dati wave-data del flusso. Questo membro è una struttura di tipo WAVEFORMATEX. Il membro wFormat di WAVEFORMATEX deve essere impostato su WAVE_FORMAT_EXTENSIBLE. Il membro wBitsPerSample di WAVEFORMATEX è definito senza ambiguità come dimensione del contenitore per ogni esempio. I contenitori di esempio sono sempre allineati a byte e wBitsPerSample devono essere più di otto.
Samples
Samples.wValidBitsPerSample
Specifica la precisione dell'esempio in bit. Il valore di questo membro deve essere minore o uguale alla dimensione del contenitore specificata nel formato. membro wBitsPerSample . Per ulteriori informazioni, vedere la sezione Osservazioni successiva.
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 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 di canali nel flusso multicanale alle posizioni dell'altoparlante. La codifica è uguale a quella usata per il membro ActiveSpeakerPositions della struttura KSAUDIO_CHANNEL_CONFIG . Per altre informazioni, vedere la sezione Osservazioni .
SubFormat
Specifica il sottoformato. Per altre informazioni, vedere la sezione Osservazioni .
Commenti
WAVEFORMATEXTENSIBLE è una forma estesa della struttura WAVEFORMATEX . WAVEFORMATEX può descrivere in modo non ambiguo 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 cui il numero di bit validi per ogni campione non equivale alle dimensioni del contenitore di esempio. Per altre informazioni, vedere Formati dati audio e intervalli di dati.
Spesso, il membro wValidBitsPerSample , che specifica la precisione di esempio, contiene lo stesso valore del formato. membro wBitsPerSample , che specifica le dimensioni del contenitore di esempio. Tuttavia, questi valori possono essere diversi. Ad esempio, se i dati dell'onda hanno origine da un convertitore A/D a 20 bit, wValidBitsPerSample deve essere 20 ma Formato. wBitsPerSample potrebbe essere 24 o 32. Se wValidBitsPerSample è minore di Formato. 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 di byte e il valore di Format. wBitsPerSample deve sempre essere un multiplo di otto. Inoltre, il valore di wValidBitsPerSample non deve mai superare quello di Format. wBitsPerSample. I driver devono rifiutare i formati di 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 front-destra e così via. I bit di flag seguenti sono definiti nel file di intestazione Ksmedia.h.
Posizione altoparlante | Flag bit |
---|---|
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 visualizzato nella tabella precedente, a partire dalla parte superiore.
Ad esempio, se vengono specificati solo front-left e front-center, i canali 0 e 1, rispettivamente, del flusso interleaved devono trovarsi in canali 0 e 1.
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 in front-left, front-right, back-left e back-right altoparlanti. I dati del canale devono essere interleaved in tale ordine all'interno di ogni blocco.
Le posizioni dei canali oltre quelle predefinite sono considerate riservate.
In alternativa, la maschera del 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 dell'altoparlante:
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 set-property. Per altre informazioni sulle configurazioni dell'altoparlante, vedere KSAUDIO_CHANNEL_CONFIG.
In genere, il conteggio in nChannels equivale 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 che non hanno bit maschera corrispondenti non vengono assegnati a alcuna posizione di altoparlante 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 sulla prima porta del dispositivo, sul secondo canale sulla 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 del parlante ai flussi di input o output potrebbe causare un 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 modifica della 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 (Multiple Channel Audio Data and WAVE Files ) nel sito Web della tecnologia audio .
Il membro SubFormat contiene un GUID che specifica il formato di 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 wFormatTag della struttura WAVEFORMATEX.
Prima dell'introduzione di WAVEFORMATEXTENSIBLE in Windows 98 Second Edition, WAVEFORMATEX era la struttura preferita per specificare i formati d'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 i GUID SubFormat in modo indipendente 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 SubFormat , i fornitori devono controllare l'elenco delle costanti KSDATAFORMAT_SUBTYPE_Xxx in Ksmedia.h per verificare se un GUID appropriato è già stato definito per un formato specifico.
Per 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 | GUID di Sottoformat |
---|---|
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 di sottoformatto.
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 i quali non esistono tag in formato onda.
Requisiti
Requisito | Valore |
---|---|
Intestazione | ksmedia.h (include Mmreg.h, Ksmedia.h, Mmreg.h) |