Configuration du système audio de la voiture

Dans Android 10, car_audio_configuration.xml a remplacé car_volumes_groups.xml et IAudioControl.getBusForContext. Les fichiers de stratégie audio, généralement contenus dans la partition du fournisseur, représentent la configuration matérielle audio de la carte. Tous les appareils référencés dans car_audio_configuration.xml doivent être définis dans audio_policy_configuration.xml.

La figure 1 ci-dessous présente une vue d'ensemble de l'architecture du service audio pour voiture, dans laquelle le service lit le fichier de configuration audio pour configurer l'audio de l'appareil.

Présentation de l'architecture audio pour voitures

Figure 1 : Présentation de l'architecture audio pour voitures

Placez le fichier de configuration de l'audio de la voiture dans vendor\etc\ ou system\etc\ sur l'appareil, vendor\etc\ étant le premier emplacement où le service audio de la voiture recherche le fichier. Les services audio de la voiture lisent car_audio_configuration.xml pour déterminer la configuration audio.

Zones audio pour voiture:

  • Chaque zone audio contient un ID de zone audio unique.
  • Chaque zone audio peut être mappée sur une zone d'occupant.
  • Les actions audio de chaque zone sont indépendantes les unes des autres:

    • Priorité audio
    • Routage audio
    • Atténuation audio
  • Groupes de volumes de la voiture:

    • Tous les appareils audio contenant un groupe de volume sont contrôlés ensemble avec les mêmes changements de gain. La configuration du gain audio pour tous les appareils d'un groupe doit être la même.

    • Mappage du contexte audio sur les appareils audio. Utilisez-le pour créer un mix audio qui met en correspondance les utilisations audio avec un périphérique de sortie.

    • Tous les contextes audio doivent être représentés dans une zone. Cela permet de configurer précisément le routage audio pour tous les cas d'utilisation de l'attribut audio.

Contextes audio

Pour simplifier la configuration de l'audio AAOS, les utilisations similaires ont été regroupées dans CarAudioContexts. Ces contextes audio sont utilisés dans l'ensemble de CarAudioService pour définir le routage, les groupes de volume, la mise au point audio et la gestion du masquage. Vous trouverez ci-dessous les contextes audio statiques dans AAOS.

Ce tableau décrit le mappage entre les contextes audio et les utilisations. Les lignes en surbrillance sont fournies pour une nouvelle utilisation du système.

CarAudioContext AttributUsages associés
MUSIQUE UNKNOWN
GAME
MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
APPELER VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
ALARME ALARM
NOTIFICATION NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
URGENCE EMERGENCY
SÉCURITÉ SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNONCE ANNOUNCEMENT

Activer le routage AAOS

Pour utiliser le routage basé sur AAOS, vous devez définir l'indicateur audioUseDynamicRouting sur true:

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

Lorsque false, l'acheminement et une grande partie de CarAudioService sont désactivés, AAOS revient au comportement par défaut de AudioService.

Zone principale

Par défaut, tous les contenus audio sont acheminés vers la zone principale. Il n'existe qu'une seule zone principale, qui est indiquée dans la configuration par l'attribut isPrimary="true". La zone principale est automatiquement attribuée à Audiomanager.PRIMARY_AUDIO_ZONE.

Exemple de configuration (version 2)

Par exemple, un véhicule peut avoir deux zones, une zone principale et un système de divertissement pour les sièges arrière. Dans ce scénario, vous pouvez concevoir une version 2 possible de car_audio_configuration.xml comme suit:

<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>

Dans cet exemple, la zone principale sépare certains contextes audio sur différents appareils. Cela permet au HAL d'appliquer différents effets de post-traitement et de mixer la sortie sur chaque appareil à l'aide du matériel du véhicule. Les appareils ont été répartis en plusieurs groupes de volume: multimédia, navigation, appels, alarmes et sons système. Si le système est configuré sur useFixedVolume, les niveaux de volume de chaque groupe sont transmis au HAL pour s'appliquer à la sortie de ces appareils.

Pour la zone principale, nous vous recommandons de séparer les sons système des autres sons. Cela permet de traiter les sons des véhicules avec une priorité plus élevée. Le service audio de la voiture fait déjà ces distinctions pour les sons du véhicule en termes de gestion de la mise au point et du masquage. Par exemple, une requête de mise au point du son d'urgence a une priorité plus élevée qu'une autre requête de mise au point.

Pour simplifier les choses, dans l'exemple de zone secondaire, tous les contextes audio sont acheminés vers un seul appareil et un seul groupe de volume.

Configuration audio de la zone d'occupant

Dans Android 11, car_audio_configuration.xml a introduit deux nouveaux champs, audioZoneId et occupantZoneId. Vous pouvez utiliser audioZoneId pour contrôler la gestion des zones audio. Vous pouvez utiliser occupantZoneId pour configurer le routage en fonction de l'ID utilisateur.

En revenant sur la configuration audio ci-dessus, mais en utilisant le nouveau champ pour le mappage de l'ID de zone d'occupant et de l'ID de zone audio, la nouvelle configuration sans les définitions de groupe de volume peut être configurée comme suit.

<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>

La configuration ci-dessus définit un mappage de la zone principale à la zone occupant 0 et de audioZoneId 1 à occupantZoneId 1. En règle générale, vous pouvez configurer n'importe quel mappage entre la zone d'occupant et la zone audio. Toutefois, le mappage doit être individuel. Les règles qui définissent les deux nouveaux champs sont listées ci-dessous.

  • audioZoneId pour la zone principale est toujours l'ID PRIMARY_AUDIO_ZONE. Si isPrimary="true" est défini, audioZoneId n'est pas nécessaire.

  • Les numéros audioZoneId et occupantZoneId ne peuvent pas être répétés.

  • audioZoneId et occupantZoneId ne peuvent être mappés qu'un à un.

Configuration de l'audio de la voiture sous Android 14

Dans Android 14, AAOS a introduit le service de plug-in OEM, qui vous permet de gérer plus activement le comportement audio supervisé par le service audio de la voiture. En plus des nouveaux services de plug-in, les modifications suivantes sont ajoutées au fichier de configuration audio de la voiture:

  • Contexte audio de la voiture défini par l'OEM
  • Configurations dynamiques de zones non principales

Contexte audio de la voiture défini par l'OEM

Pour permettre une configuration audio flexible, dans Android 14, le service audio de la voiture permet de regrouper les utilisations audio différemment des contextes audio statiques définis ci-dessus. Ce contexte défini par l'OEM peut être défini dans le fichier car_audio_configuration.xml version 3.

Les contextes audio statiques actuellement définis sont utilisés à la place. Le format général du contexte audio de voiture défini par l'OEM est illustré ci-dessous.

Les contextes OEM nécessitent chacun un name, ainsi qu'une liste d'utilisation des attributs audio attribués au contexte. Dans l'exemple ci-dessus, deux contextes sont définis:

<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>
...
  • Le contexte media contient AUDIO_USAGE_MEDIA et AUDIO_USAGE_UNKNOWN
  • Le contexte game ne contient que AUDIO_USAGE_GAME.

Le contexte doit être défini en haut du fichier car_audio_configuration.xml. Lorsque les contextes OEM sont définis, le reste de la configuration audio de la voiture peut se poursuivre comme avant. Les règles suivantes s'appliquent au contexte audio de la voiture:

  • Les définitions de contexte OEM sont facultatives. Le contexte audio statique est utilisé à la place.

  • Ne répétez pas les noms de contextes.

  • N'attribuez pas l'utilisation de l'attribut audio à plusieurs contextes.

  • Tous les usages audio définis dans AudioAttributes doivent être utilisés pour construire le contexte.

À strictement parler, la représentation de la chaîne android.audio.policy.configuration.V7_0.AudioUsage de l'utilisation de l'audio doit être utilisée pour la définition du contexte audio OEM. À l'avenir, les utilisations des attributs audio les plus récentes seront attribuées au contexte le plus approprié afin de réduire les erreurs lors de la migration d'une version Android à une autre.

Bien que le contexte défini par l'OEM ait été introduit pour développer davantage le service audio du plug-in OEM, il peut toujours être utilisé sans le service du plug-in OEM. Le comportement audio ressemble à celui du service audio statique:

  • Interactions avec la priorité audio. L'attribut audio permet de déterminer le comportement de mise en correspondance le plus adapté, tel que défini par la matrice d'interactions de mise au point audio. Pour en savoir plus, consultez Concentration audio.

  • L'attribut audio de commande du volume audio permet de déterminer la meilleure correspondance:

    • Groupe de volumes en fonction du contexte défini par l'OEM.
    • Priorité de la liste de volumes statiques configurée.
  • Comportement de l'atténuation audio:

    • L'utilisation de l'attribut audio pour le focus audio actuel permet de mapper les informations sur l'appareil audio de sortie, comme défini dans le fichier de configuration audio de la voiture.

    • L'attribut audio permet de mapper le contexte statique correspondant au masquage, en fonction de la matrice de masquage audio statique.

Configuration des zones audio dynamiques

Dans Android 14, pour permettre une configuration dynamique des zones audio, le schéma de configuration audio de la voiture pour définir les zones audio est également mis à jour vers la version 3. Le nouveau schéma nécessite une configuration pour chaque zone.

<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>

Pour en savoir plus, consultez le fichier de la version 3 défini dans device/generic/car/emulator/audio/car_audio_configuration.xml. À partir d'Android 14, la zone principale ne peut avoir qu'une seule configuration. Les zones non principales peuvent avoir plusieurs configurations. Les règles suivantes s'appliquent aux configurations audio pour voitures:

  • La zone audio principale ne peut avoir qu'une seule configuration.

  • Les zones audio non principales peuvent avoir plusieurs configurations.

  • Le nom doit être unique pour chaque zone audio et configuration de zone audio.

  • Dans une zone audio, les configurations audio peuvent varier:

    • La configuration des groupes de volumes n'a pas besoin d'être identique.
    • L'attribution du contexte audio n'a pas besoin d'être identique.
  • Les noms des périphériques de sortie audio doivent être uniques pour toutes les zones ou configurations. Un nom d'appareil ne doit apparaître qu'une seule fois dans une configuration audio ou dans des zones.

  • Les appareils audio appartenant au même groupe de volume doivent avoir les mêmes configurations de gain audio.

  • Tous les contextes audio (OEM ou statiques) doivent être attribués pour chaque configuration audio.

Compatibilité ascendante

Bien que les nouvelles versions de car_audio_configuration.xml introduisent de nouvelles fonctionnalités à chaque mise à jour, vous pouvez toujours utiliser d'anciens fichiers dans les versions plus récentes d'AAOS. Les OEM qui passent à de nouvelles versions d'Android peuvent réutiliser le fichier car_audio_configuration.xml.

Pour utiliser une nouvelle fonctionnalité qui nécessite de nouvelles informations contenues dans la car_audio_configuration.xml, la version doit être mise à jour. La tentative d'utilisation d'une ancienne version d'un fichier contenant des informations non compatibles avec cette version génère une exception IllegalStateException lorsque le service de voiture est démarré. Le message d'exception contient les informations pertinentes sur les informations utilisées et la version minimale requise.