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

Áudio automotivo

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ância AUDIO_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, consulte device/generic/car/emulator/audio . O Android 9 não inclui as propriedades AUDIO_* VHAL .

Sons e streams Android

Os sistemas de áudio automotivos lidam com os seguintes sons e fluxos:

Figura 1. Diagrama de arquitetura centrada em fluxo

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 ou KEYCODE_VOLUME_DOWN gerado KEYCODE_VOLUME_DOWN .
  • Em resposta, CarAudioService chama AudioManager.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 para IDevice.setAudioPortConfig() com o valor de ganho de volume para cada fluxo de saída física associado ao grupo de volume de IDevice.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.