AAOS dispose de sa propre gestion des volumes dans CarAudioService
. Elle utilise des composants
volumes, en partant du principe que les volumes doivent être appliqués en dessous de la couche HAL
plutôt que dans un logiciel. Il organise également les périphériques de sortie en groupes de volumes.
pour appliquer les mêmes gains à tous les appareils associés au groupe de volumes.
Utiliser des volumes fixes
Les implémentations AAOS doivent contrôler le volume à l'aide d'un amplificateur matériel 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'option config_useFixedVolume
n'est pas définie (ou est définie sur "false"),
applications peuvent appeler AudioManager.setStreamVolume()
et modifier le
le volume par type de flux dans le mélangeur logiciel. Cela peut être indésirable pour les raisons suivantes :
l'effet potentiel sur d'autres applications et l'atténuation du volume
le mélangeur logiciel réduit
le nombre de bits significatifs disponibles dans le signal lorsque
reçu au niveau de l'amplificateur matériel.
Groupes de volumes
Les groupes de volumes permettent de gérer les volumes d'un ensemble d'appareils dans une zone audio. Pour chaque groupe de volumes, le volume peut être contrôlé indépendamment, gains 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 lorsqu'il 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>
Exemple d'implémentation de car_audio_configuration.xml
Chaque groupe de volumes doit contenir un ou plusieurs périphériques de sortie avec des adresses associées.
Ces 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 que
une taille de pas. Elles sont déterminées en fonction des valeurs configurées dans
audio_policy_configuration.xml
pour les appareils associés
avec le 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>
Pendant l'initialisation, le groupe de volumes vérifie les valeurs de gain des appareils et configurez 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
En raison de la configuration de ces valeurs, il est possible de définir le gain groupe de volumes situé en dehors de la plage acceptée par un appareil associé à ce groupe de volumes Dans ce cas, pour cet appareil, le gain sera défini sur la valeur minimale ou maximale de l'appareil la valeur de gain 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 par leur ordre de définition dans le fichier XML.
Les ID sont compris entre 0 et N-1 au sein d'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 d'une zone à l'autre. Ces identifiants
sont utilisés pour les API CarAudioManager
associées à des groupes de volumes. N'importe quelle API
qui accepte un groupId
sans zoneId
utilise par défaut le
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ée qu'à une seule zone audio. Cette relation est définie comme faisant partie
car_audio_configuration.xml
Consultez l'exemple fourni dans
Définir des groupes de volumes ci-dessus.
Les niveaux de volume actuels pour chaque zone sont conservés pour l'utilisateur associé à dans cette zone. Ces paramètres sont propres à une zone, ce qui signifie que si un utilisateur se connecte sur un écran associée à la zone principale, puis se connecte à une zone associée à dans une zone audio secondaire, les niveaux de volume chargés et conservés pour la première zone différents de ceux de la zone secondaire.
Gérer les événements de touche de volume
Android définit plusieurs codes de clavier pour le contrôle du volume, y compris
KEYCODE_VOLUME_UP
, KEYCODE_VOLUME_DOWN
et
KEYCODE_VOLUME_MUTE
Par défaut, Android achemine la touche de volume
aux applications. Dans le secteur automobile, les implémentations
doivent forcer ces événements clés
CarAudioService
, qui peut ensuite appeler setGroupVolume
ou
setMasterMute
, le cas échéant.
Pour forcer ce comportement, définissez config_handleVolumeKeysInWindowManager
à true
:
<resources> <bool name="config_handleVolumeKeysInWindowManager">true</bool> </resources>
Actuellement, les événements de touches de volume n'ont aucun moyen de distinguer la zone dans laquelle ils se trouvent
destinées et, à ce titre, sont tous associés à la zone audio principale.
Lorsqu'un événement de touche de volume est reçu, CarAudioService
détermine le volume
en récupérant les contextes audio des joueurs actifs, puis en ajustant
groupe de volumes contenant le périphérique de sortie associé à la priorité la plus élevée
contexte audio. 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 de l'HAL AudioControl incluent des API permettant de définir le fondu et l'équilibre dans
le véhicule. Il existe des API système correspondantes pour CarAudioManager qui transmettent des valeurs
jusqu'au HAL AudioControl. Ces API nécessitent
android.car.permission.CAR_CONTROL_AUDIO_VOLUME
Les API AudioControl sont les suivantes:
setBalanceTowardRight(float value)
Règle le volume du haut-parleur sur côté droit (+) ou gauche (-) du véhicule. 0,0 est centré, +1,0 est complètement à droite, -1,0 correspond à -1,0 et toute valeur non comprise entre -1 et 1 est considérée comme une erreur.setFadeTowardFront(float value)
: règle le volume du haut-parleur sur avant (+) ou arrière (-) du véhicule. 0,0 est centré, +1,0 est complètement en avant, -1,0 correspond entièrement à l'arrière, et une valeur en dehors de la plage -1 à 1 est une erreur.
Il appartient aux OEM de décider comment appliquer ces valeurs seront présentées aux utilisateurs. Elles peuvent s'appliquer exclusivement 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 de mieux entendre un autre flux diffusé en même temps. Dans AAOS, L'atténuation de l'audio est confiée à l'HAL, car il peut y avoir de nombreux sons en dehors d'Android que le système d'exploitation n'a aucun contrôle. Sous Android 11, les principales informations disponible au HAL pour prendre des décisions d'atténuation : si deux périphériques de sortie ont tous les deux flux actifs.
Quand s'échapper
Il revient à chaque OEM de déterminer comment l'atténuation sera géré par son HAL, nous recommandons quelques consignes générales. La lecture de plusieurs flux sur Android se produisent le plus souvent lorsque deux applications ou services sont à l'origine de la priorité audio simultanément. Dans cette optique, Voir la section Matrice d'interaction pour savoir quand Android peut accorder un ciblage simultané et, par conséquent, quand il est possible que différents flux à lire simultanément.
N'oubliez pas que tous les flux mélangés par Android le seront avant tout gain. en cours d'application. 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 pour que le HAL puisse appliquer l'atténuation avant en les mélangeant.
Comportement d'atténuation recommandé
Voici des interactions simultanées potentielles pour lesquelles nous vous recommandons de baisser à appliquer:
EMERGENCY
Baisser le son ou couper le son de tout, saufSAFETY
pour vérifier que le conducteur entend bien le sonSAFETY
Basculez tous les éléments saufEMERGENCY
pour vous assurer le conducteur entend le sonNAVIGATION
Ignorer tout, saufSAFETY
etEMERGENCY
CALL
Basculez tout saufSAFETY
,EMERGENCY
etNAVIGATION
VOICE
CanardCALL_RING
- C'est aux OEM de déterminer l'importance de l'
VEHICLE_SOUNDS
active. et s'ils doivent ou non atténuer les autres sons pour être sûrs que le conducteur les entende. MUSIC
etANNOUNCEMENT
doivent être masqués par tout. La principale exception à cette règle concerne les tonalités d'interaction tactile, qui sont actuellement luesSYSTEM_SOUND
Autres points à prendre en compte lors de la diminution
Certains services/applis, comme la navigation ou l'assistant, peuvent utiliser plusieurs joueurs pour effectuer leurs actions. Les OEM doivent éviter de procéder à une réduction trop agressive en fonction du moment où les données de flux s'arrêtent. passant par ces périphériques de sortie pour s'assurer que l'utilisateur n'a pas momentanément de retour multimédia au volume maximal avant d'être abaissé vers le bas lors de la prochaine lecture depuis le menu de navigation ou l'application Assistant Google.
Pour les véhicules dotés de plusieurs étapes acoustiques et une isolation suffisante, vous pouvez aussi pour acheminer le son vers différentes zones du véhicule au lieu de baisser. Par exemple, la navigation ces instructions peuvent être transmises aux haut-parleurs de l'appui-tête du conducteur pendant que la musique continue à un volume normal dans toute la cabine.
Sons critiques pour la sécurité
Bien qu'Android 11 ait été lancé
API HAL Audio Focus
C'est toujours au HAL de s'assurer que les sons critiques pour la sécurité sont prioritaires sur
autres. Même si le HAL contient la priorité audio pour USAGE_EMERGENCY
, cela ne
garantir que les applications et services Android ne diffusent aucun son. C'est au HAL de déterminer
Déterminez quels flux provenant d'Android doivent être mélangés ou coupés lorsque des sons critiques pour la sécurité sont
joué.
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 (qui peut être superposé comme décrit dans la section "Configurer des groupes de volumes"). Cette séparation garantit qu'aucun des modifications sont nécessaires si la configuration des groupes de volumes est modifiée par la suite.
Dans l'interface utilisateur des paramètres de la voiture, packages/apps/Car/Settings/res/xml/car_volume_items.xml
contient des éléments d'interface utilisateur (ressources de titre et d'icône) associés à chaque
AudioAttributes.USAGE
Ce fichier offre un rendu raisonnable
le VolumeGroups
défini à l'aide des ressources associées au premier
Utilisation reconnue contenue dans chaque VolumeGroup.
Par exemple, l'exemple suivant définit un VolumeGroup comme incluant les deux
voice_communication
et voice_communication_signalling
. La valeur par défaut
de l'interface utilisateur des paramètres de la voiture affiche le VolumeGroup à l'aide des ressources associées
avec voice_communication
, qui est le premier 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 valeurs utilisés dans la configuration ci-dessus sont déclarés dans
packages/apps/Car/Settings/res/values/attrs.xml
Paramètres de volume
L'UI utilise les API CarAudioManager basées sur VolumeGroup suivantes:
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 recevoir une notification en cas de changement de volume.