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:
- Áudio nativo Android baseado em OpenSL ES ou AAudio
- android.media.SoundPool
- android.media.ToneGenerator
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.