Compartilhar via


Latência de fluxo durante a reprodução

Enquanto um fluxo de reprodução de áudio está no estado Executar, a função do driver de porta WaveRT é mínima. Conforme mostrado no diagrama a seguir, durante a reprodução, o cliente do driver de porta WaveRT grava seus dados no buffer cíclico e o dispositivo 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 aplicativo de modo de usuário e o hardware de áudio sem serem tocados por nenhum componente de software no modo kernel.

No diagrama, as posições de gravação e reprodução progridem continuamente da esquerda para a direita à medida que o fluxo de dados de áudio flui pelo buffer cíclico. O buffer é descrito como cíclico porque quando a posição de reprodução ou a posição de gravação atinge o final do buffer, ele é encapsulado automaticamente no início do buffer.

A latência de fluxo durante a reprodução tem duas fontes main, designadas no diagrama a seguir como A e B.

Diagrama mostrando a latência de um fluxo de reprodução com posições de gravação e reprodução em um buffer cíclico.

No diagrama anterior, a Posição de Gravação é o local logo após o último exemplo que o cliente escreveu no buffer. A Posição de Reprodução é o exemplo que o dispositivo de áudio está reproduzindo no momento por meio do alto-falante.

A latência desde o momento em que o cliente grava um exemplo de áudio no buffer até que o dispositivo de áudio o reproduza é simplesmente a separação entre as posições de gravação e reprodução. Essa separação é a soma das duas seguintes fontes de latência (marcadas como A e B no diagrama):

Latência A: depois que o dispositivo de áudio lê dados do buffer, os dados residem em um buffer FIFO (primeiro a entrar, primeiro a sair) de hardware até que o dispositivo de áudio marque os dados por meio do CONVERSor digital para analógico (DAC).

Latência B: depois que o cliente grava dados no buffer cíclico, os dados residem no buffer até que o dispositivo de áudio 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 amostras suficientes para alimentar o DAC por cerca de 64 tiques do relógio de exemplo. No entanto, o cliente controla a latência B. Tornar a latência B muito grande introduz atrasos desnecessários no sistema; no entanto, torná-lo muito pequeno corre o risco de esgotar o dispositivo de áudio.

Embora o cliente possa configurar um temporizador para ativar periodicamente seu thread de gravação de buffer, esse método não alcança a menor latência. Para reduzir ainda mais a latência, o cliente pode configurar o dispositivo para gerar uma notificação de hardware sempre que o dispositivo terminar de ler um novo bloco de dados de reprodução do 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 o cliente sempre que ele terminar de ler um bloco de dados do buffer, o cliente poderá tornar a latência menor do que seria prática de outra forma.

O cliente pode obter um resumo dos atrasos que contribuem para a latência de fluxo enviando uma solicitação de 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 gravação e reprodução, o cliente monitora as alterações na posição de reprodução para determinar até que ponto avançar a posição de gravação. No Windows Server 2008 e em sistemas operacionais posteriores, o cliente envia uma solicitação de propriedade KSPROPERTY_RTAUDIO_POSITIONREGISTER para determinar a posição de reprodução. O suporte para esse recurso é fornecido por melhorias no driver do sistema PortCls.

Se o dispositivo de áudio tiver um registro de posição, conforme mostrado no diagrama anterior, a solicitação de propriedade mapeará o registro para um endereço de memória virtual acessível ao cliente do modo de usuário. Depois que o registro de posição for mapeado, o cliente poderá ler o conteúdo do endereço de memória para determinar a posição de reprodução atual.