Esta seção detalha a arquitetura de áudio para implementações Android relacionadas a automóveis. OEMs e outros desenvolvedores Android que implementam um sistema de áudio automotivo devem revisar todo o conteúdo desta seção completamente, além do conteúdo da seção Áudio principal.
Conceitos chave
O Android é responsável pelos sons de infoentretenimento (ou seja, mídia, navegação e comunicações), mas não é diretamente responsável por sinos e avisos que têm requisitos estritos de disponibilidade e tempo. Fontes externas são representadas por aplicativos, que são responsáveis pelo foco de áudio. No entanto, você não pode confiar no foco para seleção e mixagem de som.
O Android 10 inclui as seguintes alterações no suporte de áudio automotivo:
- O contexto de Audio HAL mapeia para
AudioAttributes.usage
para identificar sons; a implementação do Audio HAL é responsável pela mixagem / roteamento específico do contexto. - Os veículos definem um dispositivo de saída genérico (
AUDIO_DEVICE_OUT_BUS
) para uso em sistemas de áudio de veículos; O Android suporta uma instânciaAUDIO_DEVICE_OUT_BUS
por Contexto. -
IAudioControl HAL
fornece extensões específicas do veículo para o HAL de áudio; para obter um exemplo de implementação, consultedevice/generic/car/emulator/audio
. O Android 9 não inclui as propriedadesAUDIO_* VHAL
.
Sons e streams Android
Os sistemas de áudio automotivos lidam com os seguintes sons e fluxos:

O Android gerencia os sons provenientes de aplicativos Android, controlando esses aplicativos e direcionando seus sons para fluxos individuais no HAL com base no tipo de som:
- Streams lógicos , conhecidos como fontes na nomenclatura de áudio central, são marcados com Atributos de Áudio .
- Streams físicos , conhecidos como dispositivos na nomenclatura de áudio principal, não têm informações de contexto após a mixagem.
Para maior confiabilidade, os sons externos (vindos de fontes independentes, como sinos de alerta do cinto de segurança) são gerenciados fora do Android, abaixo do HAL ou mesmo em hardware separado. Os implementadores do sistema devem fornecer um mixer que aceite um ou mais fluxos de entrada de som do Android e, em seguida, combine esses fluxos de forma adequada com as fontes de som externas exigidas pelo veículo. Os fluxos externos podem estar sempre createAudioPatch
ou controlados com pontos de entrada createAudioPatch
no HAL.
A implementação do HAL e o mixer externo são responsáveis por garantir que os sons externos críticos para a segurança sejam ouvidos e por mixar nos streams fornecidos pelo Android e encaminhá-los para alto-falantes adequados.
Sons Android
Os aplicativos podem ter um ou mais players que interagem por meio das APIs Android padrão (por exemplo, AudioManager
para controle de foco ou MediaPlayer
para streaming) para emitir um ou mais fluxos lógicos de dados de áudio. Esses dados podem ser mono de canal único ou surround 7.1, mas são roteados e tratados como uma única fonte. O stream do aplicativo está associado a AudioAttributes que fornecem ao sistema dicas sobre como o áudio deve ser expresso.
Os streams lógicos são enviados por AudioService
e roteados para um (e apenas um) dos streams de saída física disponíveis, cada um dos quais é a saída de um mixer dentro do AudioFlinger. Depois que os atributos de áudio foram mixados em um fluxo físico, eles não estão mais disponíveis.
Cada fluxo físico é então entregue ao HAL de áudio para renderização no hardware. Em aplicativos automotivos, o hardware de renderização pode ser codecs locais (semelhantes aos dispositivos móveis) ou um processador remoto na rede física do veículo. De qualquer forma, é função da implementação do Audio HAL fornecer os dados de amostra reais e torná-los audíveis.
Streams externos
Os fluxos de som que não devem ser roteados pelo Android (por motivos de certificação ou de tempo) podem ser enviados diretamente para o mixer externo. Em muitos casos, o Android não precisa saber que esses sons existem, pois o mixer externo pode mixá-los com os sons do Android. Se um som precisa ser reduzido ou direcionado para diferentes alto-falantes, o mixer externo pode fazer isso de forma invisível para o Android.
Se streams externos forem fontes de mídia que devem interagir com o ambiente de som que o Android está gerando (por exemplo, pare a reprodução de MP3 quando um sintonizador externo for ligado), esses streams externos devem ser representados por um aplicativo Android. Tal aplicativo solicitaria foco de áudio e responderia às notificações de foco iniciando / parando a fonte externa conforme necessário para se ajustar à política de foco do Android. Um mecanismo sugerido para controlar esses dispositivos externos é AudioManager.createAudioPatch()
.
Foco de áudio
Antes de iniciar um stream lógico, um aplicativo deve solicitar foco de áudio usando os mesmos atributos de áudio que usará para seu stream lógico. Embora o envio de tal solicitação de foco seja recomendado, ele não é imposto pelo sistema. Alguns aplicativos podem pular explicitamente o envio da solicitação para atingir comportamentos específicos (por exemplo, para reproduzir sons intencionalmente durante uma chamada).
Por esse motivo, você deve considerar o foco como uma forma de controlar indiretamente e desconfigurar a reprodução de mídia e não como um mecanismo de controle de áudio primário; o veículo não deve depender do sistema de foco para operação do subsistema de áudio. A percepção de foco não faz parte do HAL e não deve ser usada para influenciar o roteamento de áudio .
Bus de saída
No nível de áudio HAL, o tipo de dispositivo AUDIO_DEVICE_OUT_BUS
fornece um dispositivo de saída genérico para uso em sistemas de áudio de veículos. O dispositivo de barramento oferece suporte a portas endereçáveis (onde cada porta é o ponto final de um fluxo físico) e deve ser o único tipo de dispositivo de saída compatível em um veículo.
Uma implementação de sistema pode usar uma porta de barramento para todos os sons do Android, caso em que o Android mistura tudo e entrega como um único fluxo. Como alternativa, o HAL pode fornecer uma porta de barramento para cada contexto para permitir a entrega simultânea de qualquer tipo de som. Isso possibilita que a implementação HAL mixe ou abaixe os diferentes sons conforme desejado.
A atribuição de contextos às portas de barramento é feita por meio do HAL de controle de áudio e cria vários: um relacionamento entre contextos e portas de barramento.
Entrada de microfone
Ao capturar áudio, o Audio HAL recebe uma chamada openInputStream
que inclui um argumento AudioSource
indicando como a entrada do microfone deve ser processada.
A fonte VOICE_RECOGNITION
pode esperar um fluxo de microfone estéreo que possui um efeito de cancelamento de eco (se disponível), mas sem nenhum outro processamento aplicado a ele. Espera-se que a formação de feixes seja feita pelo app assistente de voz.
Entrada de microfone multicanal
Para capturar áudio de um dispositivo com mais de dois canais (estéreo), use uma máscara de índice de canal em vez de uma máscara de índice posicional (como CHANNEL_IN_LEFT
). Exemplo:
final AudioFormat audioFormat = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(44100) .setChannelIndexMask(0xf /* 4 channels, 0..3 */) .build(); final AudioRecord audioRecord = new AudioRecord.Builder() .setAudioFormat(audioFormat) .build(); audioRecord.setPreferredDevice(someAudioDeviceInfo);
Quando setChannelMask
e setChannelIndexMask
são definidos, AudioRecord
usa apenas o valor definido por setChannelMask
(máximo de dois canais).
Captura simultânea
A estrutura do Android não permite a captura simultânea para a maioria dos tipos de dispositivos de áudio de entrada, mas faz exceções para AUDIO_DEVICE_IN_BUS
e AUDIO_DEVICE_IN_FM_TUNER
tratando-os como dispositivos virtuais. Fazer isso significa que a estrutura pressupõe que não há competição por recursos entre esses dispositivos e, portanto, qualquer / todos eles podem ser capturados simultaneamente com um dispositivo de entrada regular (como o microfone). Se houver restrições de hardware na captura simultânea entre esses dispositivos, essas restrições devem ser tratadas pela lógica do aplicativo personalizado nos aplicativos primários projetados para usar esses dispositivos de entrada.
Os aplicativos projetados para funcionar com dispositivos AUDIO_DEVICE_IN_BUS
ou com dispositivos AUDIO_DEVICE_IN_FM_TUNER
secundários devem se basear na identificação explícita desses dispositivos e no uso de AudioRecord.setPreferredDevice()
para ignorar a lógica de seleção de origem padrão do Android.
Volume e grupos de volume
O Android 8.xe inferior oferece suporte a três grupos de volume (toque, mídia e alarme), juntamente com um grupo oculto para chamadas telefônicas. Cada grupo pode ser definido para um nível de volume diferente com base no dispositivo de saída, como volumes mais altos para alto-falantes e volumes mais baixos para fones de ouvido).
O Android 9 e superior inclui um grupo de volume de voz e os contextos relacionados a automóveis, conforme mostrado abaixo.
Grupo de volume | Contextos de áudio | Descrição |
---|---|---|
Anel | CALL_RING_CONTEXT | Chamada de voz tocando |
NOTIFICATION_CONTEXT | Notificações | |
ALARM_CONTEXT | Som de alarme do Android | |
SYSTEM_SOUND_CONTEXT | Som do sistema do Android | |
meios de comunicação | MUSIC_CONTEXT | Reprodução de música |
telefone | CALL_CONTEXT | Chamada de voz |
Discurso | NAVIGATION_CONTEXT | Direções de navegação |
VOICE_COMMAND_CONTEXT | Sessão de comando de voz |
Quando o valor de um grupo de volume é atualizado, o CarAudioService
da CarAudioService
trata da configuração dos ganhos de fluxo físico afetados. O volume de fluxo físico em um veículo é baseado no grupo de volume (em vez de stream_type
) e cada grupo de volume consiste em um ou mais contextos de áudio. Cada instância de AudioAttributes.USAGE
mapeia para um contexto de áudio em CarAudioService
e pode ser configurada para ser roteada para um barramento de saída (consulte Configurando volume e Configurando grupos de volume ).
O Android 9 simplificou o controle do volume do hardware no amplificador:
- Cada grupo de volume é roteado para um ou mais barramentos de saída. O volume de um grupo específico pode ser alterado usando a IU de configurações do carro ou por meio de um evento de chave
KEYCODE_VOLUME_UP
ouKEYCODE_VOLUME_DOWN
geradoKEYCODE_VOLUME_DOWN
. - Em resposta,
CarAudioService
chamaAudioManager.setAudioPortGain()
com as portas do dispositivo de áudio vinculadas ao grupo de volume de destino. No HAL, isso aparece como uma série de uma ou mais chamadas paraIDevice.setAudioPortConfig()
com o valor de ganho de volume para cada fluxo de saída física associado ao grupo de volume deIDevice.setAudioPortConfig()
.
Você pode configurar o valor de ganho máximo, mínimo e passo para cada porta de dispositivo de áudio em audio_policy_configuration.xml
. Para obter uma configuração de amostra e detalhes sobre como substituir o conjunto padrão de grupos de volume, consulte Configurando dispositivos de áudio.