O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

Design para latência reduzida

A versão Android 4.1 introduziu mudanças internas na estrutura para um caminho de saída de áudio de menor latência . Houve alterações mínimas na API do cliente público ou na API HAL. Este documento descreve o design inicial, que continuou a evoluir com o tempo. Ter um bom entendimento desse design deve ajudar os fornecedores de dispositivos OEM e SoC a implementarem o design corretamente em seus dispositivos e chipsets específicos. Este artigo não se destina a desenvolvedores de aplicativos.

Criação de trilha

O cliente pode, opcionalmente, estabelecida pouco AUDIO_OUTPUT_FLAG_FAST no audio_output_flags_t parâmetro de construtor AudioTrack C ++ ou AudioTrack::set() . Atualmente, os únicos clientes que fazem isso são:

A implementação AudioTrack C ++ analisa a solicitação AUDIO_OUTPUT_FLAG_FAST e pode, opcionalmente, negar a solicitação no nível do cliente. Se decidir passar a solicitação em, ele faz isso usando TRACK_FAST pouco do track_flags_t parâmetro do IAudioTrack método de fábrica IAudioFlinger::createTrack() .

O servidor de áudio AudioFlinger analisa a solicitação TRACK_FAST e pode, opcionalmente, negar a solicitação no nível do servidor. Informa ao cliente se a solicitação foi aceita ou não, através do bit CBLK_FAST do bloco de controle de memória compartilhada.

Os fatores que impactam a decisão incluem:

  • Presença de um thread de mixer rápido para esta saída (veja abaixo)
  • Rastrear taxa de amostragem
  • Presença de um thread de cliente para executar manipuladores de retorno de chamada para esta faixa
  • Tamanho do buffer de rastreamento
  • Slots de fast track disponíveis (veja abaixo)

Se a solicitação do cliente foi aceita, é chamado de "fast track". Caso contrário, é chamada de "faixa normal".

Misturadoras

No momento em que o AudioFlinger cria um thread de mixer normal, ele decide se também cria ou não um thread de mixer rápido. Tanto o mixer normal quanto o fast mixer não estão associados a uma trilha em particular, mas sim a um conjunto de trilhas. Sempre há um thread de mixer normal. O thread de mixer rápido, se existir, é subserviente ao thread de mixer normal e atua sob seu controle.

Misturador rápido

Características

O thread de mixer rápido oferece estes recursos:

  • Mistura da sub-mistura do misturador normal e até 7 faixas rápidas do cliente
  • Atenuação por trilha

Recursos omitidos:

  • Conversão de taxa de amostragem por trilha
  • Efeitos por trilha
  • Por efeitos de mixagem

Período

O misturador rápido é executado periodicamente, com um período recomendado de dois a três milissegundos (ms), ou um período ligeiramente superior de cinco ms se necessário para a estabilidade do agendamento. Esse número foi escolhido de forma que, considerando o pipeline de buffer completo, a latência total seja da ordem de 10 ms. Valores menores são possíveis, mas podem resultar em aumento do consumo de energia e chance de falhas, dependendo da previsibilidade do agendamento da CPU. Valores maiores são possíveis, até 20 ms, mas resultam em latência total degradada e, portanto, devem ser evitados.

Agendamento

O misturador rápido funciona com prioridade SCHED_FIFO elevada. Ele precisa de muito pouco tempo de CPU, mas deve ser executado com freqüência e com baixo jitter de agendamento. Jitter expressa a variação no tempo de ciclo: é a diferença entre o tempo de ciclo real e o tempo de ciclo esperado. Executar tarde demais resultará em falhas devido a underrun. Correr muito cedo resultará em falhas devido ao puxar de uma pista rápida antes que a pista forneça dados.

Bloqueando

Idealmente, o thread do misturador rápido nunca bloqueia, exceto em HAL write() . Outras ocorrências de bloqueio no misturador rápido são consideradas bugs. Em particular, mutexes são evitados. Em vez disso, são usados ​​algoritmos sem bloqueio (também conhecidos como algoritmos sem bloqueio). Consulte Evitando Inversão de Prioridade para obter mais informações sobre este tópico.

Relacionamento com outros componentes

O mixer rápido tem pouca interação direta com os clientes. Em particular, ele não vê operações de nível de binder, mas acessa o bloco de controle de memória compartilhada do cliente.

O mixer rápido recebe comandos do mixer normal por meio de uma fila de estados.

Além de extrair dados da trilha, a interação com os clientes é feita por meio do mixer normal.

O coletor primário do mixer rápido é o HAL de áudio.

Mixer normal

Características

Todos os recursos estão ativados:

  • Até 32 faixas
  • Atenuação por trilha
  • Conversão de taxa de amostragem por trilha
  • Processamento de efeitos

Período

O período é calculado para ser o primeiro múltiplo integral do período do mixer rápido que é> = 20 ms.

Agendamento

O mixer normal funciona com prioridade SCHED_OTHER elevada.

Bloqueando

O misturador normal tem permissão para bloquear, e freqüentemente o faz em vários mutexes, bem como em um tubo de bloqueio para gravar sua sub-mistura.

Relacionamento com outros componentes

O mixer normal interage extensivamente com o mundo externo, incluindo encadeamentos de fichário, gerenciador de política de áudio, encadeamento de mixer rápido e trilhas de cliente.

O dissipador do mixer normal é um tubo de bloqueio para a faixa 0 do mixer rápido.

Bandeiras

AUDIO_OUTPUT_FLAG_FAST bit é uma dica. Não há garantia de que a solicitação será atendida.

AUDIO_OUTPUT_FLAG_FAST é um conceito de nível de cliente. Não aparece no servidor.

TRACK_FAST é um conceito cliente -> servidor.