Compartir a través de


Componentes Wave y DirectSound

Los programas de aplicación se basan en una combinación de componentes en modo de usuario y en modo kernel para capturar (entrada) y representar (salida) flujos de onda. Una secuencia de onda es una secuencia de audio digital cuyo formato de datos se describe mediante una estructura WAVEFORMATEX o WAVEFORMATEXTENSIBLE .

Una aplicación puede usar cualquiera de las siguientes interfaces de software para la representación y captura de oleadas:

  • Funciones waveOutXxx y waveInXxx de Microsoft Windows Multimedia

  • API de DirectSound y DirectSoundCapture

El comportamiento de las funciones waveOutXxx y waveInXxx se basa en las funcionalidades de los dispositivos y controladores de onda heredados. A partir de Windows 98, el controlador del sistema WDMAud traduce llamadas a estas funciones en comandos a controladores de audio WDM. Sin embargo, al simular el comportamiento de software y hardware más antiguos, las funciones waveOutXxx sacrifican los efectos de sonido 3D y la aceleración de hardware que ahora están disponibles a través de directSound API. Para obtener más información sobre DirectSound y las funciones de onda multimedia de Windows, consulte la documentación de Microsoft Windows SDK.

DirectSound y las funciones de onda multimedia de Windows son clientes del controlador del sistema SysAudio, que compila los gráficos de filtros de audio que procesan las secuencias de onda y DirectSound. La creación de grafos es transparente para las aplicaciones que usan estas interfaces de software.

Componentes de onda

En la ilustración siguiente se muestran los componentes en modo de usuario y modo kernel que una aplicación de onda usa para representar o capturar una secuencia de audio digital formada por datos PCM de onda.

Diagrama que ilustra los componentes en modo de usuario y en modo kernel para la representación y captura de oleadas.

Los componentes de representación aparecen en el lado izquierdo de la ilustración anterior y los componentes de captura aparecen a la derecha. Los cuadros que representan el controlador de minipuerto de onda se han oscurecido para indicar que se trata de componentes proporcionados por el proveedor. Los demás componentes de la figura son suministrados por el sistema.

En la parte superior izquierda de la figura, la aplicación de representación de ondas (o "wave-out") interactúa con los controladores de audio WDM a través de las funciones waveOutXxx, que se implementan en el componente de sistema WinMM en modo usuario, Winmm.dll. La aplicación lee bloques de muestras de audio de onda de un archivo y llama a la función waveOutWrite para representarlos.

WDMAud, que consta de componentes en modo de usuario y en modo kernel (Wdmaud.drv y Wdmaud.sys), almacena en búfer los datos de onda de la llamada waveOutWrite y genera la secuencia de onda en el controlador del sistema KMixer, que aparece debajo de WDMAud en la ilustración.

KMixer es un componente del sistema que recibe secuencias PCM de onda de uno o varios orígenes y los mezcla para formar un único flujo de salida, que también está en formato PCM de onda.

KMixer genera una secuencia de onda en un dispositivo WaveCyclic o WavePci, cuyos controladores de puerto y minipuerto aparecen debajo de KMixer en el lado izquierdo de la figura anterior. El controlador de miniporte se enlaza al controlador de puerto para formar el filtro de onda que representa el dispositivo de representación de audio subyacente. Un dispositivo de representación típico genera una señal analógica que controla un conjunto de altavoces o una unidad de audio externa. Un dispositivo de representación también podría generar audio digital a través de un conector S/PDIF. Para obtener más información sobre WaveCíclico y WavePci, vea Filtros de onda.

Como alternativa, KMixer puede pasar su flujo de salida a un dispositivo de audio USB, que está controlado por el controlador del sistema de clase USBAudio (no se muestra en la figura), en lugar de un dispositivo WaveCíclico o WavePci.

Un controlador de adaptador crea una instancia de un controlador de puerto WaveCíclico o WavePci llamando a PcNewPort con un valor GUID de CLSID_PortWaveCyclic o CLSID_PortWavePci, respectivamente.

En el lado derecho de la ilustración anterior se muestran los componentes necesarios para admitir una aplicación que captura los datos de onda en un archivo. La aplicación wave-capture (o "wave-in") se comunica con los controladores de audio WDM a través de las funciones waveInXxx, que se implementan en el componente del sistema WinMM.

En la esquina inferior derecha de la figura, el dispositivo de captura de onda se controla mediante minipuerto de onda y controladores de puerto. Los controladores de puerto y minipuerto, que pueden ser de tipo WaveCyclic o WavePci, se combinan para crear un filtro de audio que representa el dispositivo de captura. Este dispositivo normalmente captura una señal analógica de un micrófono u otra fuente de audio y la convierte en una secuencia PCM de onda. El dispositivo también puede introducir una secuencia de audio digital a través de un conector S/PDIF.

El controlador de puerto de ondas entrega su flujo de ondas a KMixer o directamente a WDMAud. El flujo debe pasar a través de KMixer si necesita una conversión de la frecuencia de muestreo antes de que WDMAud lo reciba. Un sistema que realiza la representación y captura simultáneas de secuencias de audio podría requerir dos instancias de KMixer, como se muestra en la ilustración. Tenga en cuenta que SysAudio crea automáticamente estas instancias a medida que son necesarias.

Como alternativa, el origen de la secuencia de onda capturada puede ser un dispositivo de audio USB en lugar de un dispositivo WaveCíclico o WavePci. En este caso, el controlador USBAudio (no se muestra en la figura) pasa la secuencia a KMixer.

Independientemente de si el flujo de onda lo captura un dispositivo USB o un dispositivo WaveCíclico o WavePci, KMixer realiza la conversión de frecuencia de muestreo en la secuencia, si es necesario, pero no se mezcla con otras secuencias. KMixer genera la secuencia resultante para Wdmaud.sys, la parte en modo kernel del controlador del sistema WDMAud. La mitad en modo de usuario, Wdmaud.drv, envía la secuencia de audio al programa de aplicación a través de las funciones waveInXxx, que se implementan en Winmm.dll. Por último, en la parte superior de la ilustración, la aplicación de captura de ondas escribe los datos de onda en un archivo.

En el momento en que la aplicación de captura de ondas llama a la función waveInOpen para abrir la secuencia de captura, pasa un puntero a su rutina de devolución de llamada. Cuando se produce un evento de captura de ondas, el sistema operativo llama a la rutina callback con un búfer que contiene el siguiente bloque de muestras de onda del dispositivo de captura. En respuesta al callback, la aplicación escribe el siguiente bloque de datos de onda en el archivo.

Componentes de DirectSound

En la ilustración siguiente se muestran los componentes en modo de usuario y en modo kernel que usa un programa de aplicación directSound para representar o capturar datos de onda.

Diagrama que ilustra los componentes en modo de usuario y en modo kernel para la representación y captura de DirectSound.

Los componentes de representación se muestran en la mitad izquierda de la ilustración anterior y los componentes de captura aparecen a la derecha. Los controladores de miniporte de onda se muestran como cuadros oscuros para indicar que son componentes proporcionados por el proveedor. Los demás componentes de la figura son suministrados por el sistema.

En la parte superior izquierda de la ilustración, una aplicación directSound carga datos de onda de un archivo a un búfer de sonido que administra el componente del sistema DirectSound en modo de usuario (Dsound.dll). Este componente envía una secuencia de onda a un dispositivo WaveCíclico o WavePci, cuyos controladores de puerto y miniporto aparecen en la parte inferior izquierda de la ilustración. Si hay un mezclador por hardware disponible en el dispositivo, la secuencia pasa directamente al controlador de puerto de audio, omitiendo KMixer. De lo contrario, el flujo primero pasa a través de KMixer, que lo mezcla con cualquier otro flujo que se esté reproduciendo simultáneamente. KMixer envía la secuencia mezclada al controlador de puertos.

Como antes, el controlador de miniporte se enlaza al controlador de puerto para formar el filtro de onda que representa el dispositivo de representación de audio subyacente. Este dispositivo podría reproducir la secuencia a través de un conjunto de altavoces, por ejemplo.

Como alternativa, el flujo de onda se puede representar mediante un dispositivo de audio USB en lugar de un dispositivo WaveCíclico o WavePci. En este caso, la secuencia no puede omitir KMixer; el controlador de sistema de la clase USBAudio (no se muestra en la figura) siempre pasa la secuencia a KMixer.

En el lado derecho de la ilustración anterior se muestran los componentes que admiten una aplicación DirectSoundCapture. La aplicación registra los datos de onda que recibe de un dispositivo de captura WaveCíclico o WavePci. Este dispositivo convierte una señal analógica de un micrófono, por ejemplo, en una secuencia de onda. El puerto de ondas del dispositivo y los controladores miniport aparecen en la esquina inferior derecha de la figura. Como se muestra en la ilustración, el controlador de puerto recibe como entrada el flujo del controlador de miniport y lo envía directamente al componente DirectSound modo usuario, Dsound.dll, o indirectamente a través de KMixer. Esto depende de si hay disponible un pin de captura de hardware en el dispositivo de captura.

Como alternativa, el origen de la secuencia de onda capturada puede ser un dispositivo de audio USB. En este caso, la secuencia no puede omitir KMixer; El controlador USBAudio (no se muestra en la figura) siempre pasa la secuencia a KMixer.

Si KMixer se inserta en la ruta de la secuencia de captura, realiza la conversión de frecuencia de muestreo en la secuencia, si es necesario, pero no se mezcla con otras secuencias.

En la esquina superior derecha de la ilustración anterior, la aplicación lee los datos de onda del búfer directSoundCapture y lo escribe en el archivo.