Formatos de dispositivo

Para una aplicación de audio, una ventaja de usar una API de audio de nivel superior, como DirectSound o las funciones waveOutXxx multimedia de Windows, es que la API convierte automáticamente entre los formatos de secuencia utilizados por la aplicación y los formatos utilizados por el dispositivo de audio. Por el contrario, las API de audio principales son más restrictivas porque requieren secuencias de aplicación para usar formatos que son los mismos que, o están estrechamente relacionados, los formatos usados por el dispositivo. Por lo tanto, las aplicaciones que usan las API de audio principales para reproducir o grabar secuencias de audio pueden ser necesarias para realizar algunas o todas las conversiones entre formatos de secuencia.

Una aplicación que usa WASAPI para administrar secuencias en modo compartido puede depender del motor de audio para realizar solo conversiones de formato limitadas. El motor de audio puede convertir entre un tamaño de muestra pcM estándar utilizado por la aplicación y las muestras de punto flotante que usa el motor para su procesamiento interno. Sin embargo, el formato de una secuencia de aplicación normalmente debe tener el mismo número de canales y la misma frecuencia de muestreo que el formato de secuencia usado por el dispositivo.

Si una aplicación usa un dispositivo en modo exclusivo, la aplicación debe usar un formato de secuencia que admita explícitamente el hardware de audio. En modo exclusivo, la aplicación y el dispositivo intercambian datos de audio directamente, sin intervención del motor de audio.

Muchos dispositivos de audio admiten formatos de secuencia PCM y no PCM. Sin embargo, el motor de audio solo puede mezclar secuencias PCM. Por lo tanto, solo las secuencias en modo exclusivo pueden tener formatos que no son PCM. Además, solo se admiten formatos no PCM con velocidades de datos fijas en modo exclusivo. Un ejemplo de un formato no PCM de velocidad fija es una secuencia de audio de Windows Media Audio Professional (WMA Pro) de 48 kHz que pasa a través de un vínculo de interfaz digital Sony/Philips (S/PDIF) en formato digital sin descodificarse. Para obtener más información sobre el uso de flujos de WMA Pro a través de S/PDIF, vea Especificación de intervalos de datos de WMA Pro.

WASAPI usa una estructura WAVEFORMATEX o WAVEFORMATEXTENSIBLE para especificar un formato de secuencia. Una estructura WAVEFORMATEXTENSIBLE es eficazmente una estructura WAVEFORMATEX que se ha ampliado para describir una mayor gama de formatos. Cualquier formato que se pueda describir mediante una estructura WAVEFORMATEX independiente también se puede describir mediante una estructura WAVEFORMATEXTENSIBLE .

El primer miembro de la estructura WAVEFORMATEXTENSIBLE es una estructura WAVEFORMATEX . El contenido de una estructura WAVEFORMATEX indica si es una estructura WAVEFORMATEX independiente o una parte de una estructura WAVEFORMATEXTENSIBLE .

Una estructura WAVEFORMATEX independiente puede describir adecuadamente un formato con uno o dos canales y un tamaño de muestra que es un múltiplo de 8 bits. Por sí mismo, una estructura WAVEFORMATEX no puede especificar la asignación de canales a las posiciones del hablante. Además, aunque WAVEFORMATEX especifica el tamaño del contenedor para cada muestra de audio, no puede especificar el número de bits de precisión en una muestra (por ejemplo, 20 bits de precisión en un contenedor de 24 bits). En cambio, la estructura WAVEFORMATEXTENSIBLE puede especificar la asignación de canales a altavoces y el número de bits de precisión en cada muestra.

Para obtener más información sobre WAVEFORMATEX y WAVEFORMATEXTENSIBLE, consulte la documentación de DDK de Windows.

A partir de Windows 7, WAVEFORMATEXTENSIBLE se ha ampliado para representar formatos de dispositivo para transmitir audio codificado a través de una interfaz compatible con IEC 61937. Para obtener información sobre la nueva estructura, vea Representar formatos para transmisiones IEC 61937.

Especificar el formato de dispositivo

Los siguientes métodos WASAPI usan las estructuras WAVEFORMATEX y WAVEFORMATEXTENSIBLE para describir los formatos de secuencia:

El método GetMixFormat recupera el formato de secuencia que usa el motor de audio para su procesamiento interno de secuencias en modo compartido. El método siempre usa una estructura WAVEFORMATEXTENSIBLE , en lugar de una estructura WAVEFORMATEX independiente, para especificar el formato.

El método IsFormatSupported indica si un dispositivo de punto de conexión de audio admite un formato de secuencia determinado. El autor de la llamada debe especificar si el formato de secuencia está pensado para su uso en modo compartido o en modo exclusivo. En el caso de los formatos de modo compartido, el método consulta al motor de audio para determinar si admite el formato especificado. En el caso de los formatos de modo exclusivo, el método consulta el controlador de dispositivo. Algunos controladores de dispositivo notificarán que admiten un formato PCM de 1 canal o 2 canales si el formato se especifica mediante una estructura WAVEFORMATEX independiente, pero rechazará el mismo formato si se especifica mediante una estructura WAVEFORMATEXTENSIBLE . Para obtener resultados confiables de estos controladores, las aplicaciones en modo exclusivo deben llamar a IsFormatSupported dos veces para cada formato PCM de 1 canal o 2 canales, una llamada debe usar una estructura WAVEFORMATEX independiente para especificar el formato y la otra llamada debe usar una estructura WAVEFORMATEXTENSIBLE para especificar el mismo formato.

Una vez que una aplicación ha usado GetMixFormat o IsFormatSupported para buscar un formato adecuado para un flujo en modo compartido o modo exclusivo, la aplicación puede llamar al método Initialize para inicializar una secuencia con ese formato. Una aplicación que intenta inicializar una secuencia en modo compartido con un formato que no es idéntico al formato de combinación obtenido del método GetMixFormat , pero que tiene el mismo número de canales y la misma frecuencia de muestreo que el formato de combinación, es probable que se realice correctamente. Antes de llamar a Initialize, la aplicación puede llamar a IsFormatSupported para comprobar que Initialize aceptará el formato.

El formato de combinación que usa el motor de audio para su procesamiento interno de secuencias en modo compartido está estrechamente relacionado, pero no es necesariamente idéntico al formato de secuencia que usa el dispositivo de punto de conexión de audio en modo compartido. A través del panel de control multimedia de Windows, Mmsys.cpl, el usuario puede seleccionar el formato de secuencia que usará un dispositivo de punto de conexión de audio cuando funcione en modo compartido. Los pasos son los siguientes:

  1. Para ejecutar Mmsys.cpl, abra una ventana del símbolo del sistema y escriba el siguiente comando:

    mmsys.cplde control

    Como alternativa, puede ejecutar Mmsys.cpl haciendo clic con el botón derecho en el icono del altavoz en el área de notificación, que se encuentra en el lado derecho de la barra de tareas y seleccionando Dispositivos de reproducción o Dispositivos de grabación.

  2. Una vez que se abra la ventana de Mmsys.cpl, seleccione un dispositivo en la lista de dispositivos de reproducción o en la lista de dispositivos de grabación y haga clic en Propiedades.

  3. Cuando se abra la ventana de propiedades, haga clic en Avanzadas y seleccione un formato de la lista de formatos disponibles en el cuadro con la etiqueta Formato predeterminado.

Por ejemplo, supongamos que el usuario selecciona el siguiente formato predeterminado en la lista de formatos disponibles para un dispositivo de reproducción:

2 canales, 16 bits, 44100 Hz (calidad de CD)

Este es el formato que el dispositivo usará posteriormente cuando funcione en modo compartido. En Windows Vista, el motor de audio usará una versión ligeramente modificada de este formato para su procesamiento interno de secuencias en modo compartido. El motor de audio usará un formato con el mismo número de canales (dos) y la misma frecuencia de muestreo (44100 Hz), pero convertirá muestras en números de punto flotante antes de procesarlos. El motor de audio convertirá las muestras de punto flotante en la combinación de salida en enteros de 16 bits antes de reproducirlas a través del dispositivo.

Una aplicación puede consultar la propiedad PKEY_AudioEngine_DeviceFormat de un dispositivo de punto de conexión de audio para obtener el formato de modo compartido que el usuario ha seleccionado para el dispositivo. Para obtener información sobre cómo consultar las propiedades de un dispositivo, consulte Propiedades del dispositivo.

Algunas aplicaciones pueden encontrar el formato especificado por la propiedad PKEY_AudioEngine_DeviceFormat de un dispositivo para ser un formato adecuado para abrir una secuencia en modo exclusivo en el dispositivo. Otras aplicaciones que administran flujos en modo exclusivo pueden tener requisitos adicionales que exigen una negociación de formato compleja con el dispositivo. Normalmente, una de estas aplicaciones construye una lista de formatos adecuados, con los formatos preferidos al principio de la lista. A continuación, la aplicación llama iterativamente a IsFormatSupported con cada formato sucesivo de la lista, comenzando al principio de la lista, hasta que encuentre un formato que admita el dispositivo.

Dispositivos de punto de conexión de audio