Estructura WAVEFORMATEXTENSIBLE (ksmedia.h)

La estructura WAVEFORMATEXTENSIBLE especifica el formato de una secuencia de onda de audio.

Sintaxis

typedef struct {
  WAVEFORMATEX Format;
  union {
    WORD wValidBitsPerSample;
    WORD wSamplesPerBlock;
    WORD wReserved;
  } Samples;
  DWORD        dwChannelMask;
  GUID         SubFormat;
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;

Miembros

Format

Especifica el formato de datos de onda de la secuencia. Este miembro es una estructura de tipo WAVEFORMATEX. El miembro wFormat de WAVEFORMATEX debe establecerse en WAVE_FORMAT_EXTENSIBLE. El miembro wBitsPerSample de WAVEFORMATEX se define de forma inequívoca como el tamaño del contenedor para cada muestra. Los contenedores de ejemplo siempre están alineados por bytes y wBitsPerSample debe ser un múltiplo de ocho.

Samples

Samples.wValidBitsPerSample

Especifica la precisión del ejemplo en bits. El valor de este miembro debe ser menor o igual que el tamaño del contenedor especificado en el formato. Miembro wBitsPerSample . Para obtener más información, vea la sección Comentarios que se muestra más adelante.

Samples.wSamplesPerBlock

Especifica el número de muestras contenidas en un bloque comprimido. Este valor es útil para calcular los requisitos de búfer para los formatos comprimidos que tienen un número fijo de muestras dentro de cada bloque. Establezca este miembro en cero si cada bloque de datos de audio comprimido contiene un número variable de muestras. En este caso, la información sobre la estimación del búfer y la posición del búfer se deben obtener de otras maneras.

Samples.wReserved

Reservado para uso interno por sistema operativo. Inicialice en cero.

dwChannelMask

Especifica la asignación de canales en la secuencia multicanal a las posiciones del altavoz. La codificación es la misma que la usada para el miembro ActiveSpeakerPositions de la estructura KSAUDIO_CHANNEL_CONFIG . Para más información, vea la sección Comentarios.

SubFormat

Especifica el subformato. Para más información, vea la sección Comentarios.

Comentarios

WAVEFORMATEXTENSIBLE es una forma extendida de la estructura WAVEFORMATEX . WAVEFORMATEX puede describir de forma inequívoca solo un subconjunto de los formatos que puede describir WAVEFORMATEXTENSIBLE. WAVEFORMATEXTENSIBLE no está sujeto a las limitaciones de WAVEFORMATEX, que no puede especificar de forma inequívoca formatos con más de dos canales o para los que el número de bits válidos por muestra no es igual al tamaño del contenedor de muestra. Para obtener más información, vea Formatos de datos de audio y rangos de datos.

Con frecuencia, el miembro wValidBitsPerSample , que especifica la precisión de la muestra, contiene el mismo valor que format.Miembro wBitsPerSample , que especifica el tamaño del contenedor de ejemplo. Sin embargo, estos valores pueden ser diferentes. Por ejemplo, si los datos de onda se originaron en un convertidor A/D de 20 bits, wValidBitsPerSample debe ser de 20 pero formato. wBitsPerSample puede ser 24 o 32. Si wValidBitsPerSample es menor que Format. wBitsPerSample, los bits válidos (los datos pcM reales) están alineados a la izquierda dentro del contenedor. Los bits sin usar de la parte menos significativa del contenedor deben establecerse en cero.

Los contenedores de ejemplo comienzan y terminan en los límites de bytes y el valor de Format. wBitsPerSample siempre debe ser un múltiplo de ocho. Además, el valor de wValidBitsPerSample nunca debe superar el de Format. wBitsPerSample. Los controladores deben rechazar los formatos de onda que infringen estas reglas.

El miembro dwChannelMask de la estructura WAVEFORMATEXTENSIBLE contiene una máscara que indica qué canales están presentes en la secuencia multicanal. El bit menos significativo representa el altavoz frontal izquierdo, el siguiente bit corresponde al altavoz frontal derecho, etc. Los siguientes bits de marca se definen en el archivo de encabezado Ksmedia.h.

Posición del hablante Bit de marca
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

Los canales especificados en dwChannelMask deben estar presentes en el orden que se muestra en la tabla anterior, comenzando en la parte superior.

Por ejemplo, si solo se especifican front-left y front-center, entonces front-left y front-center deben estar en los canales 0 y 1, respectivamente, de la secuencia intercalada.

Como segundo ejemplo, si nChannels (en el miembro Format ; vea WAVEFORMATEX) está establecido en 4 y dwChannelMask está establecido en 0x00000033, los canales de audio están diseñados para reproducirse en los altavoces front-left, front-right, back-left y back-right. Los datos del canal se deben intercalar en ese orden dentro de cada bloque.

Las ubicaciones de canal más allá de las predefinidas se consideran reservadas.

Como alternativa, la máscara de canal se puede especificar como una de las siguientes constantes, que se definen en Ksmedia.h y son combinaciones de ORed bit a bit de las marcas anteriores que representan configuraciones de altavoces estándar:

KSAUDIO_SPEAKER_MONO

KSAUDIO_SPEAKER_STEREO

KSAUDIO_SPEAKER_QUAD

KSAUDIO_SPEAKER_SURROUND

KSAUDIO_SPEAKER_5POINT1

KSAUDIO_SPEAKER_7POINT1

KSAUDIO_SPEAKER_DIRECTOUT

Un dispositivo de hardware se puede establecer en una de estas configuraciones de altavoz mediante una solicitud de KSPROPERTY_AUDIO_CHANNEL_CONFIG set-property. Para obtener más información sobre cómo establecer configuraciones de altavoz, consulte KSAUDIO_CHANNEL_CONFIG.

Normalmente, el recuento en nChannels es igual al número de bits establecido en dwChannelMask, pero esto no es necesariamente así. Si nChannels es menor que el número de bits establecido en dwChannelMask, se omiten los bits adicionales (más significativos) de dwChannelMask . Si nChannels supera el número de bits establecidos en dwChannelMask, los canales que no tienen bits de máscara correspondientes no se asignan a ninguna posición del altavoz físico. En cualquier configuración de altavoz que no sea KSAUDIO_SPEAKER_DIRECTOUT, un receptor de audio como KMixer (consulta KMixer System Driver) simplemente omite estos canales excesivos y mezcla solo los canales que tienen bits de máscara correspondientes.

KSAUDIO_SPEAKER_DIRECTOUT representa una configuración sin altavoces y se define en Ksmedia.h como cero. En esta configuración, el dispositivo de audio representa el primer canal en el primer puerto del dispositivo, el segundo canal al segundo puerto del dispositivo, etc. Esto permite a una aplicación de creación de audio generar datos multicanal directamente y sin modificaciones en un dispositivo, como un mezclador digital o un dispositivo de almacenamiento de audio digital (disco duro o ADAT). Por ejemplo, los canales de 0 a 30 pueden contener, respectivamente, baterías, guitarra, bajo, voz, etc. Para este tipo de datos de audio sin procesar, las posiciones del hablante no tienen sentido y la asignación de posiciones del hablante a las secuencias de entrada o salida podría provocar que un componente como KMixer intervenga incorrectamente mediante la realización de una conversión de formato no deseado. Si un dispositivo no puede procesar las secuencias de audio sin procesar, debe rechazar una solicitud para cambiar su configuración del altavoz a KSAUDIO_SPEAKER_DIRECTOUT. Para obtener más información, consulte DSSPEAKER_DIRECTOUT Speaker Configuration.

Para obtener más información sobre las configuraciones multicanal, consulte las notas del producto datos de audio de varios canales y archivos WAVE en el sitio web de tecnología de audio .

El miembro SubFormat contiene un GUID que especifica el formato de datos general de una secuencia de onda. Por ejemplo, este GUID podría especificar que la secuencia contiene datos de PCM enteros. Los demás miembros proporcionan información adicional, como el tamaño de la muestra y el número de canales. El significado del GUID de SubFormat es similar al de la etiqueta de formato de 16 bits en el miembro wFormatTag de la estructura WAVEFORMATEX.

Antes de que WAVEFORMATEXTENSIBLE se introdujera en Windows 98 Second Edition, WAVEFORMATEX era la estructura preferida para especificar formatos de onda. En ese momento, los proveedores necesitaban registrar cada nuevo formato de onda con Microsoft para que se pudiera asignar una etiqueta de formato oficial al formato. Aparece una lista de etiquetas de formato registradas en el archivo de encabezado público Mmreg.h.

Con WAVEFORMATEXTENSIBLE, el registro de formatos ya no es necesario. Los proveedores pueden asignar de forma independiente GUID de SubFormat a sus nuevos formatos según sea necesario. Sin embargo, Microsoft enumera algunos de los GUID de subformato más populares en el archivo de encabezado público Ksmedia.h. Antes de definir un nuevo GUID de SubFormat , los proveedores deben comprobar la lista de constantes KSDATAFORMAT_SUBTYPE_Xxx en Ksmedia.h para ver si ya se ha definido un GUID adecuado para un formato determinado.

Por motivos de compatibilidad con versiones anteriores, cualquier formato de onda que se pueda especificar mediante una estructura WAVEFORMATEX independiente también se puede definir mediante una estructura WAVEFORMATEXTENSIBLE. Por lo tanto, todas las etiquetas de formato de Mmreg.h tienen un GUID subformato correspondiente. En la tabla siguiente se muestran algunas etiquetas de formato típicas y sus GUID de subformato correspondientes.

Etiqueta de formato GUID de subformato
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

Para obtener más información, vea Convertir entre etiquetas de formato y GUID de subformato.

Dado que WAVEFORMATEXTENSIBLE es una versión extendida de WAVEFORMATEX, puede describir formatos adicionales que no se pueden describir solo con WAVEFORMATEX. Los proveedores pueden definir sus propios GUID de subformato para identificar los formatos propietarios para los que no existen etiquetas de formato de onda.

Requisitos

Requisito Valor
Header ksmedia.h (incluya Mmreg.h, Ksmedia.h, Mmreg.h)

Consulte también

KSAUDIO_CHANNEL_CONFIG

WAVEFORMATEX