Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os filtros de onda representam dispositivos que renderizam e/ou capturam dados de áudio digitais formatados por onda. Normalmente, os aplicativos 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 do 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 um 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 uma tomada de 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 único filtro de onda 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 Subdevices de Áudio Dinâmico.
Um driver de adaptador de áudio cria um filtro de onda ao vincular um driver de miniporto de onda, que é implementado pelo fornecedor de hardware como parte do driver do adaptador, com um driver de porta de onda, que é implementado pelo sistema. O driver de miniporto 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 do 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 (para captura) do dispositivo 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 do 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 de 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 do A Wave Port Driver for Real-Time Audio Streaming .
Filtros WaveRT
Um filtro WaveRT é implementado como um par de driver de porta/miniport. No Windows Vista e posterior, uma fábrica de filtros WaveRT cria um filtro WaveRT da seguinte maneira:
Ele instancia um objeto de driver miniport 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 vincular o driver de miniporto ao driver de porta.
O exemplo de código na Criação de Subdevice ilustra esse processo. Os drivers de porta e de miniporto se comunicam entre si por meio de suas interfaces IPortWaveRT e IMiniportWaveRT .
Para obter mais informações, consulte o white paper do 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 com suporte do WaveCyclic, um dispositivo com suporte do 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 dispersão/coleta de DMA de ou para buffers que podem estar 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 DMA 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 tem liberdade para alocar um buffer cíclico que atenda aos recursos limitados de seu canal DMA. 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 tanto no físico quanto no espaço de endereço 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 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 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 requer 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 driver 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 valor GUID CLSID_PortWavePci.
Ele chama o método IPort::Init do driver de porta para vincular o driver de miniporto ao driver de porta.
O exemplo de código na Criação de Subdevice ilustra esse processo. Os drivers de porta e de miniporto 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 alinhado.
Observação: Informações WaveCyclic para versões anteriores do Windows
Um filtro WaveCyclic é implementado como um par de driver de porta/miniport. Uma fábrica de filtros WaveCyclic cria um filtro WaveCyclic da seguinte maneira:
Ele cria uma instância de um objeto driver de miniporto WaveCyclic.
Ele instancia 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 vincular o driver de miniporto ao driver de porta.
O exemplo de código na Criação de Subdevice ilustra esse processo. Os drivers de porta e de miniporto 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 impõe restrições adicionais sobre a memória de buffer, o driver de miniporto será 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. Um dispositivo de áudio pode ocasionalmente ser descarregado e recarregado para reequilibrar os recursos do sistema (consulte Parar um dispositivo para reequilibrar recursos).
Um dispositivo WaveCyclic com hardware de DMA interno e mestre de barramento é chamado de dispositivo mestre. 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 dispositivos mestres e 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 de canal DMA padrão, que é criado por um dos métodos NewXxxDmaChannel do driver de porta.
IPortWaveCyclic::NewMasterDmaChannel
IPortWaveCyclic::NewSlaveDmaChannel
A implementação personalizada do IDmaChannel 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 amostras de 16 bits são sempre valores assinados, mas o hardware de processamento 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 contornar 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.