La gestion du volume est contenue dans CarAudioService
, qui utilise des volumes fixes en s'attendant à ce que les volumes soient appliqués en dessous de la HAL par un amplificateur matériel au lieu de l'être dans 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 mixeur logiciel. Pour éviter les effets secondaires, définissez l'indicateur config_useFixedVolume
sur true
(superposez-le 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 mixeur logiciel. Cela n'est pas toujours souhaitable en raison des effets potentiels sur d'autres applications et du fait que l'atténuation du volume dans le mixeur logiciel peut entraîner une diminution du nombre de bits significatifs disponibles dans le signal lorsqu'il est reçu par l'amplificateur matériel.
Groupes de volumes
Les groupes de volume gèrent les volumes d'une collection d'appareils dans une zone audio. Le volume de chaque groupe peut être contrôlé indépendamment. 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 chargés lorsqu'il se connecte.
Définir des groupes de volumes
CarAudioService utilise des groupes de volume définis dans car_audio_configuration.xml
:
<audioZoneConfiguration version="4">
</deviceConfigurations>
<activationVolumeConfigs>
<activationVolumeConfig name="activation_volume_on_boot_config">
<activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
invocationType="onBoot" />
</activationVolumeConfig>
...
</activationVolumeConfigs>
<zones>
<zone name="primary zone" isPrimary="true">
<zoneConfigs>
<zoneConfig name="primary zone config 0" isDefault="true">
<volumeGroups>
<group activationConfig="activation_volume_on_boot_config">
<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>
</zoneConfig>
...
</zoneConfigs>
</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 minimales, maximales et par défaut, ainsi qu'une taille de pas basée sur les 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 volume.
- 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.
Étant donné la façon dont ces valeurs sont configurées, il est possible de définir le gain d'un groupe de volume en dehors de la plage acceptée pour un appareil associé au groupe de volume. 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 volume 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
correspond au nombre de groupes de volume dans cette zone. De cette façon, les ID de groupe de volumes ne sont pas uniques dans toutes les zones. Ces identifiants sont utilisés pour les API CarAudioManager
associées aux groupes de volumes. Toute API qui accepte un groupId
sans zoneId
utilise par défaut la zone audio principale.
Gestion du volume multizone
Chaque zone audio doit comporter un ou plusieurs groupes de volume, et chaque groupe de volume 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. Cela signifie que si un utilisateur se connecte sur un écran associé à la zone principale, puis se connecte ultérieurement à 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.
Volume d'activation minimal et maximal
Android 15 introduit le contrôle des index de groupe de volume pour améliorer la sécurité et le confort des utilisateurs dans les systèmes audio des voitures. Pour ce faire, utilisez des volumes d'activation minimum et maximum, configurés dans la configuration audio de la voiture (voir Définir des groupes de volume). Vous pouvez activer cette fonctionnalité en définissant audioUseMinMaxActivationVolume
sur true
dans les RRO Car Service.
Vous pouvez définir plusieurs entrées activationVolumeConfig
dans activationVolumeConfigs
, chacune représentant une configuration d'activation minimale et maximale différente. Chaque activationVolumeConfig
:
- Doit contenir un
name
unique dans le fichier de configuration audio de la voiture, afin qu'il puisse être référencé ultérieurement dans le groupe de volume (group
). - Ne doit contenir qu'un seul
activationVolumeConfigEntry
.
Chaque activationVolumeConfig
contient les attributs suivants :
minActivationVolumePercentage
(entier, 0-100, facultatif, valeur par défaut : 0) : Spécifie le volume d'activation minimal en pourcentage.maxActivationVolumePercentage
(entier, 0-100, facultatif, valeur par défaut : 100) : Spécifie le volume d'activation maximal en pourcentage.invocationType
(chaîne, facultatif, par défaut :onPlaybackChanged
) : définit les conditions dans lesquelles le volume d'activation minimal et maximal est appliqué :onBoot
: appliqué uniquement à la première lecture nouvellement active sur un groupe de volumes après le démarrage.onSourceChanged
: ne s'applique qu'à une lecture nouvellement active avec une source d'application ou d'UID modifiée sur un groupe de volume.onPlaybackChanged
: appliqué à chaque lecture nouvellement active dans un groupe de volume.
CarAudioService
gère l'activation minimale et maximale en surveillant les sous-composants audio actuellement actifs suivants :
- Pistes de lecture actives actuelles
- État actuel de l'appel
- Requête de focus audio actuelle du HAL de contrôle audio, où la requête de focus audio du HAL de contrôle audio signale qu'une lecture audio active a lieu en dehors d'Android
L'image suivante présente une vue d'ensemble de la gestion du volume d'activation minimal et maximal :
Figure 1 : Gestion du volume d'activation minimal et maximal des chemins de données audio actifs.
Avec les valeurs minActivationVolumePercentage
, maxActivationVolumePercentage
, ainsi que les indices de gain de volume minimal et maximal spécifiés, vous pouvez calculer l'indice de gain de volume d'activation minimal et maximal pour chaque groupe de volume. CarAudioService
surveille chaque lecture nouvellement active et applique le volume d'activation minimal et maximal dans les conditions suivantes :
- Le type d'invocation correspond : le type d'activation de la lecture (dérivé de l'Audio Manager, de l'Audio Control HAL ou du Telephony Manager) doit correspondre à
invocationType
spécifié dansactivationVolumeConfigEntry
associé au groupe de volume. L'index de volume est hors plage : l'index de gain de volume actuel du groupe de volume doit être en dehors de la plage d'index de gain de volume d'activation définie. Plus précisément, l'une des conditions suivantes est remplie :
L'index est inférieur à l'index de gain de volume d'activation minimal calculé.
OU
L'index est supérieur à l'index de gain de volume d'activation maximal calculé.
En cas de correspondance d'activation, l'index de gain de volume du groupe de volumes sera ajusté à l'une des valeurs suivantes :
Indice de gain du volume d'activation minimal si inférieur à l'indice de gain du volume d'activation minimal
OU
Indice de gain de volume d'activation maximal si supérieur à l'indice de gain de volume d'activation maximal
De plus, un événement de groupe de volume de voiture avec le type d'événement EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED
est envoyé à tous les rappels d'événements de groupe de volume enregistrés.
Gérer les événements de bouton de volume
Android définit plusieurs codes de touche pour le contrôle du volume, y compris :
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
Par défaut, Android transmet les événements de touches de volume aux applications. Les implémentations automobiles doivent forcer le traitement de ces événements de touche par CarAudioService
, qui appelle ensuite setGroupVolume
ou setMasterMute
, selon le cas. Pour forcer ce comportement, définissez l'indicateur config_handleVolumeKeysInWindowManager
sur true
:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
Il n'existe actuellement aucun moyen de distinguer la zone à laquelle les événements clés de volume sont destinés. Ils sont tous supposés être 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 pour les lecteurs actifs, puis en ajustant le groupe de volume qui contient le périphérique de sortie associé au contexte audio de priorité la plus élevée. La priorisation est déterminée en fonction d'un ordre fixe défini dans CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
.
Fader et balance
Les deux versions de l'AudioControl HAL incluent des API permettant de définir la balance et le fondu dans le véhicule. Les API système correspondantes pour CarAudioManager transmettent des valeurs à AudioControl HAL. Ces API nécessitent android.car.permission.CAR_CONTROL_AUDIO_VOLUME
. Les API AudioControl sont les suivantes :
setBalanceTowardRight(float value)
déplace le volume des enceintes vers la droite (+) ou la gauche (-) de la voiture.- 0,0 : centré
- +1,0 : totalement à droite
- -1.0 est complètement à gauche
- Une valeur en dehors de la plage comprise entre -1 et 1 est une erreur.
setFadeTowardFront(float value)
déplace le volume des enceintes vers l'avant (+) ou l'arrière (-) de la voiture.- 0,0 : centré
- +1.0 : entièrement vers l'avant
- -1,0 : complètement à l'arrière
- Une valeur en dehors de la plage comprise entre -1 et 1 est une erreur.
Vous décidez comment ces valeurs doivent être appliquées et comment les afficher aux utilisateurs. Elles peuvent s'appliquer strictement aux contenus multimédias ou de manière générale à tous les sons Android. Android 11 a également introduit la prise en charge de l'application d'effets audio aux périphériques de sortie. Il est ainsi possible de gérer la balance et le fondu enchaîné par le biais d'effets audio sur les appareils de sortie appropriés plutôt que par le biais de ces API.
Atténuation audio
La diminution du volume audio se produit lorsque le véhicule réduit le gain d'un flux pour qu'un autre flux lu simultanément puisse être entendu plus clairement. Dans AAOS, l'atténuation audio est implémentée par le HAL. Android n'a aucun contrôle sur les sons au-delà de l'OS. Dans Android 11, la principale information dont dispose la HAL pour prendre des décisions de ducking est de savoir si deux périphériques de sortie ont des flux actifs.
Quand se baisser
Bien que ce soit à chaque OEM de déterminer comment l'atténuation est gérée par la HAL, nous vous recommandons de suivre les consignes ci-dessous.
La lecture de plusieurs flux sur Android se produit généralement lorsque deux applications ou services détiennent simultanément le focus audio. Pour savoir quand Android peut accorder la priorité simultanément, consultez la matrice d'interaction dans Types de restrictions. Avec l'introduction du plug-in audio de voiture, cela dépend également de votre gestion de l'AudioFocus.
Tous les flux mixés par Android le sont avant l'application de gains. Par conséquent, tout flux qui doit être atténué lorsqu'il est lu simultanément avec un autre doit être acheminé vers des périphériques de sortie distincts afin que la HAL puisse appliquer l'atténuation avant de les mixer.
Comportement de ducking recommandé
Voici quelques exemples d'interactions simultanées pour lesquelles la diminution du volume est recommandée.
Interaction | Action |
---|---|
EMERGENCY
| Réduit le volume ou coupe le son de tout sauf SAFETY
|
SAFETY |
Réduit le volume de tout sauf EMERGENCY |
NAVIGATION |
Réduit le volume de tout sauf SAFETY et EMERGENCY |
CALL |
Diminue le volume de tout sauf SAFETY , EMERGENCY et NAVIGATION |
VOICE |
Canards CALL_RING |
VEHICLE_SOUNDS |
Vous déterminez l'importance du son actif et s'il réduit ou non le volume des autres sons. |
MUSIC et ANNOUNCEMENT |
Tout est mis en sourdine. Les exceptions sont les tonalités d'interaction tactile lues en tant que SYSTEM_SOUND .
|
Éléments à prendre en compte lors de la diminution du volume
Certaines applications et certains services, comme la navigation ou un assistant, peuvent utiliser plusieurs lecteurs pour effectuer des actions. Évitez de réduire le volume de manière agressive lorsqu'un flux de données cesse de transiter par les appareils de sortie. Cela permet de s'assurer que le volume du contenu multimédia ne revient pas à son niveau maximal avant d'être réduit avant le prochain lancement de la lecture à partir de l'application de navigation ou d'un assistant.
Pour les véhicules dotés de plusieurs zones audio suffisamment isolées, vous pouvez rediriger l'audio vers différentes zones de la voiture au lieu de baisser le volume. Par exemple, les instructions de navigation peuvent être diffusées dans les haut-parleurs de l'appuie-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 HAL de focus audio. La HAL garantit que les sons critiques pour la sécurité sont prioritaires par rapport aux autres sons. Si la HAL détient le focus audio pendant USAGE_EMERGENCY
, il n'est pas garanti que les applications et services d'Android ne produiront pas de sons. La HAL détermine les flux Android qui doivent être mixés ou mis en sourdine pour lire les sons critiques pour la sécurité.
Configurer l'UI des paramètres de volume
AAOS découple l'UI des paramètres de volume de la configuration du groupe de volume. Vous pouvez les superposer comme décrit dans Configurer les gains des groupes de volume. 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 permet un rendu raisonnable de l'VolumeGroups
défini en utilisant les ressources associées à la première utilisation reconnue contenue dans chaque VolumeGroup
.
Par exemple, l'exemple suivant définit un VolumeGroup
comme incluant voice_communication
et voice_communication_signalling
. L'implémentation par défaut de l'UI des paramètres de la voiture affiche VolumeGroup
à l'aide des ressources associées à voice_communication
, car il s'agit de la première correspondance dans le 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'UI des paramètres de volume utilise les API CarAudioManager basées sur VolumeGroup
suivantes :
getVolumeGroupCount()
pour savoir combien de contrôles doivent être dessinés.getGroupMinVolume()
etgetGroupMaxVolume()
pour obtenir les limites inférieure et supérieure.getGroupVolume()
pour obtenir le volume actuel.registerVolumeChangeObserver()
pour être informé des modifications de volume.
Événement de groupe de volume de voiture
Les cas d'utilisation automobile de la mise à jour du volume et du bouton de désactivation du son ont des bases contextuelles qui peuvent définir les actions de certaines applications, telles que les paramètres de volume. Le volume actuel et le rappel de désactivation du son de la pile audio de la voiture fournissent des informations contextuelles limitées. Pour mieux répondre aux cas d'utilisation automobile et à l'évolutivité future, CarVolumeGroupEvent est ajouté à Android 14. Chaque événement comporte trois types d'informations essentiels :
- Liste de
CarVolumeGroupInfo
EventTypes
(bitmap)- Liste de
ExtraInfos
CarVolumeGroupInfo
Le destinataire du rappel d'événement a un accès direct à la liste des informations sur les groupes de volume de la voiture concernés. Cela signifie que l'application n'a pas besoin d'effectuer d'appels supplémentaires au framework Car audio 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 volume de voiture sont également fournis dans EventTypes
, comme expliqué ci-dessous.
EventTypes
Définit l'aspect de CarVolumeGroupInfo
qui a changé. Les applications peuvent l'utiliser pour identifier les modifications et prendre les mesures nécessaires. 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
.
EventType | CarVolumeGroupInfo |
---|---|
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED |
CarVolumeGroupInfo.getVolumeGainIndex() |
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED |
CarVolumeGroupInfo.getMinVolumeGainIndex() |
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED |
CarVolumeGroupInfo.getMaxVolumeGainIndex() |
EVENT_TYPE_MUTE_CHANGED |
CarVolumeGroupInfo.isMuted() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED |
CarVolumeGroupInfo.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED |
CarVolumeGroupInfo.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED |
CarVolumeGroupInfo.getAudioAttributes() |
ExtraInfos
Fournit des informations supplémentaires sur les raisons pour lesquelles CarVolumeGroup
a changé. Les applications peuvent utiliser ces informations pour fournir un contexte supplémentaire afin d'alerter l'utilisateur ou de l'informer. Par exemple, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
indique une atténuation transitoire active due à une surcharge thermique. L'application peut informer l'utilisateur s'il tente d'augmenter le volume.
Nous n'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'estomper l'interface utilisateur de la barre de volume au début pour empêcher l'utilisateur de modifier le volume.
D'autres peuvent choisir d'afficher un toast indiquant que la diminution du volume est active et permettre à l'utilisateur de modifier le volume.
Le framework audio de la voiture dépend de l'AudioControl HAL IAudioGainCallback
pour fournir le ExtraInfos
suggéré. Pour en savoir plus, consultez Rappel de gain audio.
CarVolumeGroupEvent
s'adapte pour répondre aux futurs besoins du framework audio automobile. 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 les modifications du volume et de la mise en sourdine des groupes.
Callback d'événement de groupe de volume de voiture
Android 14 fournit un nouveau rappel pour les applications privilégiées et de plate-forme afin de s'enregistrer et d'être averties de CarVolumeGroupEvents
.
Pour vous inscrire au rappel, utilisez
CarAudioManager#registerCarVolumeGroupEventCallback()
.Pour annuler l'enregistrement du rappel, utilisez
CarAudioManager#unregisterCarVolumeGroupEventCallback()
.
Si une application s'enregistre avec le nouveau CarVolumeGroupEventCallback
et l'ancien CarVolumeCallback
, l'événement CarVolumeGroupEventCallbacks
est prioritaire.
La pile audio de la voiture ne déclenche plus CarVolumeCallback
. Cela évite les déclencheurs en double pour la même application et le même événement.
Nous vous recommandons vivement d'utiliser CarVolumeGroupEventCallback
pour gérer le volume et les modifications de mise en sourdine des groupes.
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 des modifications apportées au système audio de la voiture.
API HAL
AudioControl @2.0 AIDL
La version 2.0 de l'AIDL HAL AudioControl ajoute l'API suivante :
API | Objectif |
---|---|
IAudioControl#registerGainCallback |
Enregistre une instance de IAudioGainCallback avec AudioControl HAL. |
IAudioGainCallback#onAudioDeviceGainsChanged |
Rappel asynchrone pour notifier les modifications apportées à la configuration du gain audio. |
Le rappel AudioControl HAL inclut des listes de motifs et les AudioGainConfigInfo
respectifs, qui se composent des éléments suivants :
- ID de zone
- Adresse du port de l'appareil
- L'index de volume > l'index peut être un index restreint ou un index de mise à jour.
Les raisons peuvent être classées comme suit :
- Motifs de la restriction Modification temporaire du volume et du comportement de la fonction Couper le son.
- Motifs de la mise à jour Modification permanente du comportement du volume.
Types de restrictions
Depuis le AudioControl
HAL AIDL
V3
, les types de restrictions acceptés sont les suivants :
- Couper le son
- Vidéo bloquée
- Limitation
- Atténuation
Restriction active | Modification du volume déclenchée par l'utilisateur | Bouton d'activation/désactivation du son déclenché par l'utilisateur |
---|---|---|
Couper le son | ❌ | ❌ (réactiver le son) ✔ (couper le son) |
Vidéo bloquée | ❌ | ✔ |
Limitation | ❌ (au-dessus de la limite) ✔ (en dessous de la limite) |
✔ |
Atténuation | ✔ | ✔ |
La priorité entre les restrictions est la suivante : désactivation du son > blocage > limitation > atténuation.
Restrictions de mise en sourdine
Voici les restrictions de désactivation du son :
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Le framework audio de la voiture gère en interne ces deux états de mise en sourdine :
Désactiver le micro d'un utilisateur Activé ou désactivé en fonction de la demande de l'utilisateur, soit via
CarAudioManager
, soit via des événements clés.HAL mute. Activé ou désactivé en fonction des restrictions de désactivation du son reçues via le rappel
AudioGain
.
Pour les écouteurs tels que l'application Paramètres, l'état de désactivation du son global du groupe de volume (CarVolumeGroupInfo.isMuted()
) dépend de l'activation ou non de l'une des désactivations du son ci-dessus.
Lorsque la désactivation du son HAL est activée, toutes les demandes entrantes de modification du volume et de réactivation du son du groupe sont ignorées pendant la durée de la restriction.
Cas d'interaction : la désactivation du son HAL est active et l'utilisateur demande à activer/désactiver le son
Lorsque la désactivation du son par HAL est activée et que la désactivation du son par l'utilisateur est désactivée :
- L'état de désactivation global du groupe de volume est passé à
true
. - Les demandes de l'utilisateur visant à activer le mode silencieux seront traitées.
- Motif : Les demandes de désactivation du son des utilisateurs doivent être respectées à tout moment pour préserver la confidentialité des données des utilisateurs.
Lorsque la désactivation du son par HAL et la désactivation du son par l'utilisateur sont activées :
L'état de désactivation global du groupe de volume est passé à
true
.Les demandes de désactivation du son envoyées par l'utilisateur seront traitées.
NOT
L'état de désactivation du son de l'utilisateur mis en cache reste activé.Raison : Les demandes de réactivation du son par les utilisateurs ne seront honorées que si aucune restriction n'est active.
Motif : L'activation du son d'un utilisateur mis en sourdine et mis en cache peut entraîner une explosion sonore involontaire et mettre en danger la sécurité de l'utilisateur. Cela est particulièrement vrai si l'état de mise en sourdine est activé sur plusieurs cycles d'allumage, ce qui réduit la perception du niveau sonore par les utilisateurs.
Cas d'interaction : la désactivation et l'activation de la désactivation du micro par HAL n'ont aucun impact sur la désactivation du micro par l'utilisateur
Si vous activez ou désactivez la désactivation du son HAL, l'état de désactivation du son global du groupe de volume change. Toutefois, il ne met pas directement à jour l'état de la désactivation du son de l'utilisateur. Lorsque la désactivation du son par l'utilisateur est désactivée et que le rappel de désactivation du son HAL à activer est reçu :
- L'état de désactivation global du groupe de volume est passé à
true
. Les demandes de l'utilisateur visant à modifier le volume
NOT
seront traitées lorsque la désactivation HAL est activée.Raison : l'utilisateur ne peut pas entendre de son lorsque le micro est coupé. Autoriser la modification du volume peut entraîner une explosion sonore et mettre en danger la sécurité des utilisateurs.
Raison : Les applications de volume peuvent s'inscrire aux rappels et déclencher une réactivation du son (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) automatiquement sans intervention de l'utilisateur, si tel est le comportement attendu par l'OEM.
Lorsque la désactivation du son par HAL est désactivée et que la désactivation du son par l'utilisateur est désactivée :
L'état de mise en sourdine du groupe de volume est passé à
false
.Motif : Rendre l'état de désactivation du son persistant et demander à l'utilisateur de réactiver le son peut l'interrompre inutilement lorsque les états de désactivation du son basculent fréquemment.
Les demandes des utilisateurs visant à modifier le volume seront traitées normalement.
Vidéo bloquée
Voici les restrictions de blocage :
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
Lorsque les restrictions de blocage sont actives, les demandes des utilisateurs pour :
- Les modifications du volume ne sont pas traitées.
- Les commandes d'activation/désactivation du son sont traitées.
Limitation
Voici les restrictions de limitation :
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Lorsque les restrictions de limitation sont actives, les demandes des utilisateurs pour :
Régler le volume :
- Les demandes "Dans la limite" sont traitées
- Les valeurs au-dessus de la limite ne sont pas traitées.
Les commandes d'activation/désactivation du son sont traitées.
Atténuation
Voici les restrictions d'atténuation :
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Lorsque les restrictions d'atténuation sont actives, les demandes des utilisateurs visant à :
Les modifications du volume sont traitées. Le nouveau niveau de volume actuel est défini sur le volume atténué (au lieu du volume précédent). Les futures modifications du volume seront effectuées à ce niveau.
L'activation/désactivation du son est traitée.
Mettre à jour l'index
Voici ce qui est considéré comme une mise à jour asynchrone de l'index de volume :
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Pour cette raison, AudioControl HAL peut mettre à jour l'index actuel du groupe de volume vers l'index spécifié. Il est principalement utilisé comme retour d'information du système audio pour la demande de modification du volume provenant du framework audio de la voiture. La mise à jour de l'index est également communiquée aux applications sous la forme d'un rappel CarVolumeGroupEvent
pour synchroniser l'index.
Exemples
Cas d'utilisation : l'utilisateur définit l'index de volume sur 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é à Audio HAL.
Les implémentations du fournisseur de
Audio HAL
reçoivent le nouveau gain de volume et mettent à jour le système audio (comme l'ampli externe).Le système audio répond que le niveau de volume n'est mis à jour qu'à l'index 15 (pour des raisons inconnues d'Android).
Implémentations de déclencheurs
AudioControl HAL
par les fournisseurs :IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
Le service audio de la voiture utilise le nouvel index du rappel qui est utilisé pour la persistance et les rappels à l'application de volume. L'index demandé par l'utilisateur est 30. Cependant, le système audio met à jour l'index sur 15 grâce à un retour d'information asynchrone.
Cas d'utilisation : première lecture audio après la sortie du mode veille
L'index de volume avant la suspension est défini sur un niveau élevé de 95 (plage : [0-99]).
Android passe en mode veille.
Une fois Android existant suspendu (par exemple, reprendre) :
Le fournisseur
Audio HAL/AudioControl HAL
applique un index de sécurité de 30 au système audio en local.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 de la voiture utilise le nouvel index du rappel, qui est utilisé pour la persistance et ses propres rappels à l'application de volume synchronisant l'index. L'index de volume avant la suspension est de 95. Toutefois, après la reprise, cet index est défini sur un niveau de volume sûr de 30 par l'implémenteur
AudioControl HAL
.
Configuration dynamique du volume
Pour cette fonctionnalité, nous avons identifié les principaux cas d'utilisation suivants :
Configuration de fin de chaîne (EOL) du véhicule.
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 chargement latéral sans mise à jour de l'image logicielle Android.
Les constructeurs automobiles peuvent avoir besoin de mettre à jour la configuration du volume lors d'un entretien.
Configuration de l'environnement d'exécution. Les systèmes audio automobiles sont compatibles avec les configurations d'amplificateurs externes. Ces ECU peuvent héberger les configurations de plage de volume qui sont interrogées au moment du démarrage.
Configuration à la demande : Proposé pour répondre au besoin croissant de fonctionnalités audio à la demande, dans lesquelles les utilisateurs s'abonnent à un traitement du signal amélioré pendant une période donnée. Les nouvelles configurations de plage de volume sont valables pendant toute la durée d'un abonnement.
Conception
La configuration dynamique des volumes se déroule en trois étapes :
Découverte : L'implémentation AudioControl HAL du fournisseur découvre les nouvelles mises à jour de la plage de volume via un mécanisme IPC personnalisé appartenant au fournisseur.
Une fois la connexion détectée, un rappel est généré via
AudioControl::IModuleChangeCallback
.Mettre à jour La pile audio de la voiture met à jour les états des groupes de volume avec les nouvelles plages de volume.
Nous nous efforçons de maintenir le même niveau de volume après la mise à jour de la plage de volume. Toutefois, si l'index sort des 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 la mise à jour de la plage du groupe de volumes, la pile audio de la voiture déclenche un rappel vers les applications enregistrées via
CarVolumeGroupEventCallback
.CarVolumeGroupEvent
contient lesCarVolumeGroupInfo
, le type d'événement (ce qui a changé) et les informations supplémentaires (pourquoi cela a changé) mis à jour.
Figure 2. Configuration du volume dynamique.
API HAL
AudioControl @ 3.0 AIDL
La version 3.0 de l'AIDL HAL AudioControl introduit les API suivantes :
API | |
---|---|
IAudioControl#setModuleChangeCallback | Définit une instance de IModuleChangeCallback avec AudioControl HAL. |
IAudioControl#clearModuleChangeCallback | Efface l'instance de IModuleChangeCallback précédemment définie avec le HAL AudioControl. |
IModuleChangeCallback#onAudioPortsChanged | Rappel pour notifier les modifications apportées aux ports audio |
Séquence
Le diagramme de séquence de la configuration dynamique du volume est affiché ci-dessous.
Figure 3. Diagramme séquentiel pour la configuration dynamique des volumes.
Aspects clés
Pour optimiser cette fonctionnalité, tenez compte des éléments suivants.
Les AudioPorts fournis dans le cadre du rappel doivent correspondre à la définition Automotive BUS :
- Port de l'appareil
IN_DEVICE
,OUT_DEVICE
- Connexion :
BUS
- Adresse. Définition dans la définition du HAL audio
- Mode Gain
JOINT
- Port de l'appareil
Les fournisseurs doivent définir un sur-ensemble de définitions de plage de volume dans la stratégie Audio HAL et utiliser le rappel pour le personnaliser pour les variantes de véhicule. Pour en savoir plus, consultez la définition AIDL de
IModuleChangeCallbac
.Lorsqu'un groupe de volume contient plusieurs BUS audio, chacun doit avoir des définitions de plage de volume identiques. Si vous ne le faites pas, le framework audio de la voiture rejettera la nouvelle définition de la plage de volume.