Filtros de onda
Los filtros de onda representan dispositivos que representan o capturan datos de audio digital con formato de onda. Las aplicaciones suelen acceder a las funcionalidades de estos dispositivos a través de directSound API o a través de las funciones waveOutXxx y waveInXxx de Microsoft Windows multimedia. Para obtener información sobre los formatos de onda que los controladores de audio WDM pueden admitir, consulte WAVEFORMATEX y WAVEFORMATEXTENSIBLE.
Un filtro de representación de onda recibe como entrada una secuencia de audio digital de onda y genera una señal de audio analógica (a un conjunto de altavoces o mezclador externo) o una secuencia de audio digital (a un conector S/PDIF, por ejemplo).
Un filtro de captura de onda recibe como entrada una señal de audio analógica (desde un micrófono o una toma de entrada) o una secuencia digital (desde un conector S/PDIF, por ejemplo). El mismo filtro genera una secuencia de onda que contiene datos de audio digital.
Un solo filtro de onda puede realizar la representación y la captura simultáneamente. Este tipo de filtro podría representar, por ejemplo, un dispositivo de audio que puede reproducir audio a través de un conjunto de altavoces y grabar audio a través de un micrófono al mismo tiempo. Como alternativa, el hardware de representación de ondas y captura de onda se puede representar como filtros de onda independientes, como se describe en Subdevices de audio dinámico.
Un controlador de adaptador de audio forma un filtro de onda enlazando un controlador de miniporte de onda, que el proveedor de hardware implementa como parte del controlador del adaptador, con un controlador de puerto de onda, que el sistema implementa. El controlador de minipuerto controla todas las operaciones específicas del hardware para el filtro de onda y el controlador de puerto administra todas las funciones genéricas de filtro de onda.
El controlador del sistema PortCls (Portcls.sys) implementa tres controladores de puerto de onda: WaveRT, WavePci y WaveCíclica.
Los tres tipos de filtro de onda funcionan de la siguiente manera:
Un filtro WaveRT asigna un búfer para los datos de onda y hace que ese búfer sea accesible directamente para el cliente en modo de usuario. El búfer puede constar de bloques contiguos o no contiguas de memoria, en función de las funcionalidades de hardware del dispositivo de onda. El cliente accede al búfer como un bloque contiguo de memoria virtual. El búfer es cíclico, lo que significa que cuando el puntero de lectura (para representación) o escritura del dispositivo (para la captura) llega al final del búfer, se ajusta automáticamente al principio del búfer.
Un filtro WavePci accede directamente al búfer del cliente. Aunque el cliente accede al búfer como un único bloque contiguo de memoria virtual, el filtro WavePci debe tener acceso al búfer como una serie de bloques de memoria posiblemente no contiguos. Los bloques que contienen partes sucesivas de la representación o secuencia de captura se ponen en cola en el dispositivo. Cuando el puntero de lectura o escritura del dispositivo llega al final de un bloque, se mueve al principio del siguiente bloque de la cola.
Un filtro WaveCíclico asigna un búfer que consta de un único bloque contiguo de memoria para su uso como salida (para representación) o búfer de entrada (para captura). Este búfer es cíclico. Dado que el búfer no es accesible directamente para el cliente, el controlador debe copiar datos entre el búfer cíclico del controlador y el búfer en modo de usuario del cliente.
WaveRT es preferible a WavePci y WaveCíclica. WavePci y WaveCíclica se usaron con versiones anteriores de Windows.
Un filtro WaveRT puede representar un dispositivo de audio que reside en un bus del sistema, como PCI o PCI Express. La principal ventaja de un filtro WaveRT sobre un filtro WaveCíclica o WavePci es que un filtro WaveRT permite a un cliente en modo de usuario intercambiar datos de audio directamente con el hardware de audio. En cambio, los filtros WaveCíclico y WavePci requieren una intervención periódica del software por parte del controlador, lo que aumenta la latencia de la secuencia de audio. Además, los dispositivos de audio con y sin funcionalidades de dispersión y recopilación de DMA se pueden representar como filtros WaveRT. Para obtener más información, consulte las notas del producto A Wave Port Driver for Real-Time Audio Streaming .
Filtros waveRT
Un filtro WaveRT se implementa como un par de controladores port/miniport. En Windows Vista y versiones posteriores, un generador de filtros waveRT crea un filtro WaveRT de la siguiente manera:
Crea una instancia de un objeto de controlador de miniport de WaveRT.
Crea una instancia de un objeto de controlador de puerto waveRT llamando a PcNewPort con el valor GUID CLSID_PortWaveRT.
Llama al método IPort::Init del controlador de puerto para enlazar el controlador de miniporte al controlador de puerto.
El ejemplo de código de Creación de subdispositivos ilustra este proceso. Los controladores de puerto y minipuerto se comunican entre sí a través de sus interfaces IPortWaveRT e IMiniportWaveRT .
Para obtener más información, consulte las notas del producto A Wave Port Driver for Real-Time Audio Streaming .
Información para versiones anteriores de Windows
Información wavecíclica para versiones anteriores de Windows
Un filtro WaveCíclico puede representar un dispositivo de audio que se conecta a un bus del sistema, como ISA, PCI, PCI Express o PCMCIA. Como el nombre "WavePci" implica, un filtro WavePci suele representar un dispositivo que se conecta a un bus PCI, aunque, en principio, un dispositivo WavePci podría conectarse a un bus ISA, por ejemplo. A diferencia de los dispositivos más sencillos compatibles con WaveCíclica, un dispositivo compatible con WavePci debe tener funcionalidades de dispersión y recopilación de DMA. Un dispositivo de audio que reside en el bus PCI, pero que carece de dispersión o recopilación de DMA se puede representar como un filtro WaveCíclico, pero no como filtro WavePci.
Información de WavePci para versiones anteriores de Windows
Un dispositivo WavePci puede realizar transferencias de DMA de dispersión y recopilación a o desde búferes que se pueden ubicar en direcciones de memoria arbitrarias y que comienzan y terminan con alineaciones arbitrarias de bytes. En cambio, el hardware DMA para un dispositivo WaveCíclico solo requiere la capacidad de mover datos a un solo búfer al que asigna el controlador de miniporte del dispositivo o desde él. Un controlador de miniporte WaveCíclico es libre de asignar un búfer cíclico que cumpla las capacidades limitadas de su canal DMA. Por ejemplo, el canal DMA para un dispositivo wavecíclico típico podría requerir un búfer que satisfaga las siguientes restricciones:
El búfer se encuentra en una determinada región del espacio de direcciones físicos.
El búfer es contiguo en físico, así como en el espacio de direcciones virtuales.
El búfer comienza y termina en límites de cuatro o ocho bytes.
Sin embargo, a cambio de esta simplicidad, un dispositivo WaveCíclico debe basarse en la copia de software de datos en o desde el búfer cíclico, mientras que un dispositivo WavePci se basa en las capacidades de dispersión y recopilación de su hardware DMA para evitar dicha copia. Los IRP que entregan datos de audio de onda a un dispositivo de representación o recuperan datos de un dispositivo de captura van acompañados de búferes de datos y cada uno de estos búferes contiene una parte de la secuencia de audio que se está representando o capturando. Un dispositivo WavePci puede acceder a estos búferes directamente a través de su motor DMA de dispersión o recopilación, mientras que un dispositivo WaveCíclico requiere que los datos se copien en su búfer cíclico del IRP o viceversa.
Filtros WavePci
Nota: Información de WavePci para versiones anteriores de Windows
Un filtro WavePci se implementa como un par de controladores port/miniport. Un generador de filtros WavePci crea un filtro WavePci de la siguiente manera:
Crea una instancia de un objeto de controlador wavePci miniport.
Crea una instancia de un objeto de controlador de puerto WavePci llamando a PcNewPort con el valor GUID CLSID_PortWavePci.
Llama al método IPort::Init del controlador de puerto para enlazar el controlador de miniporte al controlador de puerto.
El ejemplo de código de Creación de subdispositivos ilustra este proceso. Los controladores de puerto y minipuerto se comunican entre sí a través de sus interfaces IPortWavePci e IMiniportWavePci .
Para obtener más información, consulte Problemas de implementación para dispositivos WavePci.
Filtros wavecíclicos
Nota:
Microsoft admite un entorno diverso e inclusivo. Este artículo contiene referencias a la terminología que la guía de estilo de Microsoft para la comunicación sin sesgo reconoce como excluyente. La palabra o frase se usa en este artículo para la coherencia porque actualmente aparece en el software. Cuando el software se actualice para quitar el idioma, este artículo se actualizará para que esté en alineación.
Nota: Información wavecíclica para versiones anteriores de Windows
Un filtro WaveCíclico se implementa como un par de controladores de puerto/minipuerto. Un generador de filtros WaveCíclico crea un filtro WaveCíclico de la siguiente manera:
Crea una instancia de un objeto de controlador de miniporte WaveCíclico.
Crea una instancia de un objeto de controlador de puerto WaveCíclico llamando a PcNewPort con el valor GUID CLSID_PortWaveCyclic.
Llama al método IPort::Init del controlador de puerto para enlazar el controlador de miniporte al controlador de puerto.
El ejemplo de código de Creación de subdispositivos ilustra este proceso. Los controladores de puerto y minipuerto se comunican entre sí a través de sus interfaces IPortWaveCíclica e IMiniportWaveCíclicas .
El búfer cíclico del filtro WaveCíclico siempre consta de un bloque contiguo de memoria virtual. La implementación del controlador de puerto del método IDmaChannel::AllocateBuffer siempre asigna un búfer contiguo en el espacio de direcciones de memoria física y virtual. Si, como se mencionó anteriormente, el motor DMA del dispositivo WaveCíclico impone restricciones adicionales en la memoria del búfer, el controlador de minipuerto es libre de implementar su propio método de asignación de búfer para cumplir estas restricciones.
Un controlador de miniporte wavecíclico que solicita un búfer grande (por ejemplo, ocho páginas de memoria físicamente contiguas) debe estar preparado para establecer un tamaño de búfer más pequeño si el sistema operativo deniega la solicitud original. Un dispositivo de audio puede descargarse y volver a cargarse ocasionalmente para reequilibrar los recursos del sistema (consulte Detener un dispositivo para reequilibrar recursos).
Un dispositivo WaveCíclico con hardware DMA integrado de bus mastering se denomina dispositivo maestro. Como alternativa, un dispositivo WaveCíclico puede ser un dispositivo subordinado sin funcionalidades integradas de hardware DMA. Un dispositivo subordinado debe confiar en el controlador DMA del sistema para realizar las transferencias de datos que requiere. Para obtener más información sobre los dispositivos maestros y subordinados, consulte IDmaChannel e IDmaChannelSlave.
Un controlador de miniporte WaveCíclico puede implementar su propio objeto de canal DMA en lugar de usar el objeto DMA-channel predeterminado, que se crea mediante uno de los métodos NewXxxDmaChannel del controlador de puerto:
IPortWaveCíclica::NewMasterDmaChannel
IPortWaveCíclica::NewSlaveDmaChannel
La implementación personalizada del controlador del adaptador IDmaChannel puede realizar un control personalizado de los datos para satisfacer restricciones de hardware especiales. Por ejemplo, las funciones Multimedia de Windows usan formatos de onda en los que las muestras de 16 bits siempre tienen valores firmados, pero el hardware de representación de audio podría diseñarse para usar valores de 16 bits sin firmar en su lugar. En este caso, el método IDmaChannel::CopyTo personalizado del controlador se puede escribir para convertir los valores de origen firmados en los valores de destino sin firmar que requiere el hardware. Aunque esta técnica puede ser útil para solucionar errores de diseño de hardware, también puede incurrir en un costo significativo en la sobrecarga de software.
Para obtener un ejemplo de un controlador que implementa su propio objeto de canal DMA, vea el adaptador de audio de ejemplo Sb16 en versiones anteriores de WDK. Si la constante OVERRIDE_DMA_CHANNEL se define como TRUE, las instrucciones de compilación condicional del código fuente permiten la implementación de un objeto IDmaChannel propietario, que el controlador usa en lugar del objeto IDmaChannel predeterminado desde la llamada IPortWaveCíclica::NewXxxDmaChannel.