Routage de l'audio

Dans Android 10, car_audio_configuration.xml remplace car_volumes_groups.xml et IAudioControl.getBusForContext. Dans le nouveau fichier de configuration, une liste de zones est définie. Chaque zone comporte un ou plusieurs groupes de volumes avec leurs appareils associés, et chaque appareil possède les contextes à acheminer dans cette zone. Tous les contextes doivent être représentés dans chaque zone.

Configurer le routage audio

Les fichiers de règles audio, qui se trouvent généralement 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.

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 est défini, le routage et une grande partie de CarAudioService sont désactivés, et l'OS 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 ne peut y avoir qu'une seule zone principale, qui est indiquée dans la configuration par l'attribut isPrimary="true".

Exemple de configuration

Par exemple, un véhicule peut avoir deux zones : une zone principale et un système de divertissement pour les sièges arrière. Un car_audio_configuration.xml possible serait alors défini 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>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </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>
           </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>

Ici, la zone principale a séparé les contextes en différents appareils. Cela permet au HAL d'appliquer différents effets de post-traitement et de mixage sur chaque sortie de l'appareil à l'aide du matériel du véhicule. Les appareils ont été répartis en quatre groupes de volume : contenus multimédias, navigation, appels et alarmes. Si le système est configuré sur useFixedVolume, les niveaux de volume de chaque groupe sont transmis au HAL pour être appliqués à la sortie de ces appareils.

Pour la zone secondaire, la sortie attendue est via un seul périphérique de sortie. Dans cet exemple, tous les usages sont acheminés vers un seul appareil et un seul groupe de volumes pour simplifier les choses.

Configuration audio de la zone d'occupant

Dans Android 11, car_audio_configuration.xml a été étendu pour introduire deux nouveaux champs, audioZoneId et occupantZoneId. Le premier, audioZoneId, permet de mieux contrôler la gestion des zones. En revanche, occupantZoneId peut être utilisé pour configurer l'acheminement basé sur l'ID utilisateur.

Pour utiliser ces nouveaux champs, la version 2 de car_audio_configuration.xml est requise. En revenant à 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 général, tout mappage entre la zone d'occupant et la zone audio peut être configuré, mais le mappage doit être de type "un à un". Voici les règles qui définissent les deux nouveaux champs:

  • La valeur audioZoneId de la zone principale est toujours nulle.
  • Les numéros audioZoneId et occupantZoneId ne peuvent pas se répéter.
  • audioZoneId et occupantZoneId ne peuvent être mappés qu'un à un.

Routage via un UID d'application

Une série d'API masquées a été introduite dans CarAudioManager en version 10 pour permettre aux applications de interroger et de définir des zones audio et de mise au point.

int[] getAudioZoneIds();
int getZoneIdForUid(int uid);
boolean setZoneIdForUid(int zoneId, int uid);
boolean clearZoneIdForUid(int uid);

Les API ci-dessus permettaient à une application propriétaire de gérer le routage audio en fonction de l'UID d'une application. Par conséquent, l'ID de la zone audio et l'UID de l'application sont également nécessaires. Une fois ces informations en main, vous pouvez définir le routage audio à l'aide de l'API CarAudioManager#setZoneIdForUid.

Modifier les zones d'une application

Par défaut, tous les flux audio sont acheminés vers la zone principale. Pour mettre à jour une application afin qu'elle soit acheminée vers une autre zone, utilisez CarAudioManager#setZoneIdForUid:

// Find zone to play
int zoneId = ...

// Find application's uid
Int uid = mContext.getPackageManager()
        .getApplicationInfo(mContext.getPackageName(), 0)
        .uid;

if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) {
    Log.d(TAG, "Zone successfully updated");
} else {
    Log.d(TAG, "Failed to change zone");
}

N Remarque:Les flux et la sélection ne peuvent pas changer de zone de manière dynamique. Par conséquent, la lecture doit être arrêtée et la mise au point doit être à nouveau demandée pour changer de zone.

Routage avec l'ID utilisateur

Bien que le routage basé sur l'UID d'une application permette de contrôler précisément le routage audio de chaque application, il nécessite également que le routage audio de chaque application soit défini avant que l'application ne demande réellement la priorité audio et ne lise l'audio. Pour atténuer ce problème et permettre aux applications tierces de lire de l'audio sans modification, CarAudioService utilise la zone des occupants de la voiture et la cartographie des zones audio pour définir l'acheminement basé sur l'ID utilisateur. Ainsi, lorsqu'un utilisateur se connecte à la zone d'occupant, le service audio de la voiture en est informé. Avec ce signal, la gestion et le routage du focus audio sont automatiquement configurés pour toutes les zones audio.

Le routage basé sur l'UID des applications peut toujours être utilisé, mais doit être effectué indépendamment du routage basé sur l'ID utilisateur. Cela signifie que si la mise en correspondance de la zone des occupants avec la zone audio de la voiture est définie, le routage basé sur l'UID est désactivé et toute tentative d'appel de CarAudioManager#setZoneidForUid génère une erreur.

Bien que le routage audio et la gestion de la mise au point aient été simplifiés avec la gestion des zones d'occupation, l'utilisateur doit toujours être affecté à une zone d'occupation. Pour ce faire, utilisez CarOccupantZoneManager#assignProfileUserToOccupantZone. Cette API nécessite une autorisation pour gérer les utilisateurs. Les OEM sont actuellement censés gérer l'attribution des zones d'occupants aux utilisateurs via une interface utilisateur système. Une fois cela fait, le lancement de l'application, le routage audio et la gestion de la mise au point seront tous configurés automatiquement pour l'utilisateur.

Routage avec setPreferredDevice

En plus des modifications ci-dessus, Android 11 propose également une nouvelle API pour interroger les périphériques de sortie associés à chaque zone, CarAudioManager#getOutputDeviceForUsage(int zoneId, int usage).

L'API permet d'interroger un appareil de sortie pour une zone spécifique et une utilisation d'attribut audio. De cette manière, les applications propriétaires peuvent acheminer l'audio vers différentes zones à l'aide de l'API setPreferredDevice du lecteur. L'API getOutputDeviceForUsage nécessite PERMISSION_CAR_CONTROL_AUDIO_SETTINGS et est une API système. Vous trouverez ci-dessous un exemple de recherche de l'appareil multimédia pour une zone spécifique et de routage vers cet appareil à l'aide de l'API setPreferredDevice.

audioZoneId = ... ;
mediaDeviceInfo = mCarAudioManager
            .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA);
…
mPlayer.setPreferredDevice(mediaDeviceInfo);