La gestion des volumes est contenue dans CarAudioService
, qui utilise des volumes fixes en partant du principe que les volumes sont appliqués en dessous de la couche HAL par un amplificateur matériel plutôt que par le logiciel. CarAudioService
organise les périphériques de sortie en groupes de volumes pour appliquer les mêmes gains à tous les appareils associés à un groupe de volumes.
Volumes fixes
Les implémentations AAOS utilisent un amplificateur matériel pour contrôler le volume au lieu d'un mélangeur logiciel. Pour éviter les effets secondaires, définissez l'indicateur config_useFixedVolume
sur true
(superposition si nécessaire):
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
Lorsque l'indicateur config_useFixedVolume
n'est pas défini (ou est défini sur false
), les applications peuvent appeler AudioManager.setStreamVolume()
pour modifier le volume par type de flux dans le mélangeur logiciel. Cela n'est pas toujours souhaitable en raison d'effets potentiels sur d'autres applications et du fait que l'atténuation du volume dans le mélangeur logiciel peut réduire le nombre de bits significatifs disponibles dans le signal lorsqu'il est reçu par l'amplificateur matériel.
Groupes de volumes
Les groupes de volumes permettent de gérer les volumes pour un ensemble d'appareils dans une zone audio. Le volume peut être contrôlé indépendamment pour chaque groupe de volumes. Les gains obtenus sont configurés sur les appareils associés pour être appliqués par l'amplificateur du véhicule. Les paramètres de volume sont conservés pour l'utilisateur et sont chargés lorsque celui-ci se connecte.
Définir des groupes de volumes
CarAudioService utilise des groupes de volumes définis dans car_audio_configuration.xml
:
<audioZoneConfiguration version="2.0">
<zones>
<zone name="primary zone" isPrimary="true">
<volumeGroups>
<group>
<device address="bus0_media_out">
<context context="music"/>
</device>
</group>
<group>
<device address="bus1_navigation_out">
<context context="navigation"/>
</device>
<device address="bus2_voice_command_out">
<context context="voice_command"/>
</device>
</group>
...
</volumeGroups>
</zone>
</zones>
</audioZoneConfiguration>
Chaque groupe de volumes doit contenir un ou plusieurs périphériques de sortie avec des adresses associées. Les adresses doivent correspondre aux périphériques de sortie définis dans audio_policy_configuration.xml
.
Configurer les gains du groupe de volumes
Chaque groupe de volumes possède des valeurs de gain minimale, maximale et par défaut, ainsi qu'une taille de pas en fonction des valeurs configurées dans audio_policy_configuration.xml
pour les appareils associés au groupe de volumes.
<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
<gains>
<gain name="" mode="AUDIO_GAIN_MODE_JOINT"
minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
</gains>
</devicePort>
Lors de l'initialisation, le groupe de volumes vérifie les valeurs de gain des appareils associés et configure le groupe comme suit:
- Taille de pas : Doit être identique pour tous les appareils contrôlés par le groupe de volumes.
- Gain minimal : Gain minimal le plus faible parmi les appareils du groupe.
- Gain maximal : Gain maximal le plus élevé parmi les appareils du groupe.
- Gain par défaut. Gain par défaut le plus élevé parmi les appareils du groupe.
Compte tenu de la configuration de ces valeurs, il est possible de définir le gain d'un groupe de volumes en dehors de la plage acceptée par un appareil associé à ce groupe de volumes. Dans ce cas, pour cet appareil, le gain est défini sur la valeur de gain minimale ou maximale de l'appareil, selon que la valeur du groupe de volumes est inférieure ou supérieure à la plage.
Identifiants de groupe de volumes
Les groupes de volumes sont identifiés au moment de l'exécution dans l'ordre défini dans le fichier XML.
Les ID sont compris entre 0
et N-1
dans une zone audio, où N
est le nombre de groupes de volumes dans cette zone. De cette manière, les ID de groupe de volumes ne sont pas uniques entre les zones. Ces identifiants sont utilisés pour les API CarAudioManager
associées à des groupes de volumes. Toute API qui reçoit un groupId
sans zoneId
utilise par défaut la zone audio principale.
Gestion du volume multizone
Chaque zone audio doit avoir un ou plusieurs groupes de volumes, et chaque groupe de volumes n'est associé qu'à une seule zone audio. Cette relation est définie dans car_audio_configuration.xml
. Pour en savoir plus, consultez l'exemple ci-dessus dans Définir des groupes de volumes.
Les niveaux de volume actuels de chaque zone sont conservés pour l'utilisateur associé à cette zone. Ces paramètres sont spécifiques à une zone. Par conséquent, si un utilisateur se connecte sur un écran associé à la zone principale, puis se connecte dans une zone associée à une zone audio secondaire, les niveaux de volume chargés et conservés pour la première zone diffèrent de ceux de la zone secondaire.
Gérer les événements de touches de volume
Android définit plusieurs codes de clavier pour le contrôle du volume, y compris:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
Par défaut, Android achemine les événements des touches de volume vers les applications. Les implémentations automobiles doivent forcer le traitement de ces événements clés par CarAudioService
, qui appelle ensuite setGroupVolume
ou setMasterMute
, selon le cas. Pour forcer ce comportement, définissez l'option config_handleVolumeKeysInWindowManager
sur true
:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
Actuellement, les événements de touche de volume n'ont aucun moyen de distinguer la zone à laquelle ils sont destinés. Ils sont supposés être tous associés à la zone audio principale. Lorsqu'un événement de touche de volume est reçu, CarAudioService
détermine le groupe de volume à ajuster en récupérant les contextes audio des lecteurs actifs, puis en ajustant le groupe de volumes contenant le périphérique de sortie associé au contexte audio ayant la priorité la plus élevée. La hiérarchisation est déterminée en fonction d'un ordre fixe défini dans CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
.
Fondu et équilibre
Les deux versions du HAL AudioControl incluent des API permettant de définir le fondu et l'équilibre dans le véhicule. Les API système correspondantes pour CarAudioManager transmettent des valeurs au HAL AudioControl. Ces API nécessitent android.car.permission.CAR_CONTROL_AUDIO_VOLUME
. Les API AudioControl sont les suivantes:
setBalanceTowardRight(float value)
déplace le volume du haut-parleur vers le côté droit (+) ou gauche (-) de la voiture.- 0,0 est centré
- La valeur +1,0 correspond parfaitement
- -1,0 correspond à la limite restante
- Une valeur non comprise entre -1 et 1 indique une erreur.
setFadeTowardFront(float value)
déplace le volume du haut-parleur vers l'avant (+) ou l'arrière (-) de la voiture.- 0,0 est centré
- La valeur +1,0 est entièrement transférée.
- -1.0 est entièrement à l'arrière
- Une valeur non comprise entre -1 et 1 indique une erreur.
Vous décidez de la manière dont ces valeurs doivent être appliquées et de la manière dont elles doivent être présentées aux utilisateurs. Elles peuvent s'appliquer strictement aux médias ou à tous les sons Android. Android 11 permet également d'appliquer des effets audio aux périphériques de sortie. Il est ainsi possible de gérer le fondu et l'équilibre via des effets audio sur les périphériques de sortie appropriés plutôt que via ces API.
Diminution du volume
L'atténuation audio se produit lorsque le véhicule réduit le gain d'un flux afin qu'un autre flux diffusé simultanément puisse être entendu plus clairement. Dans AAOS, la diminution de l'audio est implémentée par le HAL. Android n'a aucun contrôle sur les sons en dehors de l'OS. Dans Android 11, la principale information disponible pour le HAL pour prendre des décisions d'atténuation est de savoir si deux appareils de sortie possèdent ou non des flux actifs.
Quand s'écarter
Bien qu'il incombe à chaque OEM de déterminer comment l'atténuation est géré par le HAL, nous recommandons les consignes suivantes.
Plusieurs flux lus sur Android se produisent généralement lorsque deux applications ou services sont actifs simultanément. Pour savoir quand Android peut accorder une sélection simultanée, consultez la matrice d'interaction dans Types de restriction. Avec l'introduction du plug-in audio pour voiture, cela dépend également de votre gestion AudioFocus.
Tous les flux mélangés par Android le sont avant l'application des gains. Ainsi, tout flux qui doit être baissé lorsqu'il est lu simultanément avec un autre doit être acheminé vers des périphériques de sortie distincts afin que le HAL puisse appliquer l'atténuation avant de les mélanger.
Comportement d'atténuation recommandé
La diminution des interactions simultanées est recommandée :
Interactions | Action |
---|---|
EMERGENCY
| Désactive ou coupe le son de tout sauf de SAFETY
|
SAFETY |
Désactive tout, sauf EMERGENCY |
NAVIGATION |
Désactive tout, sauf SAFETY et EMERGENCY |
CALL |
Masque tout sauf SAFETY , EMERGENCY et NAVIGATION |
VOICE |
Canards CALL_RING |
VEHICLE_SOUNDS |
Vous déterminez l'importance du son actif et s'il limite ou non les autres sons. |
MUSIC et ANNOUNCEMENT |
Atténué par tout. à l'exception des tonalités d'interaction tactile lues comme SYSTEM_SOUND .
|
Remarques concernant l'atténuation
Certaines applications et certains services, tels que la navigation ou un assistant, peuvent utiliser plusieurs joueurs pour effectuer des actions. Évitez de procéder à une annulation agressive lorsqu'un flux de données cesse de circuler à travers les périphériques de sortie pour vous assurer que le contenu multimédia ne restitue pas le volume maximal avant d'être baissé avant le début de la prochaine lecture à partir de la navigation ou d'une application d'assistant.
Pour les véhicules dotés de plusieurs étapes sonores et d'une isolation suffisante, vous pouvez acheminer le son vers différentes zones du véhicule au lieu de baisser le son. Par exemple, les instructions de navigation peuvent être transmises aux haut-parleurs de l'appui-tête du conducteur, tout en continuant à diffuser de la musique dans l'habitacle à un volume normal.
Sons critiques pour la sécurité
Android 11 a introduit les API de focus audio HAL. Le HAL garantit que les sons critiques pour la sécurité sont prioritaires sur les autres sons. Si le HAL contient la priorité audio pour USAGE_EMERGENCY
, il n'est pas garanti que les applications et les services Android ne diffusent pas de sons. Le HAL détermine les flux provenant d'Android qui doivent être mixtes ou coupés pour diffuser des sons essentiels à la sécurité.
Configurer l'interface utilisateur des paramètres de volume
AAOS dissocie l'interface utilisateur des paramètres de volume de la configuration du groupe de volumes. Ceux-ci peuvent être superposés, comme décrit dans la section Configurer les gains de groupe de volumes. Cette séparation garantit qu'aucune modification n'est requise si la configuration des groupes de volumes change.
Dans l'UI des paramètres de la voiture, packages/apps/Car/Settings/res/xml/car_volume_items.xml
contient les éléments d'UI (ressources de titre et d'icône) associés à chaque AudioAttributes.USAGE
défini. Ce fichier fournit un rendu raisonnable du VolumeGroups
défini en utilisant les ressources associées à la première utilisation reconnue contenue dans chaque VolumeGroup
.
L'exemple suivant définit un VolumeGroup
comme incluant voice_communication
et voice_communication_signalling
. L'implémentation par défaut de l'interface utilisateur des paramètres de la voiture affiche le VolumeGroup
à l'aide des ressources associées à voice_communication
, car il s'agit du premier élément matc du fichier.
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
<item car:usage="voice_communication"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="voice_communication_signalling"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="media"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="game"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="alarm"
car:title="@*android:string/volume_alarm"
car:icon="@*android:drawable/ic_audio_alarm"/>
<item car:usage="assistance_navigation_guidance"
car:title="@string/navi_volume_title"
car:icon="@drawable/ic_audio_navi"/>
<item car:usage="notification_ringtone"
car:title="@*android:string/volume_ringtone"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistant"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="notification"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_request"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_instant"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_delayed"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_event"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_accessibility"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_sonification"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="unknown"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>
Les attributs et les valeurs utilisés dans la configuration ci-dessus sont déclarés dans packages/apps/Car/Settings/res/values/attrs.xml
. L'interface utilisateur des paramètres de volume utilise les API CarAudioManager suivantes basées sur VolumeGroup
:
getVolumeGroupCount()
pour savoir combien de commandes doivent être dessinées.getGroupMinVolume()
etgetGroupMaxVolume()
pour obtenir les limites inférieure et supérieure.getGroupVolume()
pour obtenir le volume actuel.registerVolumeChangeObserver()
pour être informé des changements de volume.
Événement de groupe de volumes de la voiture
Dans le secteur automobile, les cas d'utilisation de mise à jour du volume et de désactivation du son ont des fondements contextuels qui peuvent définir les actions de certaines applications, telles que les paramètres de volume. Le rappel de volume et de coupure du son actuel de la pile audio de la voiture fournit des informations contextuelles limitées. Afin de mieux répondre aux besoins des cas d'utilisation du secteur automobile et de l'évolutivité future, CarVolumeGroupEvent a été ajouté à Android 14. Chaque événement contient trois types d'informations critiques:
- Liste de
CarVolumeGroupInfo
EventTypes
(mappé sur bit)- Liste de
ExtraInfos
Informations sur le groupe du volume de la voiture
Le récepteur du rappel d'événement dispose d'un accès direct à la liste des informations sur le groupe de volumes de la voiture concerné. Cela signifie que l'application n'a pas besoin d'effectuer d'appels supplémentaires au framework audio de la voiture pour obtenir le dernier état. Il peut simplement utiliser le CarVolumeGroupInfos
reçu pour mettre à jour l'UI ou les états internes. Pour faciliter la tâche des applications, les aspects qui ont changé dans un groupe de volumes de voiture sont également fournis dans EventTypes
, comme expliqué ci-dessous.
Types d'événements
Définit quel aspect de CarVolumeGroupInfo
a été modifié. Les applications peuvent l'utiliser pour identifier les modifications et effectuer les actions requises. Par exemple, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
indique que l'index de gain de volume maximal CarVolumeGroups
correspondant a changé et peut être interrogé par CarVolumeGroupInfo.getMaxVolumeGainIndex()
.
Le tableau suivant montre la relation entre EventType
et CarVolumeGroupInfo
.
Type d'événement | Informations sur le groupe du volume de la voiture |
---|---|
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED | CarVolumeGroupInfo.getVolumeGainIndex() |
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED | CarVolumeGroupInfo.getMinVolumeGainIndex() (en anglais) |
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED | CarVolumeGroupInfo.getMaxVolumeGainIndex() |
EVENT_TYPE_MUTE_CHANGED | CarVolumeGroupInfo.ismuted() |
ÉVÉNEMENT_TYPE_VOLUME_BLOCKED_CHANGED | CarVolumeGroupInfo.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED | CarVolumeGroupInfo.isAttéated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED | CarVolumeGroupInfo.getAudioAttributes() |
Informations supplémentaires
Fournit des informations supplémentaires sur les raisons de la modification de CarVolumeGroup
. Les applications peuvent utiliser ces informations pour fournir du contexte supplémentaire afin d'inviter l'utilisateur à agir ou à avertir l'utilisateur. Par exemple, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
indique une atténuation temporaire active due à une surcharge thermique. L'application peut informer l'utilisateur s'il tente d'augmenter le volume.
Nous ne appliquons aucune procédure pour ExtraInfos
. Il vous appartient de déterminer le processus en fonction de ExtraInfos
. Par exemple, si l'atténuation est active en raison de EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
, vous pouvez également choisir d'effectuer un fondu initial de l'UI de la barre de volume pour empêcher l'utilisateur de modifier le volume.
D'autres peuvent afficher un toast indiquant que la diminution est active et permettre à l'utilisateur de modifier le volume.
Le framework audio pour voiture dépend du IAudioGainCallback
du composant AudioControl HAL pour fournir le ExtraInfos
suggéré. Pour en savoir plus, consultez la section Rappel de gain audio.
CarVolumeGroupEvent
évolue pour répondre aux futurs besoins de la structure audio pour voiture. Nous prévoyons de prendre en charge les nouvelles fonctionnalités uniquement via CarVolumeGroupEvent
. Nous recommandons vivement aux développeurs d'applications d'utiliser CarVolumeGroupEvent
pour gérer le volume de groupe et couper le son.
Rappel d'événement de groupe de volumes de la voiture
Android 14 fournit un nouveau rappel pour que les applications privilégiées et de plate-forme puissent s'enregistrer et être notifiées de CarVolumeGroupEvents
.
Pour activer le rappel, utilisez
CarAudioManager#registerCarVolumeGroupEventCallback()
.Pour annuler l'enregistrement du rappel, utilisez
CarAudioManager#unregisterCarVolumeGroupEventCallback()
.
Si une application s'enregistre avec la nouvelle CarVolumeGroupEventCallback
et l'ancienne version de CarVolumeCallback
, l'événement CarVolumeGroupEventCallbacks
est prioritaire.
La pile audio pour voiture ne déclenche plus CarVolumeCallback
. Cela permet d'éviter les déclencheurs en double sur la même application pour le même événement.
Nous vous recommandons vivement d'utiliser CarVolumeGroupEventCallback
pour gérer le volume du groupe et couper le son.
Rappel de gain audio
Depuis Android 13, AudioControl HAL peut déclencher un rappel asynchrone pour gérer les mises à jour du niveau de volume en raison de modifications apportées au système audio de la voiture.
API HAL
AudioControl @2.0 AIDL
La version 2.0 d'AudioControl AIDL HAL ajoute l'API suivante:
API | Finalité |
---|---|
IAudioControl#registerGainCallback |
Enregistre une instance de IAudioGainCallback auprès du HAL AudioControl. |
IAudioGainCallback#onAudioDeviceGainsChanged |
Rappel asynchrone pour notifier les modifications apportées à la configuration du gain audio. |
Le rappel HAL AudioControl inclut des listes de motifs et le AudioGainConfigInfo
correspondant, qui se compose des éléments suivants:
- ID de zone
- Adresse du port de l'appareil
- "Volume index > index" peut être soit un index restreint, soit un index de mise à jour.
Les raisons peuvent être classées comme suit:
- Motifs de restriction. Modification temporaire du volume et de la désactivation du son
- Motifs de mise à jour. Modification définitive du comportement du volume.
Types de restrictions
Depuis AudioControl
HAL AIDL
V3
, les types de restrictions suivants sont acceptés:
- Couper le son
- Vidéo bloquée
- Restriction
- Atténuation
Restriction active | Modification du volume déclenchée par l'utilisateur | Bouton d'activation du son déclenché par l'utilisateur |
---|---|---|
Couper le son | ❌ | ❌ (réactiver le son) ✔ (ignorer) |
Vidéo bloquée | ❌ | ✔ |
Restriction | ❌ (Au-delà de la limite) ✔ (sous la limite) |
✔ |
Atténuation | ✔ | ✔ |
La priorité entre les restrictions est Couper le son > Blocage > Limitation > Atténuation.
Restrictions "Ignorer"
Les restrictions Ignorer sont les suivantes:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Le framework audio pour voiture conserve en interne ces deux états de coupure du son:
Coupure du son de l'utilisateur. Basculé en fonction de la requête de l'utilisateur, via
CarAudioManager
ou des événements clés.Couper le son de HAL. Basculé en fonction des restrictions de son reçues via le rappel
AudioGain
.
Pour les écouteurs comme l'application Paramètres, l'état global de la désactivation du son (CarVolumeGroupInfo.isMuted()
) du groupe de volumes dépendra de l'activation de l'une des coupures du son ci-dessus.
Lorsque le son de HAL est activé, toutes les requêtes entrantes de modification du volume et de réactivation du son des groupes sont ignorées pendant la durée de la restriction.
Cas d'interaction: la désactivation du son de HAL est active et l'utilisateur demande l'activation/la désactivation du son
Lorsque le son de l'HAL est activé et que celui de l'utilisateur est désactivé:
- L'état général de la désactivation du son du groupe de volumes est défini sur
true
. - Les demandes de l'utilisateur pour activer la fonctionnalité Ignorer seront traitées.
- Motif: Pour préserver la vie privée des utilisateurs, les demandes de désactivation du son doivent être appliquées en permanence.
Lorsque le son de HAL est activé et que celui de l'utilisateur est activé:
L'état général de la désactivation du son du groupe de volumes est défini sur
true
.Les demandes de désactivation de "Ignorer" de l'utilisateur seront traitées
NOT
. L'état Ignorer de l'utilisateur en cache reste activé.Motif: les demandes de réactivation des utilisateurs ne seront satisfaites qu'en l'absence de restrictions actives.
Motif: La réactivation du son mis en cache peut provoquer une explosion du son involontaire et mettre en danger la sécurité de l'utilisateur. Cela est particulièrement vrai si le son est coupé pendant les cycles d'allumage, ce qui réduit la perception du niveau sonore par les utilisateurs.
Cas d'interaction: la désactivation du son de HAL est activée et désactivée alors que la désactivation du son de l'utilisateur n'a pas été modifiée
Activer/Désactiver le son du HAL modifie l'état général du son du groupe de volumes. Toutefois, il ne met pas directement à jour l'état de désactivation du son de l'utilisateur. Lorsque la désactivation du son de l'utilisateur est désactivée et que le rappel à activer est reçu par HAL:
- L'état général de la désactivation du son du groupe de volumes est défini sur
true
. Les requêtes de modification du volume de l'utilisateur seront traitées
NOT
tant que la désactivation du son de la couche HAL est activée.Motif: l'utilisateur ne peut pas percevoir le son lorsque le son est coupé. Autoriser une modification du volume peut entraîner une explosion sonore et mettre en danger la sécurité des utilisateurs.
Motif: les applications de volume peuvent enregistrer des rappels et déclencher une réactivation du son (CarAudioManager.setVolumeGroupmute(...,/* mute=*/ true,..)) automatiquement sans intervention de l'utilisateur, s'il s'agit du comportement attendu par l'OEM.
Lorsque le son de l'HAL est désactivé alors que celui de l'utilisateur est désactivé:
L'état de désactivation du son du groupe de volumes est désormais
false
.Motif: L'utilisateur risque d'interrompre inutilement le son lorsque l'état de désactivation du son est maintenu ou que l'utilisateur doit le réactiver fréquemment.
Les demandes de modification de volume émanant d'utilisateurs seront traitées normalement.
Vidéo bloquée
Les restrictions de blocage sont les suivantes:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
Lorsque les restrictions de blocage sont actives, les demandes des utilisateurs à:
- Les modifications de volume ne sont pas traitées.
- La désactivation du son a été traitée.
Restriction
Les restrictions sont les suivantes:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Lorsque des restrictions de restriction sont actives, les utilisateurs doivent pouvoir:
Régler le volume:
- sont traitées dans les limites
- Les contenus ci-dessus ne sont pas traités
La désactivation du son a été traitée.
Atténuation
Les restrictions d'atténuation sont les suivantes:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Lorsque les restrictions d'atténuation sont actives, les demandes des utilisateurs à:
Les modifications de volume sont en cours de traitement. Le nouveau niveau de volume actuel est réglé sur le volume atténué (et non sur le volume précédent). Les futurs changements de volume sont effectués à partir de ce niveau.
La désactivation du son a été traitée.
Mise à jour de l'index
La commande suivante est considérée comme une mise à jour d'index de volume asynchrone : Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
C'est pourquoi AudioControl HAL peut mettre à jour l'index actuel du groupe de volumes sur l'index spécifié. Elle est principalement utilisée comme retour d'information par le système audio pour la demande de modification de volume du framework audio de la voiture. La mise à jour de l'index est également communiquée avec Apps en tant que rappel CarVolumeGroupEvent
pour synchroniser l'index.
Exemples
Cas d'utilisation: l'utilisateur met à jour l'index de volume à 30
L'utilisateur utilise l'application Volume pour définir l'index de volume sur 30.
Cet index est converti en gain de volume et envoyé à l'HAL audio.
Les implémentations de
Audio HAL
par les fournisseurs reçoivent le nouveau gain de volume et mettent à jour le système audio (comme un ampli externe).Le système audio répond que le niveau de volume n'est mis à jour qu'avec l'index 15 (pour des raisons inconnues d'Android).
Implémentations par le fournisseur de déclencheurs
AudioControl HAL
:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
Le service audio pour voiture utilise le nouvel index du rappel utilisé pour la persistance et les rappels à l'application de volume. L'index demandé par l'utilisateur est 30. Cependant, le retour asynchrone du système audio met à jour l'index à 15.
Cas d'utilisation: première lecture audio après la sortie de la suspension
L'index de volume avant suspension est défini sur un niveau élevé de 95 (plage: [0-99]).
Android passe à l'état "Suspendre".
Une fois qu'Android existe une suspension (par exemple, reprendre):
Le fournisseur
Audio HAL/AudioControl HAL
applique localement un index de sécurité de 30 au système audio.Le fournisseur
AudioControl HAL
déclenche également le rappel pour l'index sécurisé:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
Le service audio pour voiture utilise le nouvel index du rappel utilisé pour la persistance et ses propres rappels à l'application de volume synchronisant l'index. L'index de volume avant suspension est de 95. Toutefois, après la reprise, l'outil d'implémentation
AudioControl HAL
définit cet index sur un niveau de volume sûr de 30.
Configuration du volume dynamique
Pour cette fonctionnalité, nous prenons en compte les principaux cas d'utilisation suivants:
Configuration de fin de ligne pour les véhicules.
Les constructeurs automobiles préfèrent mettre à jour les configurations de volume en fin de vie en fonction de la configuration du système audio du véhicule. Il s'agit généralement d'un téléchargement indépendant sans mettre à jour l'image du logiciel Android.
Les constructeurs automobiles devront peut-être mettre à jour la configuration du volume pendant une planification de service.
Configuration de l'environnement d'exécution. Les systèmes audio automobiles sont compatibles avec les configurations d'amplificateurs externes, et ces ECU peuvent héberger les configurations de plages de volumes qui sont interrogées lors du démarrage.
Configuration à la demande. Proposé pour répondre au besoin croissant de fonctionnalités audio basées sur la demande, par lesquelles les utilisateurs s'abonnent au traitement amélioré du signal pendant un certain temps. Les nouvelles configurations de plage de volumes sont valides pour toute la durée d'un abonnement.
Design
La configuration du volume dynamique s'effectue en trois étapes:
Découverte : L'implémentation d'une solution HAL pour AudioControl du fournisseur détecte les nouvelles mises à jour des plages de volumes via un mécanisme d'IPC personnalisé appartenant au fournisseur.
Une fois découvert, un rappel est généré via
AudioControl::IModuleChangeCallback
.Mettre à jour. La pile audio de la voiture met à jour les états des groupes de volumes avec les nouvelles plages de volumes.
Nous nous efforçons de conserver le même niveau de volume après la mise à jour de la plage de volume. Toutefois, si l'index dépasse les limites, l'index de volume actuel est défini sur une valeur sûre. Par exemple, le niveau par défaut fourni par le fournisseur lors du rappel.
Rappel.
Après les mises à jour des plages de groupes de volumes, la pile audio de la voiture déclenche un rappel vers les applications enregistrées via
CarVolumeGroupEventCallback
.CarVolumeGroupEvent
contient leCarVolumeGroupInfo
mis à jour, le type d'événement (ce qui a changé) et les informations supplémentaires (pourquoi il a changé).
Figure 1 : Configuration dynamique du volume.
API HAL
AudioControl @ 3.0 AIDL
La version 3.0 d'AudioControl AIDL HAL introduit les API suivantes:
API | |
---|---|
IAudioControl#setModuleChangeCallback | Définit une instance de IModuleChangeCallback avec l'HAL AudioControl. |
IAudioControl#clearModuleChangeCallback | Efface l'instance d'IModuleChangeCallback précédemment définie avec le HAL AudioControl. |
IModuleChangeCallback#onAudioPortsChanged | Rappel pour notifier les modifications apportées aux AudioPorts |
Séquence
Le diagramme séquentiel de la configuration du volume dynamique est présenté ci-dessous.
Figure 2. Schéma séquentiel pour la configuration d'un volume dynamique.
Aspects clés
Pour optimiser cette fonctionnalité, tenez compte des points suivants.
Les AudioPorts fournis dans le cadre du rappel doivent correspondre à la définition du bus d'automobile:
- Port de l'appareil :
IN_DEVICE
OUT_DEVICE
- Connexion.
BUS
- Adresse : Définies dans la définition du HAL audio
- Mode de gain
JOINT
- Port de l'appareil :
Les fournisseurs doivent définir un sur-ensemble de définitions de plage de volumes dans la règle Audio HAL et utiliser le rappel pour le personnaliser pour des variantes de véhicules. Pour en savoir plus, consultez la définition AIDL
IModuleChangeCallbac
.Lorsque plusieurs BUS audio appartiennent au même groupe de volumes, chacun doit avoir des définitions de plage de volume identiques. Sinon, le framework audio de la voiture rejette la nouvelle définition de la plage de volumes.