Configuração de áudio do carro

No Android 10, car_audio_configuration.xml substituiu car_volumes_groups.xml e IAudioControl.getBusForContext. Os arquivos de política de áudio, normalmente contidos na partição do fornecedor, representam a configuração de hardware de áudio da placa. Todos os dispositivos referenciados em car_audio_configuration.xml precisam ser definidos em audio_policy_configuration.xml.

A Figura 1 ilustra uma visão geral da arquitetura do serviço de áudio do carro, em que ele lê o arquivo de configuração para definir o áudio do dispositivo.

Visão geral da arquitetura de áudio do carro

Figura 1. Visão geral da arquitetura de áudio do carro.

Coloque o arquivo de configuração de áudio do carro em vendor/etc/ ou system/etc/ no dispositivo. O vendor/etc/ é o primeiro lugar em que o serviço de áudio do carro procura o arquivo. Os serviços de áudio do carro leem car_audio_configuration.xml para determinar a configuração de áudio.

Zonas de áudio do carro:

  • Cada zona de áudio tem um ID exclusivo.
  • Cada zona de áudio pode ser mapeada para uma zona de ocupante.
  • As ações de áudio em cada zona são independentes umas das outras:

    • Seleção de áudio
    • Roteamento de áudio
    • Redução de áudio
  • Grupos de volume de carros:

    • Todos os dispositivos de áudio que contêm um grupo de volume são controlados juntos com as mesmas mudanças de ganho. A configuração de ganho de áudio para todos os dispositivos em um grupo precisa ser a mesma.

    • Mapeamento do contexto de áudio para dispositivos de áudio. Use isso para criar uma mixagem de áudio que mapeia usos de áudio para um dispositivo de saída.

    • Todos os contextos de áudio precisam ser representados em uma zona. Isso permite que o roteamento de áudio seja configurado corretamente para todos os usos de atributos de áudio.

Contextos de áudio

Para simplificar a configuração do áudio do AAOS, usos semelhantes foram agrupados em CarAudioContexts. Esses contextos de áudio são usados em todo o CarAudioService para definir roteamento, grupos de volume, foco de áudio e gerenciamento de ducking. Os contextos de áudio estáticos no AAOS estão listados nesta tabela.

Esta tabela descreve o mapeamento entre contextos e usos de áudio. As linhas destacadas são fornecidas para um novo uso do sistema.

CarAudioContext Associated AttributeUsages
MUSIC UNKNOWN
GAME
MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

Ativar o roteamento do AAOS

Para usar o roteamento baseado no AAOS, defina a flag audioUseDynamicRouting como true:

<resources>
    <bool name="audioUseDynamicRouting">true</bool>
</resources>

Quando false, o roteamento e grande parte de CarAudioService são desativados, o AAOS volta ao comportamento padrão do AudioService.

Mecanismo de política de áudio configurável

Para estender ainda mais o gerenciamento de áudio do carro no Android 14, o AAOS introduziu o uso do gerenciamento de áudio pelo mecanismo de política de áudio configurável (CAP). Isso oferece mais flexibilidade para controlar o roteamento de áudio e o gerenciamento de volume, além de permitir uma definição versátil de:

É possível ativar o mecanismo de política de áudio configurável (CAP) usando useCoreAudioVolume e useCoreAudioRouting. Consulte Mecanismo de política de áudio configurável para mais detalhes.

Zona principal

Por padrão, todo o áudio é encaminhado para a zona principal. Existe apenas uma zona principal, que é indicada na configuração pelo atributo isPrimary="true". A zona principal recebe automaticamente o Audiomanager.PRIMARY_AUDIO_ZONE.

Exemplo de configuração (versão 2)

Por exemplo, um veículo pode ter duas zonas: uma principal e um sistema de entretenimento no banco traseiro. Nesse cenário, você pode criar uma possível versão 2 do car_audio_configuration.xml da seguinte maneira:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
               <group>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

Neste exemplo, a zona principal separa alguns contextos de áudio para dispositivos diferentes. Isso permite que a HAL aplique diferentes efeitos de pós-processamento e misture a saída em cada dispositivo usando o hardware do veículo. Os dispositivos foram organizados em vários grupos de volume: mídia, navegação, chamadas, alarmes e sons do sistema. Se o sistema estiver configurado para useFixedVolume, os níveis de volume de cada grupo serão transmitidos para a HAL para serem aplicados à saída desses dispositivos.

Para a zona principal, recomendamos que os sons do sistema sejam separados de outros sons. Isso permite que os sons de veículos sejam tratados com maior prioridade. O serviço de áudio do carro já faz essas distinções para sons de veículos em termos de foco e gerenciamento de redução. Por exemplo, uma solicitação de foco de som de emergência tem prioridade maior do que outra solicitação de foco.

No exemplo de zona secundária, todos os contextos de áudio são encaminhados para um único dispositivo e um grupo de volumes.

Definição do grupo de volumes para o mecanismo CAP

Para usar o gerenciamento de volume pelo mecanismo CAP, conforme mencionado em Mecanismo de política de áudio configurável, a definição do grupo de volume também precisa ter um nome:


<group name="media">
  <device address="bus0_media_out">
    <context context="music"/>
    <context context="announcement"/>
  </device>
  <device address="bus3_call_ring_out">
     <context context="call_ring"/>
  </device>
  <device address="bus6_notification_out">
    <context context="notification"/>
  </device>
</group>
<group name="navigation">
  <device address="bus1_navigation_out">
    <context context="navigation"/>
  </device>
  <device address="bus2_voice_command_out">
    <context context="voice_command"/>
  </device>
</group>

O nome do grupo de volumes precisa corresponder ao nome do volume definido no mecanismo CAP. Além disso, o useFixedVolume também precisa ser definido como false. Consulte Flags de configuração de áudio do AAOS para mais detalhes.

Configuração de áudio da zona do ocupante

No Android 11, car_audio_configuration.xml introduziu dois novos campos, audioZoneId e occupantZoneId. Você pode usar audioZoneId para controlar o gerenciamento de zonas de áudio. Use occupantZoneId para configurar o roteamento com base no ID do usuário.

Revisando a configuração de áudio, mas usando o novo campo para mapeamento de ID da zona do ocupante e ID da zona de áudio, a nova configuração sem as definições de grupo de volume pode ser configurada da seguinte maneira:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

A configuração define um mapeamento da zona principal para a zona de ocupante 0 e de audioZoneId 1 para occupantZoneId 1. É possível configurar qualquer mapeamento entre a zona do ocupante e a zona de áudio. No entanto, o mapeamento precisa ser um para um. As regras que definiram os dois novos campos são:

  • audioZoneId para a zona primária é sempre o ID PRIMARY_AUDIO_ZONE. Se isPrimary="true" estiver definido, audioZoneId não será necessário.

  • Os números audioZoneId e occupantZoneId não podem ser repetidos.

  • audioZoneId e occupantZoneId só podem ter um mapeamento de um para um.

Configuração de áudio do carro no Android 14

No Android 14, o AAOS introduziu o serviço de plug-in OEM, que permite gerenciar o comportamento de áudio supervisionado pelo serviço de áudio do carro. Além dos novos serviços de plug-in, as seguintes mudanças são adicionadas ao arquivo de configuração de áudio do carro:

  • Contexto de áudio do carro definido pelo OEM
  • Configurações dinâmicas de zonas não principais

Contexto de áudio do carro definido pelo OEM

Para ativar uma configuração de áudio flexível, no Android 14, o serviço de áudio do carro permite que os usos de áudio sejam agrupados de maneira diferente dos contextos de áudio estáticos definidos. Esse contexto definido pelo OEM pode ser definido no arquivo car_audio_configuration.xml versão 3.

Em vez disso, são usados os contextos de áudio estáticos predefinidos. O formato geral do contexto de áudio do carro definido pelo OEM é mostrado mais adiante.

Cada contexto de OEM exige um name e uma lista de atributos de áudio de uso atribuídos ao contexto. No exemplo anterior, dois contextos são definidos:

<carAudioConfiguration version="3">
    <oemContexts>
        <oemContext name="media">
            <audioAttributes>
                <usage value="AUDIO_USAGE_MEDIA" />
    <usage value="AUDIO_USAGE_UNKNOWN"/>
            </audioAttributes>
        </oemContext>
        <oemContext name="game">
            <audioAttributes>
                <usage value="AUDIO_USAGE_GAME" />
            </audioAttributes>
        </oemContext>
...
  • O contexto media contém AUDIO_USAGE_MEDIA e AUDIO_USAGE_UNKNOWN
  • O contexto game contém apenas AUDIO_USAGE_GAME

O contexto precisa ser definido na parte de cima do arquivo car_audio_configuration.xml. Quando os contextos do OEM são definidos, o restante da configuração de áudio do carro pode prosseguir como antes. As regras a seguir se aplicam ao contexto de áudio do carro:

  • As definições de contexto do OEM são opcionais. Em vez disso, o contexto de áudio estático é usado.

  • Não repita os nomes dos contextos.

  • Não atribua o uso do atributo de áudio a vários contextos.

  • Todos os usos de áudio definidos em AudioAttributes precisam ser usados para construir o contexto.

Falando estritamente, a representação de string android.audio.policy.configuration.V7_0.AudioUsage do uso de áudio precisa ser usada para a definição do contexto de áudio do OEM. No futuro, os usos mais recentes de atributos de áudio serão atribuídos ao contexto mais adequado para reduzir erros durante a migração de uma versão do Android para outra.

Embora o contexto definido pelo OEM tenha sido introduzido para expandir ainda mais o serviço de áudio do plug-in do OEM, ele ainda pode ser usado sem o serviço de plug-in do OEM. O comportamento do áudio é semelhante ao do serviço de áudio estático:

  • Interações de seleção de áudio. O atributo de áudio é usado para determinar o melhor comportamento correspondente, conforme definido pela matriz de interação de foco de áudio. Para detalhes, consulte Foco de áudio.

  • O atributo de áudio do controle de volume é usado para determinar a melhor correspondência:

    • Grupo de volume com base no contexto definido pelo OEM.
    • Prioridade da lista de volumes estáticos configurada.
  • Comportamento de redução de áudio:

    • O uso do atributo de áudio para o foco de áudio atual é usado para mapear as informações do dispositivo de áudio de saída, conforme definido no arquivo de configuração de áudio do carro.

    • O atributo de áudio é usado para mapear o contexto estático correspondente para reduzir o volume, com base na matriz estática de redução de volume de áudio.

Estratégias de produtos do mecanismo CAP

Quando um dispositivo precisa usar o mecanismo CAP para gerenciamento de volume ou roteamento, o contexto definido pelo OEM precisa corresponder à definição da estratégia de produto do mecanismo CAP. Caso contrário, use o contexto definido pelo OEM sem o mecanismo CAP.

Para saber mais, consulte a estratégia de produto do mecanismo CAP no AAOS.

Configurações de zonas de áudio dinâmicas

No Android 14, para acomodar uma configuração dinâmica de zonas de áudio, o esquema de configuração de áudio do carro para definir zonas de áudio também é atualizado para a versão 3. O novo esquema exige que uma configuração seja definida para cada zona.

<carAudioConfiguration version="3">
    <!-- optional OEM context -->
    <oemContexts>
      <oemContext name="media">
        <audioAttributes>
          <usage value="AUDIO_USAGE_MEDIA" />
          <usage value="AUDIO_USAGE_UNKNOWN"/>
        </audioAttributes>
      </oemContext>
      <oemContext name="game">
        <audioAttributes>
          <usage value="AUDIO_USAGE_GAME" />
        </audioAttributes>
      </oemContext>
...
    </oemContexts>
  <zones>
    <zone name="primary zone" isPrimary="true" occupantZoneId="0">
      <zoneConfigs>
        <zoneConfig name="primary zone config 0" isDefault="true">
          <volumeGroups>
            <group>
              <device address="bus0_media_out">
                <context context="media"/>
            <context context="game"/>
                <context context="announcement"/>
              </device>
              <device address="bus6_notification_out">
                <context context="notification"/>
              </device>
            </group>
  ...
      </zoneConfigs>
    </zone
  </zones>

Para saber mais, consulte o arquivo da versão 3 definido em device/generic/car/emulator/audio/car_audio_configuration.xml. A partir do Android 14, a zona principal pode ter apenas uma configuração. As zonas não principais podem ter várias configurações. As seguintes regras se aplicam às configurações de áudio do carro:

  • A zona de áudio principal pode ter apenas uma configuração.

  • As zonas de áudio não principais podem ter várias configurações.

  • O nome precisa ser exclusivo para cada zona e configuração de áudio.

  • Em uma zona de áudio, as configurações podem ser diferentes:

    • A configuração dos grupos de volumes não precisa ser a mesma.
    • A atribuição de contexto de áudio não precisa ser a mesma.
  • Os nomes dos dispositivos de saída de áudio precisam ser exclusivos em todas as zonas ou configurações. Um nome de dispositivo deve aparecer apenas uma vez em uma configuração de áudio ou zonas.

  • Os dispositivos de áudio do mesmo grupo de volume precisam ter as mesmas configurações de ganho de áudio.

  • Todos os contextos de áudio (OEM ou estático) precisam ser atribuídos a cada configuração de áudio.

Compatibilidade com versões futuras

Embora as novas versões do car_audio_configuration.xml introduzam novos recursos em cada atualização, ainda é possível usar arquivos mais antigos em versões mais recentes do AAOS. Os OEMs que atualizam para novas versões do Android podem reutilizar o arquivo car_audio_configuration.xml.

Para usar um novo recurso que exige novas informações contidas no car_audio_configuration.xml, a versão precisa ser atualizada. A tentativa de usar uma versão mais antiga de um arquivo com informações não compatíveis com essa versão gera um IllegalStateException quando o serviço do carro é iniciado. A mensagem de exceção contém as informações relevantes sobre quais dados são usados e qual versão mínima é necessária.