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 do hardware de áudio da placa. Todos os dispositivos referenciados em car_audio_configuration.xml devem ser definidos em audio_policy_configuration.xml .

A Figura 1 abaixo ilustra uma visão geral de alto nível da arquitetura do serviço de áudio automotivo, na qual o serviço de áudio automotivo lê o arquivo de configuração de áudio automotivo para configurar o áudio para o dispositivo.

Visão geral da arquitetura de áudio automotivo

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

Coloque o arquivo de configuração de áudio do carro em vendor\etc\ ou system\etc\ no dispositivo, sendo o vendor\etc\ o primeiro local procurado pelo arquivo pelo serviço de áudio automotivo. Os serviços de áudio automotivo lêem car_audio_configuration.xml para determinar a configuração de áudio.

Zonas de áudio do carro:

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

    • Foco de áudio
    • Roteamento de áudio
    • Esquiva de áudio
  • Grupos de volume de carros:

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

    • Contexto de áudio para mapeamento de dispositivos de áudio. Use isto para construir uma mixagem de áudio que mapeie os usos de áudio para um dispositivo de saída.

    • Todos os contextos de áudio devem ser representados dentro de uma zona. Isso permite que o roteamento de áudio seja configurado com precisão para todos os usos de atributos de áudio.

Contextos de áudio

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

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

CarAudioContext Usos de atributos associados
MÚSICA UNKNOWN
GAME
MEDIA
NAVEGAÇÃO ASSISTANCE_NAVIGATION_GUIDANCE
COMANDO DE VOZ ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CHAMAR VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
ALARME ALARM
NOTIFICAÇÃO NOTIFICATION
NOTIFICATION_*
SISTEMA_SOM ASSISTANCE_SONIFICATION
EMERGÊNCIA EMERGENCY
SEGURANÇA SAFETY
VEÍCULO_STATUS VEHICLE_STATUS
ANÚNCIO ANNOUNCEMENT

Habilitar roteamento AAOS

Para usar o roteamento baseado em AAOS, você deve definir o sinalizador audioUseDynamicRouting como true :

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

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

Zona primária

Por padrão, todo o áudio é roteado para a zona primária. Existe apenas uma zona primária, que é indicada na configuração pelo atributo isPrimary="true" . A zona primária é automaticamente atribuída a Audiomanager.PRIMARY_AUDIO_ZONE .

Configuração de amostra (versão 2)

Por exemplo, um veículo pode ter duas zonas, uma zona primária e um sistema de entretenimento no banco traseiro. Neste cenário, você pode projetar um possível car_audio_configuration.xml versão 2 da seguinte forma:

<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 primária separa alguns contextos de áudio para diferentes dispositivos. Isto permite que o 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 passados ​​para o HAL para serem aplicados à saída desses dispositivos.

Para a zona primária, recomendamos que os sons do sistema sejam separados de outros sons. Isto permite que os sons do veículo sejam tratados com maior prioridade. O serviço de áudio automotivo 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 sonoro de emergência tem prioridade mais alta do que outra solicitação de foco.

Para simplificar, no exemplo da zona secundária, todos os contextos de áudio são roteados para um único dispositivo e um grupo de volumes.

Configuração de áudio da zona de ocupação

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

Revisitando a configuração de áudio acima, mas utilizando o novo campo para identificação de zona de ocupante e mapeamento de identificação de zona de áudio, a nova configuração sem as definições de grupo de volumes pode ser definida 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 acima define um mapeamento da zona primária para a zona de ocupante 0 e audioZoneId 1 para occupantZoneId 1. Em geral, qualquer mapeamento entre a zona de ocupante e a zona de áudio pode ser configurado. No entanto, o mapeamento deve ser um para um. As regras que definiram os dois novos campos estão listadas abaixo.

  • audioZoneId para a zona primária é sempre PRIMARY_AUDIO_ZONE id. Se isPrimary="true" for 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 um para um.

Configuração de áudio do carro Android 14

No Android 14, a AAOS introduziu o serviço de plug-in OEM, que permite gerenciar de forma mais ativa o comportamento de áudio supervisionado pelo serviço de áudio automotivo. Junto com os novos serviços de plug-in, as seguintes alterações foram adicionadas ao arquivo de configuração de áudio do carro:

  • Contexto de áudio automotivo definido pelo OEM
  • Configurações dinâmicas de zona não primária

Contexto de áudio automotivo definido pelo OEM

Para permitir uma configuração de áudio flexível, no Android 14, o serviço de áudio automotivo permite que os usos de áudio sejam agrupados de forma diferente dos contextos de áudio estáticos definidos acima. Este 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 atualmente definidos. O formato geral do contexto de áudio automotivo definido pelo OEM é mostrado abaixo.

Cada contexto OEM exige um name junto com uma lista de uso de atributos de áudio atribuídos ao contexto. No exemplo acima, 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>
...
  • contexto media contém AUDIO_USAGE_MEDIA e AUDIO_USAGE_UNKNOWN
  • o contexto game contém apenas AUDIO_USAGE_GAME

O contexto deve ser definido no topo do arquivo car_audio_configuration.xml . Quando os contextos OEM são definidos, o restante da configuração do áudio do carro pode prosseguir como antes. As seguintes regras se aplicam ao contexto de áudio automotivo:

  • As definições de contexto OEM são opcionais. O contexto de áudio estático é usado em seu lugar.

  • Não repita nomes de contextos.

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

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

Estritamente falando, a representação de string android.audio.policy.configuration.V7_0.AudioUsage do uso de áudio deve ser usada para a definição de contexto de áudio OEM. No futuro, os usos mais recentes de atributos de áudio serão atribuídos ao contexto mais apropriado 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 plug-in de áudio OEM, ele ainda pode ser usado sem o serviço de plug-in OEM. O comportamento do áudio é semelhante ao do serviço de áudio estático:

  • Interações de foco de áudio. O atributo de áudio é usado para determinar o melhor comportamento de correspondência conforme configurado pela matriz de interação de foco de áudio. Para obter detalhes, consulte Foco de áudio .

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

    • Grupo de volumes baseado 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 diminuir, com base na matriz de redução de áudio estática.

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 requer 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 primária pode ter apenas uma (1) configuração. As zonas não primárias podem ter diversas configurações. As seguintes regras se aplicam às configurações de áudio automotivo:

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

  • As zonas de áudio não primárias podem ter múltiplas configurações.

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

  • Dentro de uma zona de áudio, as configurações de áudio 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 devem 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.

  • Dispositivos de áudio pertencentes ao mesmo grupo de volume devem ter as mesmas configurações de ganho de áudio.

  • Todos os contextos de áudio (OEM ou estáticos) devem ser atribuídos para cada configuração de áudio.

Compatibilidade futura

Embora as novas versões do car_audio_configuration.xml introduzam novos recursos em cada atualização, você ainda pode 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 utilizar um novo recurso que requer novas informações contidas no car_audio_configuration.xml , a versão deve ser atualizada. A tentativa de usar uma versão mais antiga de um arquivo com informações não suportadas nessa versão do arquivo gera uma IllegalStateException quando o serviço automotivo é iniciado. A mensagem de exceção contém as informações relevantes sobre quais informações são usadas e qual versão mínima é necessária.