Gestion des volumes

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 :

image

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é dans activationVolumeConfigEntry 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.

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() 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 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 deAudio HALreç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 :

  1. 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.

  2. 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.

  3. 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 les CarVolumeGroupInfo, le type d'événement (ce qui a changé) et les informations supplémentaires (pourquoi cela a changé) mis à jour.

image

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.

image

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
  • 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.