Noções básicas sobre o driver de porta WaveRT
O driver de porta WaveRT combina a simplicidade do driver de porta WaveCyclic anterior com o desempenho acelerado por hardware do driver de porta WavePci.
O driver de porta WaveRT elimina a necessidade de mapear e copiar continuamente os dados de áudio fornecendo seu cliente main (normalmente, o mecanismo de áudio) com acesso direto ao buffer de dados. Esse acesso direto também elimina a necessidade de o driver manipular os dados no fluxo de áudio. Assim, o driver de porta WaveRT acomoda as necessidades dos controladores de DMA (acesso direto à memória) que alguns dispositivos de áudio têm.
Para distinguir-se de outros dispositivos de renderização de onda e captura de ondas, o driver de porta WaveRT registra-se sob KSCATEGORY_REALTIME além de KSCATEGORY_AUDIO, KSCATEGORY_RENDER e KSCATEGORY_CAPTURE. Esse auto-registro ocorre durante a instalação do driver do adaptador.
No Windows Vista e em sistemas operacionais posteriores, quando o sistema operacional é iniciado e o mecanismo de áudio é inicializado, o mecanismo de áudio enumera os filtros KS que representam os dispositivos de áudio. Durante a enumeração, o mecanismo de áudio cria uma instância dos drivers para os dispositivos de áudio encontrados. Esse processo resulta na criação de objetos de filtro para esses dispositivos. Para dispositivos de áudio WaveRT, o objeto de filtro resultante tem os seguintes componentes:
Uma instância do driver de porta WaveRT para gerenciar as funções genéricas do sistema para o filtro
Uma instância do driver de miniporto WaveRT para lidar com todas as funções específicas de hardware do filtro
Depois que o objeto de filtro é criado, o mecanismo de áudio e o driver de miniporto WaveRT estão prontos para abrir um fluxo de áudio para o tipo de processamento de áudio necessário. Para preparar o filtro KS para renderização de áudio (reprodução), por exemplo, o mecanismo de áudio e o driver de miniporto WaveRT fazem o seguinte para abrir um fluxo de reprodução:
O mecanismo de áudio abre um pino no filtro KS e o driver de miniporto WaveRT cria uma instância do pino. Quando o mecanismo de áudio abre o pino, ele também passa o formato de onda do fluxo para o driver. O driver usa as informações de formato de onda para selecionar o tamanho do buffer adequado na próxima etapa.
O mecanismo de áudio envia uma solicitação ao driver de miniporto para um buffer cíclico de um tamanho específico a ser criado. O termo buffer cíclico refere-se ao fato de que quando o registro de posição do buffer atinge o final do buffer em uma operação de reprodução ou registro, o registro de posição pode ser encapsulado automaticamente até o início do buffer. Ao contrário do driver de miniporto WaveCyclic que configura um bloco contíguo de memória física, o driver de miniporto WaveRT não precisa de um buffer contíguo na memória física. O driver usa a propriedade KSPROPERTY_RTAUDIO_BUFFER para alocar espaço para o buffer. Se o hardware do dispositivo de áudio não puder transmitir de um buffer do tamanho solicitado, o driver funcionará dentro das limitações de recurso do dispositivo de áudio para criar um buffer que seja o mais próximo do tamanho solicitado originalmente. Em seguida, o driver mapeia o buffer para o mecanismo de DMA do dispositivo de áudio e torna o buffer acessível para o mecanismo de áudio no modo de usuário.
O mecanismo de áudio agenda um thread para gravar periodicamente dados de áudio no buffer cíclico.
Se o hardware do dispositivo de áudio não fornecer suporte direto para buffers cíclicos, o driver de miniporto reprograma periodicamente o dispositivo de áudio para continuar usando o mesmo buffer. Por exemplo, se o hardware não der suporte ao loop de buffer, o driver deverá definir o endereço DMA de volta para o início do buffer sempre que chegar ao final do buffer. Essa atualização pode ser feita em uma ISR (rotina de serviço de interrupção) ou em um thread de alta prioridade.
A configuração resultante fornece um sinal de áudio resiliente a falhas no hardware do dispositivo de áudio que dá suporte a buffers cíclicos ou trabalha com o driver de miniporto para atualizar regularmente seu hardware.
Para preparar um filtro KS para captura de áudio (gravação), o mecanismo de áudio e o driver de miniporto WaveRT usam etapas semelhantes para abrir um fluxo de registro.
Uma das melhorias de desempenho fornecidas pelo driver de porta WaveRT é uma redução no atraso no processamento de ponta a ponta do fluxo de áudio durante a renderização de onda ou a captura de ondas. Esse atraso é conhecido como latência de fluxo.
Para obter mais informações sobre esses dois tipos de latência de fluxo, consulte os tópicos a seguir.
Para obter informações sobre como desenvolver um driver de miniporta WaveRT que complementa o driver de porta WaveRT, consulte o tópico Developing a WaveRT Miniport Driver .