Compartilhar via


Componentes Wave e DirectSound

Os programas de aplicativo dependem de uma combinação de componentes do modo de usuário e do modo kernel para capturar (entrada) e renderizar fluxos de onda (saída). Um fluxo de ondas é um fluxo de áudio digital cujo formato de dados é descrito por uma estrutura WAVEFORMATEX ou WAVEFORMATEXTENSIBLE .

Um aplicativo pode usar qualquer uma das seguintes interfaces de software para renderização e captura de ondas:

  • Microsoft Windows Multimedia waveOutXxx and waveInXxx functions

  • APIs DirectSound e DirectSoundCapture

O comportamento das funções waveOutXxx e waveInXxx baseia-se nos recursos de drivers e dispositivos de onda herdados. A partir do Windows 98, o driver do sistema WDMAud converte chamadas para essas funções em comandos para drivers de áudio WDM. No entanto, ao emular o comportamento de software e hardware mais antigos, as funções waveOutXxx sacrificam os efeitos sonoros 3D e a aceleração de hardware que agora estão disponíveis por meio da API do DirectSound. Para obter mais informações sobre o DirectSound e as funções de onda do Windows Multimedia, consulte a documentação do SDK do Microsoft Windows.

O DirectSound e as funções de onda multimídia do Windows são clientes do driver do sistema SysAudio, que cria os grafos de filtro de áudio que processam os fluxos wave e DirectSound. A criação de grafo é transparente para os aplicativos que usam essas interfaces de software.

Componentes wave

A figura a seguir mostra os componentes do modo de usuário e do modo kernel que um aplicativo de onda usa para renderizar ou capturar um fluxo de áudio digital que consiste em dados de PCM de onda.

Diagrama ilustrando os componentes do modo de usuário e do modo kernel para renderização e captura de ondas.

Os componentes de renderização aparecem no lado esquerdo da figura anterior e os componentes de captura aparecem à direita. As caixas que representam o driver de miniporto de ondas são escurecidos para indicar que são componentes fornecidos pelo fornecedor. Os outros componentes na figura são fornecidos pelo sistema.

No canto superior esquerdo da figura, o aplicativo de renderização de onda (ou "wave-out") é adaptado para os drivers de áudio WDM por meio das funçõeswaveOut Xxx , que são implementadas no componente do sistema WinMM no modo de usuário, Winmm.dll. O aplicativo lê blocos de amostras de áudio de onda de um arquivo e chama a função waveOutWrite para renderizá-los.

O WDMAud, que consiste em componentes do modo de usuário e do modo kernel (Wdmaud.drv e Wdmaud.sys), armazena em buffer os dados de onda da chamada waveOutWrite e gera o fluxo de ondas para o driver do sistema KMixer, que aparece abaixo de WDMAud na figura.

O KMixer é um componente do sistema que recebe fluxos de PCM de onda de uma ou mais fontes e os mistura para formar um único fluxo de saída, que também está no formato DE PCM de onda.

O KMixer gera um fluxo de onda para um dispositivo WaveCyclic ou WavePci, cujos drivers de porta e miniporta aparecem abaixo de KMixer no lado esquerdo da figura anterior. O driver de miniporta se associa ao driver de porta para formar o filtro de onda que representa o dispositivo de renderização de áudio subjacente. Um dispositivo de renderização típico gera um sinal analógico que orienta um conjunto de alto-falantes ou uma unidade de áudio externa. Um dispositivo de renderização também pode gerar áudio digital por meio de um conector S/PDIF. Para obter mais informações sobre WaveCyclic e WavePci, consulte Filtros de onda.

Como alternativa, o KMixer pode passar seu fluxo de saída para um dispositivo de áudio USB, que é controlado pelo driver do sistema de classe USBAudio (não mostrado na figura), em vez de um dispositivo WaveCyclic ou WavePci.

Um driver de adaptador cria uma instância de um driver de porta WaveCyclic ou WavePci chamando PcNewPort com um valor GUID de CLSID_PortWaveCyclic ou CLSID_PortWavePci, respectivamente.

O lado direito da figura anterior mostra os componentes necessários para dar suporte a um aplicativo que captura dados de onda para um arquivo. O aplicativo wave-capture (ou "wave-in") comunica-se com os drivers de áudio WDM por meio das funções waveInXxx , que são implementadas no componente do sistema WinMM.

No canto inferior direito da figura, o dispositivo de captura de ondas é controlado por miniportos de onda e drivers de porta. Os drivers de porta e miniporta, que podem ser do tipo WaveCyclic ou WavePci, se associam para formar um filtro de onda que representa o dispositivo de captura. Esse dispositivo normalmente captura um sinal analógico de um microfone ou outra fonte de áudio e o converte em um fluxo de PCM de onda. O dispositivo também pode inserir um fluxo de áudio digital por meio de um conector S/PDIF.

O driver de porta de onda gera seu fluxo de onda diretamente para KMixer ou para WDMAud. O fluxo deverá passar pelo KMixer se precisar ser convertido em taxa de exemplo antes que o WDMAud o receba. Um sistema que executa a renderização e a captura simultâneas de fluxos de áudio pode exigir duas instâncias do KMixer, conforme mostrado na figura. Observe que o SysAudio cria automaticamente essas instâncias conforme elas são necessárias.

Como alternativa, a origem do fluxo de onda capturado pode ser um dispositivo de áudio USB em vez de um dispositivo WaveCyclic ou WavePci. Nesse caso, o driver USBAudio (não mostrado na figura) passa o fluxo para KMixer.

Independentemente de o fluxo de ondas ser capturado por um dispositivo USB ou por um dispositivo WaveCyclic ou WavePci, o KMixer executa a conversão de taxa de exemplo no fluxo, se necessário, mas não faz nenhuma combinação com outros fluxos. O KMixer gera o fluxo resultante para Wdmaud.sys, a metade do modo kernel do driver do sistema WDMAud. A metade do modo de usuário, Wdmaud.drv, gera o fluxo de ondas para o programa de aplicativo por meio das funções waveInXxx , que são implementadas em Winmm.dll. Por fim, na parte superior da figura, o aplicativo de captura de onda grava os dados de onda em um arquivo.

No momento em que o aplicativo de captura de onda chama a função waveInOpen para abrir o fluxo de captura, ele passa um ponteiro para sua rotina de retorno de chamada. Quando ocorre um evento de captura de onda, o sistema operacional chama a rotina de retorno de chamada com um buffer que contém o próximo bloco de amostras de onda do dispositivo de captura. Em resposta ao retorno de chamada, o aplicativo grava o próximo bloco de dados de onda no arquivo.

Componentes do DirectSound

A figura a seguir mostra os componentes do modo de usuário e do modo kernel que são usados por um programa de aplicativo DirectSound para renderizar ou capturar dados de onda.

Diagrama ilustrando os componentes do modo de usuário e do modo kernel para renderização e captura do DirectSound.

Os componentes de renderização são mostrados na metade esquerda da figura anterior e os componentes de captura aparecem à direita. Os drivers de miniporto de onda são mostrados como caixas escurecidos para indicar que são componentes fornecidos pelo fornecedor. Os outros componentes na figura são fornecidos pelo sistema.

No canto superior esquerdo da figura, um aplicativo DirectSound carrega dados de onda de um arquivo para um buffer de som que o componente do sistema DirectSound (Dsound.dll) do modo de usuário gerencia. Esse componente envia um fluxo de ondas para um dispositivo WaveCyclic ou WavePci, cujos drivers de porta e miniporta aparecem no canto inferior esquerdo da figura. Se um pino de mixer de hardware estiver disponível no dispositivo, o fluxo passará diretamente para o driver de porta de onda, ignorando o KMixer. Caso contrário, o fluxo passa primeiro pelo KMixer, que o mistura com qualquer outro fluxo reproduzido simultaneamente. O KMixer gera o fluxo misto para o driver de porta.

Como antes, o driver de miniporta se associa ao driver de porta para formar o filtro de onda que representa o dispositivo de renderização de áudio subjacente. Esse dispositivo pode reproduzir o fluxo por meio de um conjunto de alto-falantes, por exemplo.

Como alternativa, o fluxo de ondas pode ser renderizado por um dispositivo de áudio USB em vez de um dispositivo WaveCyclic ou WavePci. Nesse caso, o fluxo não pode ignorar o KMixer; o driver do sistema de classe USBAudio (não mostrado na figura) sempre passa o fluxo para KMixer.

O lado direito da figura anterior mostra os componentes que dão suporte a um aplicativo DirectSoundCapture. O aplicativo registra dados de onda recebidos de um dispositivo de captura WaveCyclic ou WavePci. Esse dispositivo converte um sinal analógico de um microfone, por exemplo, em um fluxo de ondas. A porta de onda do dispositivo e os drivers de miniporta aparecem no canto inferior direito da figura. Conforme mostrado na figura, o driver de porta recebe como entrada o fluxo do driver de miniporto e o gera diretamente para o componente DirectSound no modo de usuário, Dsound.dll ou indiretamente por meio do KMixer. Isso depende se um pin de captura de hardware está disponível no dispositivo de captura.

Como alternativa, a origem do fluxo de onda capturado pode ser um dispositivo de áudio USB. Nesse caso, o fluxo não pode ignorar o KMixer; o driver USBAudio (não mostrado na figura) sempre passa o fluxo para KMixer.

Se o KMixer for inserido no caminho do fluxo de captura, ele executará a conversão de taxa de amostragem no fluxo, se necessário, mas não fará nenhuma combinação com outros fluxos.

No canto superior direito da figura anterior, o aplicativo lê os dados de onda do buffer DirectSoundCapture e os grava no arquivo.