Medindo a latência de áudio

Esta página descreve métodos comuns para medir a latência de entrada e saída.

Medindo a latência de saída

Existem várias técnicas disponíveis para medir a latência de saída, com vários graus de precisão e facilidade de execução, descritas abaixo. Consulte também o Circuito de teste para obter um ambiente de teste de exemplo.

Teste de LED e osciloscópio

Este teste mede a latência em relação ao indicador LED do dispositivo. Se o seu dispositivo de produção não tiver um LED, você poderá instalar o LED em um dispositivo de fator de forma protótipo. Para uma precisão ainda melhor em dispositivos protótipos com circuitos expostos, conecte uma ponta de prova do osciloscópio ao LED diretamente para contornar a latência do sensor de luz.

Se você não conseguir instalar um LED em seu dispositivo de produção ou protótipo, tente as seguintes soluções alternativas:

  • Use um pino de entrada/saída de uso geral (GPIO) para a mesma finalidade.
  • Use JTAG ou outra porta de depuração.
  • Use a luz de fundo da tela. Isso pode ser arriscado, pois a luz de fundo pode ter uma latência não desprezível e pode contribuir para uma leitura de latência imprecisa.

Para realizar este teste:

  1. Execute um aplicativo que pulsa periodicamente o LED ao mesmo tempo em que emite áudio.

    Observação: para obter resultados úteis, é crucial usar as APIs corretas no aplicativo de teste para exercitar o caminho de saída de áudio rápido. Consulte Design para latência reduzida para obter o plano de fundo.

  2. Coloque um sensor de luz ao lado do LED.
  3. Conecte as pontas de prova de um osciloscópio de canal duplo ao conector de fone de ouvido com fio (saída de linha) e ao sensor de luz.
  4. Use o osciloscópio para medir a diferença de tempo entre observar o sinal de saída de linha versus o sinal do sensor de luz.

A diferença de tempo é a latência aproximada da saída de áudio, supondo que a latência do LED e a latência do sensor de luz sejam zero. Normalmente, o LED e o sensor de luz têm uma latência relativamente baixa na ordem de um milissegundo ou menos, o que é suficientemente baixo para ser ignorado.

Medindo a latência de ida e volta

A latência de ida e volta é a soma da latência de saída e da latência de entrada.

Teste de Larsen

Um dos testes de latência mais fáceis é um teste de feedback de áudio (efeito Larsen). Isso fornece uma medida bruta da latência combinada de saída e entrada, cronometrando um loop de resposta ao impulso. Este teste não é muito útil para análise detalhada por si só devido à natureza do teste, mas pode ser útil para calibrar outros testes e para estabelecer um limite superior.

Este método não divide os tempos dos componentes, o que é importante quando a latência de saída e a latência de entrada são independentes. Portanto, esse método não é recomendado para medir a latência de saída precisa ou valores de latência de entrada isoladamente, mas pode ser útil para estabelecer estimativas aproximadas.

A latência de saída para o alto-falante no dispositivo pode ser significativamente maior do que a latência de saída para o conector do fone de ouvido. Isso se deve à correção e proteção do alto-falante.

Para realizar este teste:

  1. Execute um aplicativo que capture áudio do microfone e reproduza imediatamente os dados capturados no alto-falante.
  2. Crie um som externamente, como bater um lápis ao lado do microfone. Este ruído gera um loop de feedback. Alternativamente, pode-se injetar um impulso no loop usando software.
  3. Meça o tempo entre os pulsos de feedback para obter a soma da latência de saída, latência de entrada e sobrecarga do aplicativo.

Aqui estão alguns recursos para obter um aplicativo para o teste Larsen:

  • O aplicativo de loopback Dr. Rick O'Rang é um aplicativo Android para testes de feedback de áudio. Você pode baixar o aplicativo do Google Play ou obter o código-fonte do GitHub .
  • Também publicamos um exemplo de implementação em slesTestFeedback.cpp . Este é um aplicativo de linha de comando e é criado usando o ambiente de compilação da plataforma; no entanto, deve ser simples adotar o código para outros ambientes. Você também precisará do código FIFO sem bloqueio localizado na biblioteca audio_utils .

Dongle de loopback de áudio

O dongle de loopback de áudio Dr. Rick O'Rang é útil para medir a latência de ida e volta no conector do fone de ouvido. A imagem abaixo demonstra o resultado de injetar um impulso no loop uma vez e, em seguida, permitir que o loop de feedback oscile. O período das oscilações é a latência de ida e volta. O dispositivo específico, a versão do software e as condições de teste não são especificados aqui. Os resultados apresentados não devem ser extrapolados.

medição de ida e volta

Figura 1. Medição de ida e volta

Pode ser necessário remover o cabo USB para reduzir o ruído e ajustar o nível de volume para obter uma oscilação estável.

Medindo a latência de entrada

A latência de entrada é mais difícil de medir do que a latência de saída. Os testes a seguir podem ajudar.

Uma abordagem é primeiro determinar a latência de saída usando o método de LED e osciloscópio e, em seguida, usar o teste de feedback de áudio (Larsen) para determinar a soma da latência de saída e latência de entrada. A diferença entre essas duas medições é a latência de entrada.

Outra técnica é usar um pino GPIO em um dispositivo protótipo. Externamente, pulsa uma entrada GPIO ao mesmo tempo em que apresenta um sinal de áudio ao dispositivo. Execute um aplicativo que compare a diferença nos tempos de chegada do sinal GPIO e dos dados de áudio.

Reduzindo a latência

Para obter baixa latência de áudio, preste atenção especial em todo o sistema ao agendamento, tratamento de interrupção, gerenciamento de energia e design de driver de dispositivo. Seu objetivo é evitar que qualquer parte da plataforma bloqueie um thread de áudio SCHED_FIFO por mais de alguns milissegundos. Ao adotar essa abordagem sistemática, você pode reduzir a latência de áudio e obter o benefício colateral de um desempenho geral mais previsível.

Os underruns de áudio, quando ocorrem, geralmente são detectáveis ​​apenas sob certas condições ou apenas nas transições. Tente estressar o sistema iniciando novos aplicativos e rolando rapidamente por várias telas. Mas esteja ciente de que algumas condições de teste são tão estressantes que estão além dos objetivos do projeto. Por exemplo, fazer um relatório de bug coloca uma carga tão grande no sistema que pode ser aceitável ter um underrun nesse caso.

Ao testar para underruns:

  • Configure qualquer DSP após o processador do aplicativo para que ele adicione latência mínima.
  • Execute testes em diferentes condições, como com a tela ligada ou desligada, USB conectado ou desconectado, WiFi ligado ou desligado, Bluetooth ligado ou desligado e rádios de telefonia e dados ligados ou desligados.
  • Selecione uma música relativamente calma com a qual você esteja muito familiarizado e que seja fácil de ouvir.
  • Use fones de ouvido com fio para maior sensibilidade.
  • Dê a si mesmo pausas para não sentir "fadiga de ouvido".

Depois de encontrar as causas subjacentes de subexecuções, reduza as contagens e tamanhos de buffer para tirar proveito disso. A abordagem ávida de reduzir as contagens e tamanhos de buffer antes de analisar subexecuções e corrigir as causas de subexecuções só resulta em frustração.

Ferramentas

systrace é uma excelente ferramenta de uso geral para diagnosticar falhas de desempenho no nível do sistema.

A saída de dumpsys media.audio_flinger também contém uma seção útil chamada "estatísticas simples de movimentação". Isso tem um resumo da variabilidade dos tempos decorridos para cada mix de áudio e ciclo de E/S. Idealmente, todas as medições de tempo devem ser aproximadamente iguais ao tempo de ciclo médio ou nominal. Se você vir um mínimo muito baixo ou um máximo alto, isso é uma indicação de um problema, provavelmente uma latência de agendamento alta ou tempo de desativação de interrupção. A parte final da saída é especialmente útil, pois destaca a variabilidade além de +/- 3 desvios padrão.