Gestion des volumes

La gestion du volume est contenue dans CarAudioService, qui utilise des volumes fixes en supposant que les volumes sont appliqués sous le HAL par un amplificateur matériel plutôt que dans le logiciel. CarAudioService organise les périphériques de sortie en groupes de volume pour appliquer les mêmes gains à tous les périphériques associés à un groupe de volume.

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 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 moins de bits significatifs disponibles dans le signal lorsqu'il est reçu par l'amplificateur matériel.

Groupes de volumes

Les groupes de volumes gèrent les volumes d'un ensemble 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 sont 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="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 de groupe de volumes

Chaque groupe de volumes comporte des valeurs de gain minimal, maximal 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 l'incrément. 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.

Compte tenu de la façon dont ces valeurs sont configurées, il est possible de définir le gain d'un groupe de volumes en dehors de la plage compatible pour un appareil associé au 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 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 vont de 0 à N-1 dans une zone audio, où N est le nombre de groupes de volume 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 multizone des volumes

Chaque zone audio doit comporter un ou plusieurs groupes de volume, et chaque groupe de volume ne doit être 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 la section 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 à la zone. Autrement dit, si un utilisateur se connecte sur un écran associé à la zone principale, puis se connecte plus tard sur 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 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 achemine les événements de touche 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, le cas échéant. Pour forcer ce comportement, définissez l'indicateur config_handleVolumeKeysInWindowManager sur true:

<resources>
    <bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>

Les événements clés de volume ne permettent actuellement pas de distinguer la zone à laquelle ils sont destinés et 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 volume contenant l'appareil de sortie associé au contexte audio de 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 régler le fade 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 des haut-parleurs vers le côté droit (+) ou gauche (-) de la voiture.

    • 0,0 est centré
    • +1,0 est complètement à droite
    • -1,0 correspond à la position complètement à gauche.
    • Une valeur en dehors de la plage de -1 à 1 est une erreur
  • setFadeTowardFront(float value) déplace le volume des haut-parleurs vers l'avant (+) ou l'arrière (-) de la voiture.

    • 0,0 est centré
    • +1.0 est entièrement en avant
    • -1,0 correspond à l'arrière
    • Une valeur en dehors de la plage de -1 à 1 est 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 affichées auprès des utilisateurs. Ils peuvent être appliqués strictement aux contenus multimédias ou à tous les sons Android. Android 11 a également introduit la possibilité d'appliquer des effets audio aux appareils de sortie. Vous pouvez ainsi 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

La diminution du volume audio se produit lorsque le véhicule réduit le gain d'un flux afin qu'un autre flux diffusé simultanément soit entendu plus clairement. Dans AAOS, le masquage audio est implémenté par le HAL. Android n'a aucun contrôle sur les sons au-delà de l'OS. Dans Android 11, la principale information disponible pour le HAL afin de prendre des décisions de masquage est de savoir si deux appareils de sortie ont tous deux des flux actifs.

Quand se baisser

Bien qu'il soit de la responsabilité de chaque OEM de déterminer comment le masquage est géré par le 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 la sélection audio. Pour savoir quand Android peut accorder la sélection simultanée, consultez la matrice d'interactions dans la section Types de restrictions. Avec l'introduction du plug-in audio pour voiture, cela dépend également de votre gestion AudioFocus.

  • Les flux mélangés par Android le sont avant que des gains ne soient appliqués. Par conséquent, tout flux qui doit être masqué 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 le masquage avant de les mélanger.

Voici les interactions simultanées pour lesquelles le masquage est recommandé.

Interaction Action
EMERGENCY Coupe le son de tout sauf de SAFETY
SAFETY Coupe le son de tout sauf de EMERGENCY
NAVIGATION Ignore tout, sauf SAFETY et EMERGENCY
CALL Ignore tout, sauf SAFETY, EMERGENCY et NAVIGATION
VOICE Ducks CALL_RING
VEHICLE_SOUNDS Vous déterminez l'importance du son actif et s'il doit ou non être masqué par d'autres sons.
MUSIC et ANNOUNCEMENT Il a esquivé tout ce qui était possible. Les exceptions sont les sons d'interaction tactile lus en tant que SYSTEM_SOUND.

Éléments à prendre en compte lors du masquage du son

Certaines applications et services, comme la navigation ou un assistant, peuvent utiliser plusieurs lecteurs pour effectuer des actions. Évitez le démasquage agressif lorsqu'un flux de données cesse de circuler via les périphériques de sortie pour vous assurer que le contenu multimédia ne revient pas au volume maximal avant d'être masqué avant le prochain visionnage à partir de la navigation ou du lancement d'une application d'assistance.

Pour les véhicules dotés de plusieurs scènes sonores avec une isolation suffisante, vous pouvez acheminer l'audio vers différentes zones de la voiture au lieu de le couper. Par exemple, les instructions de navigation peuvent être acheminées vers les haut-parleurs du repose-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 mise au point audio HAL. Le HAL garantit que les sons critiques pour la sécurité sont prioritaires sur les autres sons. Si le HAL détient la sélection audio pour USAGE_EMERGENCY, il n'est pas garanti que les applications et services d'Android ne diffusent pas de sons. Le HAL détermine les flux Android à mixer ou à couper 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. Vous pouvez les superposer 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'interface utilisateur (ressources de titre et d'icône) associés à chaque AudioAttributes.USAGE défini. Ce fichier permet un rendu raisonnable des VolumeGroups définies en utilisant les ressources associées au premier usage reconnu contenu 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 connaître le nombre de commandes à dessiner.
  • getGroupMinVolume() et getGroupMaxVolume() 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 mise en sourdine ont des fondements contextuels qui peuvent définir les actions de certaines applications, telles que les paramètres de volume. Le rappel actuel du volume et de la mise en sourdine de la pile audio de la voiture fournit des informations contextuelles limitées. Pour mieux répondre aux cas d'utilisation automobiles et à la future évolutivité, CarVolumeGroupEvent est ajouté à Android 14. Chaque événement comporte trois types d'informations essentiels:

  • Liste de CarVolumeGroupInfo
  • EventTypes (mappage de bits)
  • Liste de ExtraInfos

CarVolumeGroupInfo

Le destinataire du rappel d'événement a un accès immédiat à la liste des informations sur le groupe de volume de voiture concerné. Cela signifie que l'application n'a pas besoin d'effectuer d'appels supplémentaires au framework audio pour voiture afin d'obtenir l'état le plus récent. Il peut simplement utiliser le CarVolumeGroupInfos reçu pour mettre à jour l'UI ou les états internes. Pour simplifier la tâche des applications, les aspects qui ont changé dans un groupe de volume de voitures 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 requises. Par exemple, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED indique que l'indice de gain de volume maximal CarVolumeGroups respectif 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 la raison pour laquelle l'CarVolumeGroup a changé. Les applications peuvent utiliser ces informations pour fournir un contexte supplémentaire afin d'alerter l'utilisateur à agir ou à envoyer une notification. Par exemple, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL indique une atténuation transitoire active en raison d'une surcharge thermique. L'application peut informer l'utilisateur s'il tente d'augmenter le volume.

Nous n'appliquons aucun processus 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'UI de la barre de volume au départ pour empêcher l'utilisateur de modifier le volume. D'autres peuvent choisir d'afficher un toast indiquant que le masquage est actif et autoriser l'utilisateur à modifier le volume.

Le framework audio de la voiture dépend du IAudioGainCallback HAL AudioControl pour fournir le ExtraInfos suggéré. Pour en savoir plus, consultez la section Rappel de gain audio.

CarVolumeGroupEvent s'adapte pour répondre aux futurs besoins du framework audio pour voitures. Nous prévoyons de prendre en charge les nouvelles fonctionnalités via CarVolumeGroupEvent uniquement. Nous recommandons vivement aux développeurs d'applications d'utiliser CarVolumeGroupEvent pour gérer le volume du groupe et les modifications de la mise en sourdine.

Rappel d'événement de groupe de volume de la voiture

Android 14 fournit un nouveau rappel permettant aux applications de plate-forme et privilégiées de s'enregistrer et d'être informées 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, les CarVolumeGroupEventCallbacks d'événement sont prioritaires. La pile audio de la voiture ne déclenche plus CarVolumeCallback. Cela évite les déclencheurs en double pour 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 les modifications de la mise en sourdine.

Rappel du gain audio

Depuis Android 13, le HAL AudioControl 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

AIDL AudioControl @2.0

La version 2.0 de l'HAL AIDL AudioControl ajoute l'API suivante:

API Objectif
IAudioControl#registerGainCallback Enregistre une instance de IAudioGainCallback avec le HAL AudioControl.
IAudioGainCallback#onAudioDeviceGainsChanged Rappel asynchrone pour informer des modifications apportées à la configuration du gain audio.

Le rappel HAL AudioControl inclut des listes de raisons et les AudioGainConfigInfo respectives, qui se composent comme suit:

  • ID de zone
  • Adresse du port de l'appareil
  • L'index de volume > index peut être un index limité ou un index de mise à jour.

Voici quelques exemples de raisons:

  • Motifs de la restriction Modification temporaire du comportement du volume et de la mise en sourdine.
  • Motifs de la mise à jour Modification permanente du comportement du volume.

Types de restrictions

À partir de AudioControl HAL AIDL V3, voici les types de restrictions compatibles:

  • Couper le son
  • Vidéo bloquée
  • Limite
  • Atténuation
Restriction active Modification du volume déclenchée par l'utilisateur Bouton de désactivation du son déclenché par l'utilisateur
Couper le son ❌ (réactiver le son)

✔ (couper le son)
Vidéo bloquée
Limite ❌ (au-delà de la limite)

✔ (en dessous de la limite)
Atténuation

La priorité entre les restrictions est la suivante : Silencieux > Blocage > Limitation > Atténuation.

Restrictions liées au masquage du son

Les restrictions de masquage sont les suivantes:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Le framework audio pour voitures gère en interne ces deux états de mise en sourdine:

  • Désactivation du son de l'utilisateur Activé ou désactivé en fonction de la demande de l'utilisateur, via CarAudioManager ou des événements de touche.

  • Coupure du son par HAL Activé ou désactivé en fonction des restrictions de mise en sourdine reçues via le rappel AudioGain.

Pour les écouteurs tels que l'application Paramètres, l'état de la mise en sourdine globale du groupe de volume (CarVolumeGroupInfo.isMuted()) dépend de l'activation de l'une des mises en sourdine ci-dessus.

Lorsque la mise en sourdine 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: le mode silencieux HAL est activé et l'utilisateur demande à activer le bouton de mise en sourdine

Lorsque la mise en sourdine HAL est activée et que la mise en sourdine de l'utilisateur est désactivée:

  • L'état de mise en sourdine globale du groupe de volume est défini sur true.
  • Les demandes de l'utilisateur visant à activer le mode muet seront traitées.
    • Motif: Les demandes de mise en sourdine des utilisateurs doivent toujours être respectées pour préserver leur confidentialité.

Lorsque le mode silencieux HAL et le mode silencieux utilisateur sont activés:

  • L'état de mise en sourdine globale du groupe de volume est défini sur true.

  • Les demandes de l'utilisateur visant à désactiver le masquage seront NOT traitées. L'état de mise en sourdine de l'utilisateur mis en cache reste activé.

    • Motif: Les demandes de réactivation du son de l'utilisateur ne seront acceptées que si aucune restriction n'est active.

    • Motif: Le fait de réactiver le son d'un utilisateur dont le son est masqué peut entraîner une explosion sonore involontaire et mettre en danger la sécurité des utilisateurs. Cela est particulièrement vrai si le mode silencieux est activé pour tous les cycles de démarrage, ce qui réduit la perception du niveau sonore par les utilisateurs.

Cas d'interaction: le mode Désactivation du son HAL est activé et désactivé, tandis que le mode Désactivation du son de l'utilisateur n'est pas modifié

Activer/Désactiver le mode muet HAL modifie l'état global de la mise en sourdine du groupe de volume. Toutefois, il ne met pas à jour directement l'état de mise en sourdine de l'utilisateur. Lorsque le masquage de l'utilisateur est désactivé et que le rappel de masquage HAL pour l'activer est reçu:

  • L'état de mise en sourdine globale du groupe de volume est défini sur true.
  • Les requêtes de l'utilisateur visant à modifier le volume seront traitées lorsque la mise en sourdine HAL est activée.NOT

    • Raison: L'utilisateur ne peut pas entendre le son lorsque le mode muet est activé. Autoriser le changement de volume peut entraîner une explosion sonore et mettre en danger la sécurité des utilisateurs.

    • Raison: Les applications de volume peuvent s'inscrire pour des 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 le mode silencieux HAL est désactivé et que le mode silencieux utilisateur est désactivé:

  • L'état de la mise en sourdine du groupe de volume est défini sur false.

    Motif: Rendre l'état de la coupure du son persistant et demander à l'utilisateur de la réactiver peut l'interrompre inutilement lorsque les états de la coupure du son basculent fréquemment.

  • Les demandes des utilisateurs de modifier le volume 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 pour:

  • Les modifications de volume ne sont pas traitées.
  • Les commandes d'activation/de désactivation du son sont traitées.

Limite

Les restrictions de limitation sont les suivantes:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Lorsque des restrictions de limitation sont actives, les requêtes des utilisateurs pour:

  • Régler le volume:

    • Les demandes dans la limite sont traitées
    • Les demandes au-delà de cette limite ne sont pas traitées.
  • Les commandes d'activation/de 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 requêtes des utilisateurs pour:

  • Les modifications de volume sont traitées. Le nouveau niveau de volume actuel est défini sur le volume atténué (et non sur l'ancien volume). Les futures modifications de volume seront effectuées à partir de ce niveau.

  • L'activation/désactivation du son est traitée.

Mise à jour de l'index

La mise à jour asynchrone de l'index de volume est considérée comme suit : Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

C'est pourquoi le HAL AudioControl peut mettre à jour l'index actuel du groupe de volume avec l'index spécifié. Il s'agit principalement d'un retour du système audio pour la demande de modification du volume du framework audio pour voitures. La mise à jour de l'index est également communiquée aux applications en tant que 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'indice de volume sur 30.

  • Cet indice est converti en gain de volume et envoyé à l'HAL audio.

  • Les implémentations du fournisseur de Audio HAL reçoivent le nouveau gain de volume et mettent à jour le système audio (comme un amplificateur externe).

  • Le système audio répond que le niveau de volume n'est mis à jour qu'à l'indice 15 (pour des raisons inconnues d'Android).

  • Implémentations des fournisseurs de déclencheurs AudioControl HAL:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Le service audio de la voiture consomme le nouvel index du rappel utilisé pour la persistance et les rappels vers l'application de volume. L'index demandé par l'utilisateur est 30. Toutefois, le retour asynchrone du système audio met à jour l'index sur 15.

Cas d'utilisation: Première lecture audio après la sortie de la suspension

  • L'indice de volume avant la suspension est défini sur un niveau élevé de 95 (plage: [0-99]).

  • Android passe en mode suspension.

  • Une fois Android suspendu (par exemple, reprise):

    • Le fournisseur Audio HAL/AudioControl HAL applique un indice sécurisé de 30 au système audio localement.

    • 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 consomme le nouvel index à partir du rappel utilisé pour la persistance et ses propres rappels à l'application de volume qui synchronise l'index. L'indice de volume avant la suspension est de 95. Toutefois, après la reprise, cet indice est défini sur un niveau de volume sécurisé de 30 par l'implémentateur AudioControl HAL.

Configuration dynamique du volume

Pour cette fonctionnalité, nous prenons en compte les principaux cas d'utilisation suivants:

  1. Configuration de la fin de vie du véhicule.

    • Les constructeurs automobiles préfèrent mettre à jour les configurations de volume à la 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 parallèle sans mise à jour de l'image logicielle Android.

    • Les constructeurs automobiles peuvent être amenés à mettre à jour la configuration du volume lors d'un calendrier de service.

  2. Configuration de l'environnement d'exécution. Les systèmes audio automobiles acceptent les configurations d'amplificateur externe, et ces ECU peuvent héberger les configurations de plage de volume interrogées au démarrage.

  3. Configuration à la demande Proposé pour répondre au besoin croissant de fonctionnalités audio sur demande, dans lesquelles les utilisateurs s'abonnent au traitement du signal amélioré pendant une période donnée. Les nouvelles configurations de plage de volumes sont valables pendant la durée d'un abonnement.

Conception

La configuration dynamique des volumes se déroule en trois étapes:

  • Découverte L'implémentation du HAL AudioControl du fournisseur détecte les nouvelles mises à jour de la plage de volume via un mécanisme IPC personnalisé appartenant au fournisseur.

    Une fois la détection effectuée, un rappel est généré via AudioControl::IModuleChangeCallback.

  • Mettez à 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'indice dépasse les limites, l'indice 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.

  • Callback.

    • Après la mise à jour de la plage de groupe de volume, la pile audio de la voiture déclenche un rappel vers les applications enregistrées via CarVolumeGroupEventCallback.

    • CarVolumeGroupEvent contient la CarVolumeGroupInfo mise à jour, le type d'événement (ce qui a changé) et les informations supplémentaires (pourquoi il a changé).

image

Figure 1 : Configuration dynamique du volume.

API HAL

AudioControl @ 3.0 AIDL

La version 3.0 de l'HAL AIDL AudioControl introduit les API suivantes:

API
IAudioControl#setModuleChangeCallback Définit une instance d'IModuleChangeCallback avec le HAL AudioControl.
IAudioControl#clearModuleChangeCallback Efface l'instance de IModuleChangeCallback précédemment définie avec le HAL AudioControl.
IModuleChangeCallback#onAudioPortsChanged Rappel pour informer des modifications apportées à AudioPorts

Séquence

Le diagramme de séquence de la configuration de volume dynamique est affiché ci-dessous.

image

Figure 2. Diagramme séquentiel de la configuration de volumes dynamiques.

Aspects clés

Pour optimiser cette fonctionnalité, tenez compte des points suivants.

  • Les AudioPorts fournis dans le rappel doivent correspondre à la définition du bus Automotive:

    • Port de l'appareil IN_DEVICE, OUT_DEVICE
    • Connexion : BUS
    • Adresse Défini dans la définition de l'Audio HAL
    • Mode Gain : JOINT
  • Les fournisseurs doivent définir un sur-ensemble de définitions de plage de volume dans la stratégie HAL audio et utiliser le rappel pour le personnaliser en fonction des variantes de véhicule. Pour en savoir plus, consultez la définition AIDL de IModuleChangeCallbac.

  • Lorsqu'un même groupe de volume comprend plusieurs bus audio, chacun d'eux doit avoir des définitions de plage de volume identiques. Dans le cas contraire, le framework audio de la voiture rejette la nouvelle définition de la plage de volume.