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="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 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 volume en dehors de la plage compatible 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 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.

Volume d'activation minimal et maximal

Android 15 introduit le contrôle des indices de groupe de volume pour améliorer la sécurité et le confort des utilisateurs dans les systèmes audio de voiture. 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). Pour activer cette fonctionnalité, définissez audioUseMinMaxActivationVolume sur true dans les RRO de service automobile.

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é dans le groupe de volumes (group) ultérieurement.
  • Ne doit contenir qu'un seul activationVolumeConfigEntry.

Chaque activationVolumeConfig contient les attributs suivants:

  • minActivationVolumePercentage (entier, 0-100, facultatif, par défaut: 0) : spécifie le volume d'activation minimal en pourcentage.
  • maxActivationVolumePercentage (entier, 0-100, facultatif, 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: ne s'applique qu'à 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 application ou une source d'UID modifiée sur un groupe de volume.
    • onPlaybackChanged: appliqué à chaque lecture nouvellement active sur 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 mise au point audio actuelle de la HAL de contrôle audio, où la requête de mise au point audio de la HAL de contrôle audio indique qu'une lecture audio active se produit 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 des chemins de données audio actifs pour le volume d'activation minimal et maximal.

Avec les valeurs minActivationVolumePercentage, maxActivationVolumePercentage, l'indice 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 volumes. CarAudioService surveille chaque nouvelle lecture active et applique le volume d'activation minimal et maximal dans les conditions suivantes:

  • Le type d'appel correspond: le type d'activation de la lecture (dérivé du Gestionnaire audio, du HAL de contrôle audio ou du Gestionnaire de téléphonie) doit correspondre au invocationType spécifié dans le activationVolumeConfigEntry associé au groupe de volume.
  • Indice de gain de volume hors plage: l'indice de gain de volume actuel du groupe de volumes doit se trouver en dehors de la plage d'indice de gain de volume d'activation définie. Plus précisément, l'une des conditions suivantes est vraie:

    • L'indice est inférieur à l'indice de gain de volume d'activation minimal calculé.

      OU

    • L'indice est supérieur à l'indice de gain de volume d'activation maximal calculé.

En cas de correspondance d'activation, l'indice de gain de volume du groupe de volumes est ajusté à l'un des éléments suivants:

  • Indice de gain de volume d'activation minimal s'il est inférieur à l'indice de gain de 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énement 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 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.

Atténuation audio

La diminution du son 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 étouffer les 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 réduire le volume. 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'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 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 voitures 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 pour que les applications de plate-forme et privilégiées puissent s'enregistrer et ê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 priorisés. La pile audio de la voiture ne déclenche plus CarVolumeCallback. Cela évite de dupliquer des déclencheurs dans 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 de 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: la mise en sourdine HAL est active et l'utilisateur demande à activer la 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 être respectées en tout temps 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 muet 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 ne change pas

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 la mise en sourdine HAL est désactivée et que la mise en sourdine de l'utilisateur est désactivée:

  • 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'indice 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 fait 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 les CarVolumeGroupInfo, Event-type (ce qui a changé) et Extra-info (pourquoi il a changé) mis à jour.

image

Figure 2. 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 3. Schéma 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 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 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.