Compartilhar via


Latência de fluxo durante a gravação

Enquanto um fluxo de registro de áudio está no estado Executar, a função do driver de porta WaveRT é mínima. Conforme mostrado no diagrama a seguir, durante o processo de gravação, o dispositivo de áudio captura dados de áudio e os grava no buffer cíclico. Em seguida, o mecanismo de áudio lê esses dados do buffer. Essa atividade não requer nenhuma intervenção do driver de porta. Em outras palavras, os dados de áudio fluem diretamente entre o hardware de áudio e o aplicativo de modo de usuário sem serem tocados por nenhum componente de software no modo kernel.

No diagrama a seguir, as posições de registro e leitura progridem continuamente da esquerda para a direita à medida que o fluxo flui pelo buffer. Quando o registro ou a posição de leitura atinge o final do buffer, ele é encapsulado até o início do buffer.

Diagrama mostrando as posições de registro e leitura em um buffer cíclico durante a gravação de áudio.

O diagrama anterior identifica a Posição do Registro como o local do buffer do exemplo que o dispositivo de áudio está gravando no momento (capturando do microfone por meio do conversor analógico para digital ou do ADC). Observe que a posição do registro é o local de buffer futuro no qual o dispositivo de áudio grava o exemplo depois de passar pelo FIFO. A Posição de Leitura é a posição do buffer da qual o mecanismo de áudio lê o próximo exemplo.

A latência do momento em que o dispositivo de áudio captura um exemplo de áudio no ADC até que o cliente o leia é simplesmente a separação entre as posições de registro e leitura. Essa separação é a soma das seguintes fontes de latência (marcadas como A e B no diagrama):

Latência A: depois de capturar dados do ADC, o dispositivo de áudio armazena os dados em um FIFO de hardware até que ele possa gravar os dados no buffer cíclico.

Latência B: depois que o dispositivo de áudio grava dados no buffer cíclico, os dados residem no buffer até que o cliente leia os dados.

O cliente não tem controle sobre a latência A, que depende inteiramente do hardware. Um FIFO típico pode armazenar cerca de 64 amostras do ADC. No entanto, o cliente controla a latência B. Fazer latência B muito grande introduz atrasos desnecessários no sistema, mas torná-lo muito pequeno corre o risco de ler dados muito cedo, antes que o dispositivo de áudio tenha sido gravado no buffer.

Embora o cliente possa configurar um temporizador para ativar periodicamente seu thread de leitura de buffer, esse método não obtém a menor latência. Para reduzir ainda mais a latência, o cliente pode configurar o dispositivo de áudio para gerar uma notificação de hardware sempre que o dispositivo terminar de gravar um novo bloco de dados de captura no buffer. Nesse caso, o thread do cliente é ativado por notificações de hardware em vez de por um temporizador.

Ao fazer com que o dispositivo de áudio notifique periodicamente o mecanismo de áudio, o cliente pode tornar a latência menor do que seria prática de outra forma.

O cliente (normalmente o mecanismo de áudio) pode obter um resumo dos atrasos que o dispositivo de áudio contribui para a latência de fluxo enviando uma solicitação KSPROPERTY_RTAUDIO_HWLATENCY para o driver de porta WaveRT.

Depois que o cliente determina a quantidade de separação a ser mantida entre as posições de registro e leitura, o cliente monitora as alterações na posição do registro para determinar quanto a posição de leitura deve atrasar. No Windows Server 2008 e em sistemas operacionais posteriores, o cliente envia um KSPROPERTY_AUDIO_POSITION ou uma solicitação de propriedade KSPROPERTY_RTAUDIO_POSITIONREGISTER para determinar a posição do registro. O último método de solicitação é mais eficiente porque permite que o cliente leia a posição do registro diretamente sem a transição para uma rotina de modo kernel para obter as informações.