Share via


Filtros de onda

Os filtros de onda representam dispositivos que renderizam e/ou capturam dados de áudio digital formatados em onda. Os aplicativos normalmente acessam os recursos desses dispositivos por meio da API DirectSound ou por meio das funções waveOutXxx e waveInXxx do Microsoft Windows. Para obter informações sobre os formatos de onda aos quais os drivers de áudio WDM podem dar suporte, consulte WAVEFORMATEX e WAVEFORMATEXTENSIBLE.

Um filtro de renderização de onda recebe como entrada um fluxo de áudio digital de onda e gera 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 entrada) ou um fluxo digital (de um conector S/PDIF, por exemplo). O mesmo filtro gera um fluxo de ondas que contém dados de áudio digital.

Um filtro de onda única pode executar a renderização e a captura simultaneamente. Esse tipo de filtro pode, por exemplo, representar um dispositivo de áudio que pode reproduzir áudio por meio de um conjunto de alto-falantes e gravar áudio por meio de um microfone ao mesmo tempo. Como alternativa, o hardware de renderização de onda e captura de onda pode ser representado como filtros de onda separados, conforme descrito em Subdispositivos de Áudio Dinâmico.

Um driver de adaptador de áudio forma um filtro de onda associando um driver de miniporta de onda, que o fornecedor de hardware implementa como parte do driver do adaptador, com um driver de porta de onda, que o sistema implementa. O driver de miniporta manipula 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 operam da seguinte maneira:

  • Um filtro WaveRT aloca um buffer para dados de onda e torna esse buffer diretamente acessível ao cliente no modo de usuário. O buffer pode consistir em blocos contíguos ou não contíguos de memória, dependendo dos recursos 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 do dispositivo (para captura) atinge o final do buffer, ele é encapsulado automaticamente até 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. 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 saída (para renderização) ou buffer de entrada (para captura). Esse buffer é cíclico. Como o buffer não está diretamente acessível ao cliente, o driver deve copiar dados entre o buffer cíclico do driver e o buffer do modo de usuário do cliente.

WaveRT é preferencial em vez de 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 em um barramento do 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 no modo de usuário troque dados de áudio diretamente com o hardware de áudio. Por outro lado, os filtros WaveCyclic e WavePci exigem intervenção periódica do software pelo driver, o que aumenta a latência do fluxo de áudio. Além disso, os dispositivos de áudio com e sem recursos de DMA de dispersão/coleta 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/miniport. No Windows Vista e posterior, uma fábrica de filtros WaveRT cria um filtro WaveRT da seguinte maneira:

  • Ele cria uma instância de um objeto de driver de miniporto WaveRT.

  • Ele cria uma instância de um objeto de driver de porta WaveRT chamando PcNewPort com o valor guid CLSID_PortWaveRT.

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

O exemplo de código em Criação de Subdispositivos ilustra esse processo. Os drivers de porta e miniport se comunicam entre si por meio 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 conecta a um barramento do sistema, como ISA, PCI, PCI Express ou PCMCIA. Como o nome "WavePci" indica, 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 compatíveis com WaveCyclic, um dispositivo compatível com WavePci deve ter recursos de DMA de dispersão/coleta. Um dispositivo de áudio que reside no barramento PCI, mas não tem DMA de dispersão/coleta, pode ser representado como um filtro WaveCyclic, mas não como um filtro WavePci.

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

Um dispositivo WavePci é capaz de executar transferências de 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. Por outro lado, o hardware de AMD para um dispositivo WaveCyclic requer apenas a capacidade de mover dados de ou para um único buffer alocado pelo driver de miniporto do dispositivo. Um driver de miniporto WaveCyclic é livre para alocar um buffer cíclico que atenda às funcionalidades limitadas de seu canal de AMD. Por exemplo, o canal DMA para um dispositivo WaveCyclic típico pode exigir um buffer que atenda às 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 físico, bem como no espaço de endereço virtual.

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

Em troca dessa simplicidade, no entanto, um dispositivo WaveCyclic deve depender da cópia de software de dados de ou para o buffer cíclico, enquanto um dispositivo WavePci depende dos recursos de dispersão/coleta de seu hardware de DMA para evitar essa cópia. Os IRPs que fornecem dados de áudio de onda 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 uma parte do fluxo de áudio que está sendo renderizado ou capturado. Um dispositivo WavePci é capaz de acessar esses buffers diretamente por meio de seu mecanismo de DMA de dispersão/coleta, enquanto um dispositivo WaveCyclic exige que os dados sejam copiados para seu buffer cíclico do IRP ou vice-versa.

Filtros WavePci

Observação: Informações do WavePci para versões anteriores do Windows

Um filtro WavePci é implementado como um par de drivers de porta/miniport. Uma fábrica de filtros WavePci cria um filtro WavePci da seguinte maneira:

  • Ele cria uma instância de um objeto de driver de miniporto WavePci.

  • Ele cria uma instância de um objeto de driver de porta WavePci chamando PcNewPort com o valor guid CLSID_PortWavePci.

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

O exemplo de código em Criação de Subdispositivos ilustra esse processo. Os drivers de porta e miniport se comunicam entre si por meio 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 dá suporte a um ambiente diversificado 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 ela aparece atualmente no software. Quando o software for atualizado para remover o idioma, este artigo será atualizado para estar em alinhamento.

Observação: Informações wavecyclic para versões anteriores do Windows

Um filtro WaveCyclic é implementado como um par de drivers de porta/miniport. Uma fábrica de filtros WaveCyclic cria um filtro WaveCyclic da seguinte maneira:

  • Ele cria uma instância de um objeto de driver de miniporta WaveCyclic.

  • Ele cria uma instância de um objeto de driver de porta WaveCyclic chamando PcNewPort com o valor guid CLSID_PortWaveCyclic.

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

O exemplo de código em Criação de Subdispositivos ilustra esse processo. Os drivers de porta e miniport se comunicam entre si por meio 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 driver de porta do método IDmaChannel::AllocateBuffer sempre aloca um buffer contíguo no espaço de endereço de memória física e virtual. Se, conforme mencionado anteriormente, o mecanismo de DMA do dispositivo WaveCyclic impor restrições adicionais à memória do buffer, o driver de miniporto estará livre para implementar seu próprio método de alocação de buffer para atender a essas restrições.

Um driver de miniporto 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. Ocasionalmente, um dispositivo de áudio pode ser descarregado e recarregado para reequilibrar recursos do sistema (consulte Parando um dispositivo para reequilibrar recursos).

Um dispositivo WaveCyclic com hardware de DMA interno de domínio de barramento é chamado de dispositivo master. Como alternativa, um dispositivo WaveCyclic pode ser um dispositivo subordinado sem recursos internos de DMA-hardware. Um dispositivo subordinado precisa contar com o controlador de DMA do sistema para executar todas as transferências de dados necessárias. Para obter mais informações sobre master e dispositivos subordinados, consulte IDmaChannel e IDmaChannelSlave.

Um driver de miniporto WaveCyclic pode implementar seu próprio objeto de canal DMA em vez de usar o objeto DMA-channel 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 de hardware especiais. Por exemplo, as funções multimídia do Windows usam formatos de onda nos quais exemplos de 16 bits são sempre valores assinados, mas o hardware de renderização de áudio pode ser projetado para usar valores não assinados de 16 bits. Nesse caso, o método IDmaChannel::CopyTo personalizado do driver pode ser gravado para converter os valores de origem assinados nos valores de destino não assinados exigidos pelo hardware. Embora essa técnica possa ser útil para trabalhar em torno de falhas de design de hardware, ela também pode incorrer em um custo significativo na sobrecarga 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.