Partilhar via


Filtros de onda

Os filtros de onda representam dispositivos que processam e/ou capturam dados de áudio digital formatados em onda. Normalmente, as aplicações acedem às capacidades destes dispositivos através da API DirectSound ou através das funções multimédia waveOutXxx e waveInXxx do Microsoft Windows. Para obter informações sobre os formatos de onda que os drivers de áudio WDM podem suportar, consulte WAVEFORMATEX e WAVEFORMATEXTENSIBLE.

Um filtro de renderização de onda recebe como entrada um fluxo de áudio digital de onda e emite um sinal de áudio analógico (para um conjunto de alto-falantes ou mixer externo) ou um fluxo de áudio digital (para um conector S/PDIF, por exemplo).

Um filtro de captura de onda recebe como entrada um sinal de áudio analógico (de um microfone ou tomada de entrada) ou um fluxo digital (de um conector S/PDIF, por exemplo). O mesmo filtro produz um fluxo de onda contendo dados de áudio digital.

Um filtro de onda única pode executar a renderização e a captura simultaneamente. Este tipo de filtro pode, por exemplo, representar um dispositivo de áudio que pode reproduzir áudio através de um conjunto de altifalantes e gravar áudio através de um microfone ao mesmo tempo. Como alternativa, o hardware de renderização e captura de onda pode ser representado como filtros de onda separados, conforme descrito em Subdispositivos de áudio dinâmico.

Um controlador de adaptador de áudio forma um filtro de onda ao vincular um controlador de miniporta de onda, que o fornecedor de hardware implementa como parte do controlador do adaptador, a um controlador de porta de onda, que o sistema implementa. O driver de miniporta lida com todas as operações específicas de hardware para o filtro de onda e o driver de porta gerencia todas as funções genéricas de filtro de onda.

O driver do sistema PortCls (Portcls.sys) implementa três drivers de porta de onda: WaveRT, WavePci e WaveCyclic.

Os três tipos de filtro de onda funcionam da seguinte forma:

  • Um filtro WaveRT aloca um buffer para dados de onda e torna esse buffer diretamente acessível ao cliente de modo de usuário. O buffer pode consistir em blocos de memória contíguos ou não contíguos, dependendo das capacidades de hardware do dispositivo de onda. O cliente acessa o buffer como um bloco contíguo de memória virtual. O buffer é cíclico, o que significa que quando o ponteiro de leitura (para renderização) ou gravação (para captura) do dispositivo atinge o final do buffer, ele automaticamente volta para o início do buffer.

  • Um filtro WavePci acessa diretamente o buffer do cliente. Embora o cliente acesse o buffer como um único bloco contíguo de memória virtual, o filtro WavePci deve acessar o buffer como uma série de blocos de memória possivelmente não contíguos. Os blocos que contêm partes sucessivas do fluxo de renderização ou captura são enfileirados no dispositivo. Quando o ponteiro de leitura ou gravação do dispositivo atinge o final de um bloco, ele se move para o início do próximo bloco na fila.

  • Um filtro WaveCyclic aloca um buffer que consiste em um único bloco contíguo de memória para uso como seu buffer de saída (para renderização) ou entrada (para captura). Este tampão é cíclico. Como o buffer não é diretamente acessível ao cliente, o driver deve copiar dados entre o buffer cíclico do driver e o buffer de modo de usuário do cliente.

WaveRT é preferido sobre WavePci e WaveCyclic. WavePci e WaveCyclic foram usados com versões anteriores do Windows.

Um filtro WaveRT pode representar um dispositivo de áudio que reside num barramento de sistema, como PCI ou PCI Express. A principal vantagem de um filtro WaveRT sobre um filtro WaveCyclic ou WavePci é que um filtro WaveRT permite que um cliente de modo de usuário troque dados de áudio diretamente com o hardware de áudio. Em contraste, os filtros WaveCyclic e WavePci requerem intervenção periódica do software por parte do driver, o que aumenta a latência do fluxo de áudio. Além disso, os dispositivos de áudio com e sem capacidades de dispersão/recolha de DMA podem ser representados como filtros WaveRT. Para obter mais informações, consulte o white paper A Wave Port Driver for Real-Time Audio Streaming .

Filtros WaveRT

Um filtro WaveRT é implementado como um par de drivers de porta/miniporta. No Windows Vista e posterior, uma fábrica de filtros WaveRT cria um filtro WaveRT da seguinte maneira:

  • Ele instancia um objeto de driver de miniporta WaveRT.

  • Ele instancia um objeto de driver de porta WaveRT chamando PcNewPort com valor GUID CLSID_PortWaveRT.

  • Ele chama o método IPort::Init do driver de porta para vincular o driver de miniporta ao driver de porta.

O exemplo de código no Subdevice Creation ilustra esse processo. Os drivers de porta e miniporta se comunicam entre si através de suas interfaces IPortWaveRT e IMiniportWaveRT .

Para obter mais informações, consulte o white paper A Wave Port Driver for Real-Time Audio Streaming .

Informações para versões anteriores do Windows

Informações WaveCyclic para versões anteriores do Windows

Um filtro WaveCyclic pode representar um dispositivo de áudio que se liga a um bus do sistema, como ISA, PCI, PCI Express ou PCMCIA. Como o nome "WavePci" implica, um filtro WavePci geralmente representa um dispositivo que se conecta a um barramento PCI, embora, em princípio, um dispositivo WavePci possa se conectar a um barramento ISA, por exemplo. Ao contrário dos dispositivos mais simples que são suportados pelo WaveCyclic, um dispositivo suportado pelo WavePci deve ter capacidades de dispersão/recolha de DMA. Um dispositivo de áudio que reside no barramento PCI, mas não possui scatter/gather DMA, pode ser representado como um filtro WaveCyclic, mas não como um filtro WavePci.

Informações WavePci para versões anteriores do Windows

Um dispositivo WavePci é capaz de realizar transferências DMA de dispersão/coleta de ou para buffers que podem ser localizados em endereços de memória arbitrários e que começam e terminam com alinhamentos arbitrários de bytes. Em contraste, o hardware DMA para um dispositivo WaveCyclic requer apenas a capacidade de mover dados de ou para um único buffer que o driver de miniporta do dispositivo aloca. Um driver de miniporta WaveCyclic é livre para alocar um buffer cíclico que atenda aos recursos limitados do seu canal DMA. Por exemplo, o canal DMA para um dispositivo WaveCyclic típico pode exigir um buffer que satisfaça as seguintes restrições:

  • O buffer está localizado em uma determinada região do espaço de endereço físico.

  • O buffer é contíguo no espaço de endereçamento físico e virtual.

  • O buffer começa e termina até mesmo em limites de quatro ou oito bytes.

Em troca dessa simplicidade, no entanto, um dispositivo WaveCyclic deve confiar na cópia de software de dados de ou para o buffer cíclico, enquanto um dispositivo WavePci depende das capacidades de dispersão/coleta de seu hardware DMA para evitar essa cópia. Os IRPs que fornecem dados de áudio em formato wave para um dispositivo de renderização ou recuperam dados de um dispositivo de captura são acompanhados por buffers de dados, e cada um desses buffers contém um segmento do fluxo de áudio que está sendo renderizado ou capturado. Um dispositivo WavePci é capaz de acessar esses buffers diretamente através de seu mecanismo DMA de dispersão/coleta, enquanto um dispositivo WaveCyclic requer que os dados sejam copiados para seu buffer cíclico do IRP, ou vice-versa.

Filtros WavePci

Nota: Informações WavePci para versões anteriores do Windows

Um filtro WavePci é implementado como um par de driver de port/miniport. Uma fábrica de filtros WavePci cria um filtro WavePci da seguinte forma:

  • Ele instancia um objeto de driver de miniporta WavePci.

  • Ele instancia um objeto de driver de porta WavePci chamando PcNewPort com valor GUID CLSID_PortWavePci.

  • Ele chama o método IPort::Init do driver de porta para vincular o driver de miniporta ao driver de porta.

O exemplo de código no Subdevice Creation ilustra esse processo. Os drivers de porta e miniporta se comunicam entre si através de suas interfaces IPortWavePci e IMiniportWavePci .

Para obter mais informações, consulte Problemas de implementação para dispositivos WavePci.

Filtros WaveCyclic

Observação

A Microsoft oferece suporte a um ambiente diverso e inclusivo. Este artigo contém referências à terminologia que o guia de estilo da Microsoft para comunicação sem preconceitos reconhece como excludente. A palavra ou frase é usada neste artigo para consistência porque aparece atualmente no software. Quando o software é atualizado para remover o idioma, este artigo será atualizado para estar alinhado.

Nota: Informações WaveCyclic para versões Windows anteriores

Um filtro WaveCyclic é implementado como um par de driver de porta/miniporta. Uma fábrica de filtros WaveCyclic cria um filtro WaveCyclic da seguinte forma:

  • Ele instancia um objeto de driver de miniporta WaveCyclic.

  • Ele instancia um objeto de driver de porta WaveCyclic chamando PcNewPort com valor GUID CLSID_PortWaveCyclic.

  • Ele chama o método IPort::Init do driver de porta para vincular o driver de miniporta ao driver de porta.

O exemplo de código no Subdevice Creation ilustra esse processo. Os drivers de porta e miniporta se comunicam entre si através de suas interfaces IPortWaveCyclic e IMiniportWaveCyclic .

O buffer cíclico do filtro WaveCyclic sempre consiste em um bloco contíguo de memória virtual. A implementação do método IDmaChannel::AllocateBuffer no driver de porta aloca sempre um buffer contíguo tanto no espaço de endereçamento de memória física como virtual. Se, como mencionado anteriormente, o mecanismo DMA do dispositivo WaveCyclic impõe restrições adicionais na memória buffer, o driver de miniporta é livre para implementar seu próprio método de alocação de buffer para atender a essas restrições.

Um driver de miniporta WaveCyclic que solicita um buffer grande (por exemplo, oito páginas de memória fisicamente contíguas) deve estar preparado para se contentar com um tamanho de buffer menor se o sistema operacional negar a solicitação original. Um dispositivo de áudio pode ocasionalmente ser descarregado e recarregado para reequilibrar os recursos do sistema (consulte Parando um dispositivo para reequilibrar recursos).

Um dispositivo WaveCyclic com hardware DMA de controle de barramento incorporado é chamado de dispositivo mestre. Como alternativa, um dispositivo WaveCyclic pode ser um dispositivo subordinado sem recursos internos de hardware DMA. Um dispositivo subordinado tem que confiar no controlador DMA do sistema para executar quaisquer transferências de dados que ele exige. Para obter mais informações sobre dispositivos mestre e subordinado, consulte IDmaChannel e IDmaChannelSlave.

Um driver de miniporta WaveCyclic pode implementar seu próprio objeto de canal DMA em vez de usar o objeto de canal DMA padrão, que é criado por um dos métodos NewXxxDmaChannel do driver de porta:

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

A implementação IDmaChannel personalizada do driver do adaptador pode executar o tratamento personalizado de dados para atender a restrições especiais de hardware. Por exemplo, as funções de multimídia do Windows usam formatos wave nos quais amostras de 16 bits são sempre valores assinados, mas o hardware de renderização de áudio pode ser projetado para usar valores de 16 bits não assinados. Nesse caso, o método IDmaChannel::CopyTo personalizado do driver pode ser gravado para converter os valores de origem assinados para os valores de destino não assinados que o hardware exige. Embora essa técnica possa ser útil para contornar falhas de design de hardware, ela também pode incorrer em um custo significativo em despesas gerais de software.

Para obter um exemplo de um driver que implementa seu próprio objeto de canal DMA, consulte o adaptador de áudio de exemplo Sb16 em versões anteriores do WDK. Se a constante OVERRIDE_DMA_CHANNEL for definida como TRUE, as instruções de compilação condicional no código-fonte habilitarão a implementação de um objeto IDmaChannel proprietário, que o driver usa no lugar do objeto IDmaChannel padrão da chamada IPortWaveCyclic::NewXxxDmaChannel.