Descripteurs Wave-Format extensibles

La figure suivante montre le descripteur de format de données pour un flux audio wave.

Diagramme illustrant un descripteur au format vague pour un flux audio.

Comme indiqué dans la figure, la quantité d’informations de format supplémentaires suivant la structure KSDATAFORMAT varie en fonction du format de données.

Les systèmes audio utilisent ce type de descripteur de format de plusieurs manières :

  • Un descripteur de format comme celui illustré dans la figure précédente est passé en tant que paramètre d’appel à la méthode NewStream d’un pilote miniport (par exemple, consultez IMiniportWaveCyclic ::NewStream).

  • Le paramètre ResultantFormat de la méthode IMiniport ::D ataRangeIntersection pointe vers une mémoire tampon dans laquelle la méthode écrit un descripteur de format comme celui illustré dans la figure précédente.

  • La KSPROPERTY_PIN_DATAINTERSECTION demande get-property récupère un descripteur de format comme celui illustré dans la figure précédente.

  • La KSPROPERTY_PIN_PROPOSEDATAFORMAT demande set-property accepte un descripteur de format comme celui illustré dans la figure précédente.

  • Un format similaire est utilisé pour le paramètre d’appel Connect de la fonction KsCreatePin. Ce paramètre pointe vers la structure KSPIN_CONNECT au début d’une mémoire tampon qui contient également un descripteur de format. Le descripteur de format, qui suit immédiatement la structure KSPIN_CONNECT, commence par une structure KSDATAFORMAT comme celle illustrée dans la figure précédente.

Les informations de format qui suivent la structure KSDATAFORMAT doivent être une structure WAVEFORMATEXTENSIBLE . WAVEFORMATEXTENSIBLE est une version étendue de WAVEFORMATEX qui peut décrire un plus large éventail de formats que WAVEFORMATEX.

WAVEFORMAT est obsolète et n’est pas pris en charge par le sous-système audio WDM dans n’importe quelle version de Microsoft Windows. La structure PCMWAVEFORMAT est une version étendue de WAVEFORMAT qui est également obsolète.

Les quatre structures de format vague (WAVEFORMAT, PCMWAVEFORMAT, WAVEFORMATEX et WAVEFORMATEXTENSIBLE) commencent toutes par les cinq mêmes membres, en commençant par wFormatTag. La figure précédente montre ces quatre structures superposées les unes aux autres pour mettre en évidence les parties des structures qui sont identiques.

WAVEFORMATEXTENSIBLE étend WAVEFORMATEX en ajoutant trois membres, en commençant par Samples.wValidBitsPerSample. (Les exemples sont une union dont l’autre membre, wValidSamplesPerBlock, est utilisé au lieu de wValidBitsPerSample pour certains formats compressés.) Le membre wFormatTag , qui suit immédiatement la fin de la structure KSDATAFORMAT dans la mémoire tampon, spécifie le type d’informations de format suivant KSDATAFORMAT.

Contrairement à WAVEFORMATEX, WAVEFORMATEXTENSIBLE peut effectuer les opérations suivantes :

  1. Spécifiez le nombre de bits par exemple séparément de la taille de l’exemple de conteneur. Par exemple, un exemple 20 bits peut être stocké justifié à gauche dans un conteneur de trois octets. WAVEFORMATEX, qui ne parvient pas à distinguer le nombre de bits de données par échantillon de la taille du conteneur de l’exemple, ne peut pas décrire un tel format sans ambiguïté.

  2. Attribuez des emplacements d’orateur spécifiques aux canaux audio dans les flux multicanal. WAVEFORMATEX ne dispose pas de cette fonctionnalité et ne peut prendre en charge que les flux stéréo mono et (deux canaux).

Utilisation héritée de WAVEFORMATEX

Tout format décrit par WAVEFORMATEX peut également être décrit par WAVEFORMATEXTENSIBLE. Pour plus d’informations sur la conversion d’une structure WAVEFORMATEX en WAVEFORMATEXTENSIBLE, consultez Conversion entre des balises de format et des GUID de sous-format.

WAVEFORMATEX est suffisant pour décrire des formats avec des exemples de tailles de 8 ou 16 bits, mais WAVEFORMATEXTENSIBLE est nécessaire pour décrire correctement les formats avec une précision d’exemple supérieure à 16 bits. Voici deux exemples :

  • Un flux avec un exemple de précision de 24 bits peut utiliser une taille de conteneur de 32 bits pour un traitement efficace, mais peut être converti pour utiliser un conteneur 24 bits afin d’améliorer l’efficacité du stockage sans perte de données.

  • Lors du traitement d’un flux avec des exemples de données 24 bits, un appareil de rendu qui fournit seulement 20 bits de précision peut utiliser le dithering pour améliorer la fidélité de son signal de sortie. Toutefois, le dithering nécessite un temps de traitement supplémentaire, et si le flux d’origine est précis sur seulement 20 bits, le traitement supplémentaire n’est pas nécessaire.

Dans ces deux exemples, la préservation de la qualité du signal tout en faisant le bon compromis entre le traitement et l’efficacité du stockage n’est possible que si la précision de l’échantillon et la taille du conteneur sont connues.

Si un format simple peut être décrit sans ambiguïté par une structure WAVEFORMATEX ou WAVEFORMATEXTENSIBLE, un pilote audio a la possibilité de sélectionner l’une ou l’autre structure pour décrire le format. Toutefois, les pilotes audio ont généralement utilisé WAVEFORMATEX pour spécifier des formats PCM stéréo mono et (deux canaux) avec des exemples 8 bits ou 16 bits, et certaines applications plus anciennes peuvent s’attendre à ce que tous les pilotes audio utilisent WAVEFORMATEX pour spécifier ces formats.

Si un pilote prend en charge un format audio qui peut être spécifié sans ambiguïté sous la forme d’une structure WAVEFORMATEX ou WAVEFORMATEXTENSIBLE, le pilote doit reconnaître le format, quelle que soit la structure qu’une application cliente ou un composant utilise pour spécifier la structure. Par exemple, si un périphérique audio prend en charge un format PCM stéréo 44,1 kHz 16 bits, le gestionnaire de propriétés KSPROPERTY_PIN_PROPOSEDATAFORMAT du pilote miniport et son implémentation de la méthode NewStream doivent accepter ce format, que le format soit spécifié en tant que structure WAVEFORMATEX ou WAVEFORMATEXTENSIBLE.

Pour simplifier le traitement des données de format, les pilotes utilisent généralement des structures WAVEFORMATEXTENSIBLE pour représenter les formats en interne. Cette approche peut nécessiter la conversion d’une structure WAVEFORMATEX d’entrée en une représentation WAVEFORMATEXTENSIBLE interne, ou la conversion d’une représentation WAVEFORMATEXSIBLE interne en une structure WAVEFORMATEX de sortie.

Dans WAVEFORMATEXTENSIBLE, dwBitsPerSample correspond à la taille du conteneur et wValidBitsPerSample est le nombre de bits de données valides par exemple. Les conteneurs sont toujours alignés sur des octets dans la mémoire, et la taille du conteneur doit être spécifiée sous la forme d’un multiple de huit bits.