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
etoccupantZoneId
ne peuvent pas se répéter. audioZoneId
etoccupantZoneId
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);