Share via


Descrittori estendibili Wave-Format

Nella figura seguente viene illustrato il descrittore di formato dati per un flusso audio wave.

Diagramma che illustra un descrittore di formato wave per un flusso audio.

Come indicato nella figura, la quantità di informazioni di formato aggiuntive che seguono la struttura KSDATAFORMAT varia a seconda del formato dati.

I sistemi audio usano questo tipo di descrittore di formato in diversi modi:

  • Un descrittore di formato simile a quello illustrato nella figura precedente viene passato come parametro di chiamata a un metodo NewStream del driver miniport( ad esempio, vedere IMiniportWaveCyclic::NewStream).

  • Il parametro ResultantFormat del metodo IMiniport::D ataRangeIntersection punta a un buffer in cui il metodo scrive un descrittore di formato simile a quello illustrato nella figura precedente.

  • La KSPROPERTY_PIN_DATAINTERSECTION richiesta get-property recupera un descrittore di formato simile a quello mostrato nella figura precedente.

  • La KSPROPERTY_PIN_PROPOSEDATAFORMAT richiesta set-property accetta un descrittore di formato simile a quello mostrato nella figura precedente.

  • Viene usato un formato simile per il parametro Connect della funzione KsCreatePin. Questo parametro punta alla struttura KSPIN_CONNECT all'inizio di un buffer che contiene anche un descrittore di formato. Il descrittore di formato, che segue immediatamente la struttura KSPIN_CONNECT, inizia con una struttura KSDATAFORMAT come quella illustrata nella figura precedente.

Le informazioni di formato che seguono la struttura KSDATAFORMAT devono essere una struttura WAVEFORMATEXTENSIBLE . WAVEFORMATEXTENSIBLE è una versione estesa di WAVEFORMATEX che può descrivere un'ampia gamma di formati rispetto a WAVEFORMATEX.

WAVEFORMAT è obsoleto e non è supportato dal sottosistema audio WDM in qualsiasi versione di Microsoft Windows. La struttura PCMWAVEFORMAT è una versione estesa di WAVEFORMAT obsoleta.

Le quattro strutture in formato wave--WAVEFORMAT, PCMWAVEFORMAT, WAVEFORMATEX e WAVEFORMATEXTENSIBLE-all iniziano con gli stessi cinque membri, a partire da wFormatTag. La figura precedente mostra queste quattro strutture sovrapposte tra loro per evidenziare le parti delle strutture identiche.

WAVEFORMATEXTENSIBLE estende WAVEFORMATEX aggiungendo tre membri, a partire da Samples.wValidBitsPerSample. Gli esempi sono un'unione il cui altro membro, wValidSamplesPerBlock, viene usato anziché wValidBitsPerSample per alcuni formati compressi. Il membro wFormatTag, che segue immediatamente la fine della struttura KSDATAFORMAT nel buffer, specifica quale tipo di informazioni di formato segue KSDATAFORMAT.

A differenza di WAVEFORMATEX, WAVEFORMATEXTENSIBLE può eseguire le operazioni seguenti:

  1. Specificare il numero di bit per esempio separatamente dalle dimensioni del contenitore di esempio. Ad esempio, un esempio a 20 bit può essere archiviato a sinistra giustificato all'interno di un contenitore a tre byte. WAVEFORMATEX, che non riesce a distinguere il numero di bit di dati per campione dalle dimensioni del contenitore di esempio, non è in grado di descrivere tale formato in modo ambiguo.

  2. Assegnare posizioni altoparlanti specifiche ai canali audio nei flussi multicanale. WAVEFORMATEX non dispone di questa funzionalità e può supportare adeguatamente solo flussi stereo mono e (a due canali).

Uso legacy di WAVEFORMATEX

Qualsiasi formato descritto da WAVEFORMATEX può essere descritto anche da WAVEFORMATEXTENSIBLE. Per informazioni sulla conversione di una struttura WAVEFORMATEX in WAVEFORMATEXTENSIBLE, vedere Conversione tra tag di formato e GUID sottoformato.

WAVEFORMATEX è sufficiente per descrivere i formati con dimensioni di esempio di 8 o 16 bit, ma WAVEFORMATEXTENSIBLE è necessario per descrivere adeguatamente i formati con una precisione di esempio superiore a 16 bit. Di seguito sono riportati due esempi:

  • Un flusso con precisione di esempio di 24 bit può usare una dimensione del contenitore a 32 bit per l'elaborazione efficiente, ma può essere convertito in un contenitore a 24 bit per migliorare l'efficienza di archiviazione senza perdita di dati.

  • Quando si elabora un flusso con dati di esempio a 24 bit, un dispositivo di rendering che fornisce solo 20 bit di precisione può usare dithering per migliorare la fedeltà del segnale di output. Tuttavia, il dithering richiede tempo di elaborazione aggiuntivo e, se il flusso originale è accurato solo a 20 bit, l'elaborazione aggiuntiva non è necessaria.

In entrambi questi esempi, mantenere la qualità del segnale mantenendo la qualità del segnale giusto tra l'elaborazione e l'efficienza di archiviazione è possibile solo se sia la precisione del campione che le dimensioni del contenitore sono note.

Se un formato semplice può essere descritto in modo non ambiguo da una struttura WAVEFORMATEX o da una struttura WAVEFORMATEXTENSIBLE, un driver audio ha la possibilità di selezionare una struttura per descrivere il formato. Tuttavia, i driver audio hanno in genere usato WAVEFORMATEX per specificare i formati STEREO mono e (a due canali) stereo PCM con esempi a 8 bit o a 16 bit e alcune applicazioni meno recenti potrebbero aspettarsi che tutti i driver audio usino WAVEFORMATEX per specificare questi formati.

Se un driver supporta un formato audio che può essere specificato in modo non ambiguo come una struttura WAVEFORMATEX o WAVEFORMATEXTENSIBLE, il driver deve riconoscere il formato indipendentemente dalla quale delle due strutture usa un'applicazione client o un componente per specificare la struttura. Ad esempio, se un dispositivo audio supporta un formato 44,1 kHz, 16 bit, formato PCM stereo, il gestore delle proprietà KSPROPERTY_PIN_PROPOSEDATAFORMAT del driver miniport e l'implementazione del metodo NewStream devono accettare tale formato indipendentemente dal fatto che il formato sia specificato come struttura WAVEFORMATEX o WAVEFORMATEXTENSIBLE.

Per semplificare l'elaborazione dei dati di formato, i driver usano in genere strutture WAVEFORMATEXTENSIBLE per rappresentare internamente i formati. Questo approccio potrebbe richiedere la conversione di una struttura WAVEFORMATEX di input in una rappresentazione WAVEFORMATEXTENSIBLE interna o la conversione di una rappresentazione WAVEFORMATEXTENSIBLE interna in una struttura WAVEFORMATEX di output.

In WAVEFORMATEXTENSIBLE, dwBitsPerSample è la dimensione del contenitore e wValidBitsPerSample è il numero di bit di dati validi per esempio. I contenitori sono sempre allineati in memoria e le dimensioni del contenitore devono essere specificate come più di otto bit.