Compartir a través de


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 un conector de entrada) o un flujo 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 Subdispositivos 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 miniporta 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íclico.

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 de memoria contiguos o no contiguas, 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 del dispositivo (para procesar) o de escritura (para capturar) llega al final del búfer, avanza 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, este pasa al principio del siguiente bloque en la cola.

  • Un filtro WaveCíclico asigna un búfer que consta de un único bloque de memoria contiguo 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 del modo de usuario del cliente.

WaveRT es preferible a WavePci y WaveCíclico. WavePci y WaveCíclico 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íclico 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 la 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 o recopilación de DMA se pueden representar como filtros waveRT. Para obtener más información, consulte el documento técnico A Wave Port Driver for Real-Time Audio Streaming.

Filtros WaveRT

Un filtro WaveRT se implementa como un par de controladores de puerto/miniport. En Windows Vista y versiones posteriores, una factoría 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 miniport al controlador de puerto.

El ejemplo de código de Creación de subdispositivos ilustra este proceso. Los controladores de puerto y miniporta se comunican entre sí a través de sus interfaces IPortWaveRT e IMiniportWaveRT .

Para obtener más información, consulte el documento técnico A Wave Port Driver for Real-Time Audio Streaming.

Información para versiones anteriores de Windows

Información sobre WaveCyclic 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 normalmente representa 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íclico, 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 scatter/gather 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 DMA de dispersión o 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. Por el contrario, el hardware DMA para un dispositivo WaveCíclico solo requiere la capacidad de mover datos hacia o desde un único búfer que asigna el controlador de miniporte del dispositivo. Un controlador de miniport WaveCyclic puede asignar un buffer cíclico que cumpla con 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 restricciones siguientes:

  • El búfer se encuentra en una determinada región del espacio de direcciones físico.

  • 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 pares de cuatro u 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 funcionalidades 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 representa o captura. Un dispositivo WavePci puede acceder a estos búferes directamente a través de su controlador DMA scatter/gather, mientras que un dispositivo WaveCyclic necesita que los datos se copien a su búfer cíclico desde el IRP, o viceversa.

Filtros WavePci

Nota: Información de WavePci para versiones anteriores de Windows

Un filtro WavePci se implementa como un conjunto de controlador de puerto y miniport. Un generador de filtros WavePci crea un filtro WavePci de la siguiente manera:

  • Crea una instancia de un objeto de controlador de miniport WavePci.

  • 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 miniport 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, vea 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 sesgos reconoce como excluyente. La palabra o frase se usa en este artículo para la coherencia porque aparece actualmente en el software. Cuando el software se actualiza para quitar el idioma, este artículo se actualizará para que esté en alineación.

Nota: Información de WaveCyclic para versiones anteriores de Windows

Un filtro WaveCíclico se implementa como un par de controladores port/miniport. Una fábrica de filtros WaveCyclic crea un filtro WaveCyclic de la siguiente manera:

  • Crea una instancia de un objeto del controlador Miniport WaveCyclic.

  • 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 miniport 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 ellos a través de sus interfaces IPortWaveCyclic e IMiniportWaveCyclic.

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 miniporte 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 solicite 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 de control de bus integrado se denomina dispositivo maestro. Como alternativa, un dispositivo WaveCyclic puede ser un dispositivo subordinado sin capacidades 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 y 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:

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::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 signo 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 suponer 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 del WDK. Si la constante OVERRIDE_DMA_CHANNEL se define como TRUE, las instrucciones de compilación condicional en el 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íclico::NewXxxDmaChannel.