Gestion des volumes

La gestion des volumes est contenue dans CarAudioService, qui utilise des volumes fixes en partant du principe que les volumes sont appliqués en dessous de la couche HAL par un amplificateur matériel plutôt que par 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 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 mélangeur logiciel. Cela n'est pas toujours souhaitable en raison d'effets potentiels sur d'autres applications et du fait que l'atténuation du volume dans le mélangeur logiciel peut réduire le nombre de bits significatifs disponibles dans le signal lorsqu'il est reçu par l'amplificateur matériel.

Groupes de volumes

Les groupes de volumes permettent de gérer les volumes pour un ensemble d'appareils dans une zone audio. Le volume peut être contrôlé indépendamment pour chaque groupe de volumes. 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 lorsque celui-ci se connecte.

Définir des groupes de volumes

CarAudioService utilise des groupes de volumes définis dans car_audio_configuration.xml:

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <device address="bus0_media_out">
                        <context context="music"/>
                    </device>
                </group>
                <group>
                    <device address="bus1_navigation_out">
                        <context context="navigation"/>
                    </device>
                    <device address="bus2_voice_command_out">
                        <context context="voice_command"/>
                    </device>
                </group>
                ...
            </volumeGroups>
        </zone>
     </zones>
</audioZoneConfiguration>

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 minimale, maximale et par défaut, ainsi qu'une taille de pas en fonction des 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 volumes.
  • Gain minimal : Gain minimal le plus faible parmi les appareils du groupe.
  • Gain maximal : Gain maximal le plus élevé parmi les appareils du groupe.
  • Gain par défaut. Gain par défaut le plus élevé parmi les appareils du groupe.

Compte tenu de la configuration de ces valeurs, il est possible de définir le gain d'un groupe de volumes en dehors de la plage acceptée par un appareil associé à ce 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 volumes est inférieure ou supérieure à la plage.

Identifiants de groupe de volumes

Les groupes de volumes sont identifiés au moment de l'exécution dans l'ordre défini dans le fichier XML. Les ID sont compris entre 0 et N-1 dans une zone audio, où N est le nombre de groupes de volumes dans cette zone. De cette manière, les ID de groupe de volumes ne sont pas uniques 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 du volume multizone

Chaque zone audio doit avoir un ou plusieurs groupes de volumes, et chaque groupe de volumes 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. Par conséquent, si un utilisateur se connecte sur un écran associé à la zone principale, puis se connecte dans 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 touches de volume

Android définit plusieurs codes de clavier 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 des touches 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, selon le cas. Pour forcer ce comportement, définissez l'option config_handleVolumeKeysInWindowManager sur true:

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

Actuellement, les événements de touche de volume n'ont aucun moyen de distinguer la zone à laquelle ils sont destinés. Ils 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 volumes contenant le périphérique de sortie associé au contexte audio ayant la 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 définir le fondu 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 du haut-parleur vers le côté droit (+) ou gauche (-) de la voiture.

    • 0,0 est centré
    • La valeur +1,0 correspond parfaitement
    • -1,0 correspond à la limite restante
    • Une valeur non comprise entre -1 et 1 indique une erreur.
  • setFadeTowardFront(float value) déplace le volume du haut-parleur vers l'avant (+) ou l'arrière (-) de la voiture.

    • 0,0 est centré
    • La valeur +1,0 est entièrement transférée.
    • -1.0 est entièrement à l'arrière
    • Une valeur non comprise entre -1 et 1 indique 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 présentées aux utilisateurs. Elles peuvent s'appliquer strictement aux médias ou à tous les sons Android. Android 11 permet également d'appliquer des effets audio aux périphériques de sortie. Il est ainsi possible de gérer le fondu et l'équilibre via des effets audio sur les périphériques de sortie appropriés plutôt que via ces API.

Diminution du volume

L'atténuation audio se produit lorsque le véhicule réduit le gain d'un flux afin qu'un autre flux diffusé simultanément puisse être entendu plus clairement. Dans AAOS, la diminution de l'audio est implémentée par le HAL. Android n'a aucun contrôle sur les sons en dehors de l'OS. Dans Android 11, la principale information disponible pour le HAL pour prendre des décisions d'atténuation est de savoir si deux appareils de sortie possèdent ou non des flux actifs.

Quand s'écarter

Bien qu'il incombe à chaque OEM de déterminer comment l'atténuation est géré par le HAL, nous recommandons les consignes suivantes.

  • Plusieurs flux lus sur Android se produisent généralement lorsque deux applications ou services sont actifs simultanément. Pour savoir quand Android peut accorder une sélection simultanée, consultez la matrice d'interaction dans Types de restriction. Avec l'introduction du plug-in audio pour voiture, cela dépend également de votre gestion AudioFocus.

  • Tous les flux mélangés par Android le sont avant l'application des gains. Ainsi, tout flux qui doit être baissé lorsqu'il est lu simultanément avec un autre doit être acheminé vers des périphériques de sortie distincts afin que le HAL puisse appliquer l'atténuation avant de les mélanger.

La diminution des interactions simultanées est recommandée :

Interactions Action
EMERGENCY Désactive ou coupe le son de tout sauf de SAFETY
SAFETY Désactive tout, sauf EMERGENCY
NAVIGATION Désactive tout, sauf SAFETY et EMERGENCY
CALL Masque tout sauf SAFETY, EMERGENCY et NAVIGATION
VOICE Canards CALL_RING
VEHICLE_SOUNDS Vous déterminez l'importance du son actif et s'il limite ou non les autres sons.
MUSIC et ANNOUNCEMENT Atténué par tout. à l'exception des tonalités d'interaction tactile lues comme SYSTEM_SOUND.

Remarques concernant l'atténuation

Certaines applications et certains services, tels que la navigation ou un assistant, peuvent utiliser plusieurs joueurs pour effectuer des actions. Évitez de procéder à une annulation agressive lorsqu'un flux de données cesse de circuler à travers les périphériques de sortie pour vous assurer que le contenu multimédia ne restitue pas le volume maximal avant d'être baissé avant le début de la prochaine lecture à partir de la navigation ou d'une application d'assistant.

Pour les véhicules dotés de plusieurs étapes sonores et d'une isolation suffisante, vous pouvez acheminer le son vers différentes zones du véhicule au lieu de baisser le son. Par exemple, les instructions de navigation peuvent être transmises aux haut-parleurs de l'appui-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 focus audio HAL. Le HAL garantit que les sons critiques pour la sécurité sont prioritaires sur les autres sons. Si le HAL contient la priorité audio pour USAGE_EMERGENCY, il n'est pas garanti que les applications et les services Android ne diffusent pas de sons. Le HAL détermine les flux provenant d'Android qui doivent être mixtes ou coupés 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. Ceux-ci peuvent être superposés, 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 fournit un rendu raisonnable du VolumeGroups défini en utilisant les ressources associées à la première utilisation reconnue contenue dans chaque VolumeGroup.

L'exemple suivant définit un VolumeGroup comme incluant voice_communication et voice_communication_signalling. L'implémentation par défaut de l'interface utilisateur des paramètres de la voiture affiche le VolumeGroup à l'aide des ressources associées à voice_communication, car il s'agit du premier élément matc du fichier.

<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
    <item car:usage="voice_communication"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="voice_communication_signalling"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="media"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="game"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="alarm"
          car:title="@*android:string/volume_alarm"
          car:icon="@*android:drawable/ic_audio_alarm"/>
    <item car:usage="assistance_navigation_guidance"
          car:title="@string/navi_volume_title"
          car:icon="@drawable/ic_audio_navi"/>
    <item car:usage="notification_ringtone"
          car:title="@*android:string/volume_ringtone"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistant"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="notification"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_request"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_instant"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_delayed"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_event"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_accessibility"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_sonification"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="unknown"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>

Les attributs et les valeurs utilisés dans la configuration ci-dessus sont déclarés dans packages/apps/Car/Settings/res/values/attrs.xml. L'interface utilisateur des paramètres de volume utilise les API CarAudioManager suivantes basées sur VolumeGroup:

  • getVolumeGroupCount() pour savoir combien de commandes doivent être dessinées.
  • getGroupMinVolume() et getGroupMaxVolume() pour obtenir les limites inférieure et supérieure.
  • getGroupVolume() pour obtenir le volume actuel.
  • registerVolumeChangeObserver() pour être informé des changements de volume.

Événement de groupe de volumes de la voiture

Dans le secteur automobile, les cas d'utilisation de mise à jour du volume et de désactivation du son ont des fondements contextuels qui peuvent définir les actions de certaines applications, telles que les paramètres de volume. Le rappel de volume et de coupure du son actuel de la pile audio de la voiture fournit des informations contextuelles limitées. Afin de mieux répondre aux besoins des cas d'utilisation du secteur automobile et de l'évolutivité future, CarVolumeGroupEvent a été ajouté à Android 14. Chaque événement contient trois types d'informations critiques:

  • Liste de CarVolumeGroupInfo
  • EventTypes (mappé sur bit)
  • Liste de ExtraInfos

Informations sur le groupe du volume de la voiture

Le récepteur du rappel d'événement dispose d'un accès direct à la liste des informations sur le groupe de volumes de la voiture concerné. Cela signifie que l'application n'a pas besoin d'effectuer d'appels supplémentaires au framework audio de la voiture 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 volumes de voiture sont également fournis dans EventTypes, comme expliqué ci-dessous.

Types d'événements

Définit quel aspect de CarVolumeGroupInfo a été modifié. Les applications peuvent l'utiliser pour identifier les modifications et effectuer les actions requises. 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.

Type d'événement Informations sur le groupe du volume de la voiture
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex() (en anglais)
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.ismuted()
ÉVÉNEMENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttéated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

Informations supplémentaires

Fournit des informations supplémentaires sur les raisons de la modification de CarVolumeGroup. Les applications peuvent utiliser ces informations pour fournir du contexte supplémentaire afin d'inviter l'utilisateur à agir ou à avertir l'utilisateur. Par exemple, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL indique une atténuation temporaire active due à une surcharge thermique. L'application peut informer l'utilisateur s'il tente d'augmenter le volume.

Nous ne 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'effectuer un fondu initial de l'UI de la barre de volume pour empêcher l'utilisateur de modifier le volume. D'autres peuvent afficher un toast indiquant que la diminution est active et permettre à l'utilisateur de modifier le volume.

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

CarVolumeGroupEvent évolue pour répondre aux futurs besoins de la structure audio pour voiture. 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 le volume de groupe et couper le son.

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

Android 14 fournit un nouveau rappel pour que les applications privilégiées et de plate-forme puissent s'enregistrer et être notifiées de CarVolumeGroupEvents.

  • Pour activer le rappel, utilisez CarAudioManager#registerCarVolumeGroupEventCallback().

  • Pour annuler l'enregistrement du rappel, utilisez CarAudioManager#unregisterCarVolumeGroupEventCallback().

Si une application s'enregistre avec la nouvelle CarVolumeGroupEventCallback et l'ancienne version de CarVolumeCallback, l'événement CarVolumeGroupEventCallbacks est prioritaire. La pile audio pour voiture ne déclenche plus CarVolumeCallback. Cela permet d'éviter les déclencheurs en double sur 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 couper le son.

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 de modifications apportées au système audio de la voiture.

API HAL

AudioControl @2.0 AIDL

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

API Finalité
IAudioControl#registerGainCallback Enregistre une instance de IAudioGainCallback auprès du HAL AudioControl.
IAudioGainCallback#onAudioDeviceGainsChanged Rappel asynchrone pour notifier les modifications apportées à la configuration du gain audio.

Le rappel HAL AudioControl inclut des listes de motifs et le AudioGainConfigInfo correspondant, qui se compose des éléments suivants:

  • ID de zone
  • Adresse du port de l'appareil
  • "Volume index > index" peut être soit un index restreint, soit un index de mise à jour.

Les raisons peuvent être classées comme suit:

  • Motifs de restriction. Modification temporaire du volume et de la désactivation du son
  • Motifs de mise à jour. Modification définitive du comportement du volume.

Types de restrictions

Depuis AudioControl HAL AIDL V3, les types de restrictions suivants sont acceptés:

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

✔ (ignorer)
Vidéo bloquée
Restriction ❌ (Au-delà de la limite)

✔ (sous la limite)
Atténuation

La priorité entre les restrictions est Couper le son > Blocage > Limitation > Atténuation.

Restrictions "Ignorer"

Les restrictions Ignorer sont les suivantes:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Le framework audio pour voiture conserve en interne ces deux états de coupure du son:

  • Coupure du son de l'utilisateur. Basculé en fonction de la requête de l'utilisateur, via CarAudioManager ou des événements clés.

  • Couper le son de HAL. Basculé en fonction des restrictions de son reçues via le rappel AudioGain.

Pour les écouteurs comme l'application Paramètres, l'état global de la désactivation du son (CarVolumeGroupInfo.isMuted()) du groupe de volumes dépendra de l'activation de l'une des coupures du son ci-dessus.

Lorsque le son de HAL est activé, toutes les requêtes entrantes de modification du volume et de réactivation du son des groupes sont ignorées pendant la durée de la restriction.

Cas d'interaction: la désactivation du son de HAL est active et l'utilisateur demande l'activation/la désactivation du son

Lorsque le son de l'HAL est activé et que celui de l'utilisateur est désactivé:

  • L'état général de la désactivation du son du groupe de volumes est défini sur true.
  • Les demandes de l'utilisateur pour activer la fonctionnalité Ignorer seront traitées.
    • Motif: Pour préserver la vie privée des utilisateurs, les demandes de désactivation du son doivent être appliquées en permanence.

Lorsque le son de HAL est activé et que celui de l'utilisateur est activé:

  • L'état général de la désactivation du son du groupe de volumes est défini sur true.

  • Les demandes de désactivation de "Ignorer" de l'utilisateur seront traitées NOT. L'état Ignorer de l'utilisateur en cache reste activé.

    • Motif: les demandes de réactivation des utilisateurs ne seront satisfaites qu'en l'absence de restrictions actives.

    • Motif: La réactivation du son mis en cache peut provoquer une explosion du son involontaire et mettre en danger la sécurité de l'utilisateur. Cela est particulièrement vrai si le son est coupé pendant les cycles d'allumage, ce qui réduit la perception du niveau sonore par les utilisateurs.

Cas d'interaction: la désactivation du son de HAL est activée et désactivée alors que la désactivation du son de l'utilisateur n'a pas été modifiée

Activer/Désactiver le son du HAL modifie l'état général du son du groupe de volumes. Toutefois, il ne met pas directement à jour l'état de désactivation du son de l'utilisateur. Lorsque la désactivation du son de l'utilisateur est désactivée et que le rappel à activer est reçu par HAL:

  • L'état général de la désactivation du son du groupe de volumes est défini sur true.
  • Les requêtes de modification du volume de l'utilisateur seront traitées NOT tant que la désactivation du son de la couche HAL est activée.

    • Motif: l'utilisateur ne peut pas percevoir le son lorsque le son est coupé. Autoriser une modification du volume peut entraîner une explosion sonore et mettre en danger la sécurité des utilisateurs.

    • Motif: les applications de volume peuvent enregistrer des rappels et déclencher une réactivation du son (CarAudioManager.setVolumeGroupmute(...,/* mute=*/ true,..)) automatiquement sans intervention de l'utilisateur, s'il s'agit du comportement attendu par l'OEM.

Lorsque le son de l'HAL est désactivé alors que celui de l'utilisateur est désactivé:

  • L'état de désactivation du son du groupe de volumes est désormais false.

    Motif: L'utilisateur risque d'interrompre inutilement le son lorsque l'état de désactivation du son est maintenu ou que l'utilisateur doit le réactiver fréquemment.

  • Les demandes de modification de volume émanant d'utilisateurs 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 à:

  • Les modifications de volume ne sont pas traitées.
  • La désactivation du son a été traitée.

Restriction

Les restrictions sont les suivantes:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Lorsque des restrictions de restriction sont actives, les utilisateurs doivent pouvoir:

  • Régler le volume:

    • sont traitées dans les limites
    • Les contenus ci-dessus ne sont pas traités
  • La désactivation du son a été traitée.

Atténuation

Les restrictions d'atténuation sont les suivantes:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

Lorsque les restrictions d'atténuation sont actives, les demandes des utilisateurs à:

  • Les modifications de volume sont en cours de traitement. Le nouveau niveau de volume actuel est réglé sur le volume atténué (et non sur le volume précédent). Les futurs changements de volume sont effectués à partir de ce niveau.

  • La désactivation du son a été traitée.

Mise à jour de l'index

La commande suivante est considérée comme une mise à jour d'index de volume asynchrone : Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

C'est pourquoi AudioControl HAL peut mettre à jour l'index actuel du groupe de volumes sur l'index spécifié. Elle est principalement utilisée comme retour d'information par le système audio pour la demande de modification de volume du framework audio de la voiture. La mise à jour de l'index est également communiquée avec Apps en tant que rappel CarVolumeGroupEvent pour synchroniser l'index.

Exemples

Cas d'utilisation: l'utilisateur met à jour l'index de volume à 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é à l'HAL audio.

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

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

  • Implémentations par le fournisseur de déclencheurs AudioControl HAL:

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

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

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

  • Android passe à l'état "Suspendre".

  • Une fois qu'Android existe une suspension (par exemple, reprendre):

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

    • 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 pour voiture utilise le nouvel index du rappel utilisé pour la persistance et ses propres rappels à l'application de volume synchronisant l'index. L'index de volume avant suspension est de 95. Toutefois, après la reprise, l'outil d'implémentation AudioControl HAL définit cet index sur un niveau de volume sûr de 30.

Configuration du volume dynamique

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

  1. Configuration de fin de ligne pour les véhicules.

    • 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 téléchargement indépendant sans mettre à jour l'image du logiciel Android.

    • Les constructeurs automobiles devront peut-être mettre à jour la configuration du volume pendant une planification de service.

  2. Configuration de l'environnement d'exécution. Les systèmes audio automobiles sont compatibles avec les configurations d'amplificateurs externes, et ces ECU peuvent héberger les configurations de plages de volumes qui sont interrogées lors du démarrage.

  3. Configuration à la demande. Proposé pour répondre au besoin croissant de fonctionnalités audio basées sur la demande, par lesquelles les utilisateurs s'abonnent au traitement amélioré du signal pendant un certain temps. Les nouvelles configurations de plage de volumes sont valides pour toute la durée d'un abonnement.

Design

La configuration du volume dynamique s'effectue en trois étapes:

  • Découverte : L'implémentation d'une solution HAL pour AudioControl du fournisseur détecte les nouvelles mises à jour des plages de volumes via un mécanisme d'IPC personnalisé appartenant au fournisseur.

    Une fois découvert, un rappel est généré via AudioControl::IModuleChangeCallback.

  • Mettre à jour. La pile audio de la voiture met à jour les états des groupes de volumes avec les nouvelles plages de volumes.

    Nous nous efforçons de conserver le même niveau de volume après la mise à jour de la plage de volume. Toutefois, si l'index dépasse les 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 les mises à jour des plages de groupes de volumes, la pile audio de la voiture déclenche un rappel vers les applications enregistrées via CarVolumeGroupEventCallback.

    • CarVolumeGroupEvent contient le CarVolumeGroupInfo mis à 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 d'AudioControl AIDL HAL introduit les API suivantes:

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

Séquence

Le diagramme séquentiel de la configuration du volume dynamique est présenté ci-dessous.

image

Figure 2. Schéma séquentiel pour la configuration d'un volume dynamique.

Aspects clés

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

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

    • Port de l'appareil : IN_DEVICE OUT_DEVICE
    • Connexion. BUS
    • Adresse : Définies dans la définition du HAL audio
    • Mode de gain JOINT
  • Les fournisseurs doivent définir un sur-ensemble de définitions de plage de volumes dans la règle Audio HAL et utiliser le rappel pour le personnaliser pour des variantes de véhicules. Pour en savoir plus, consultez la définition AIDL IModuleChangeCallbac.

  • Lorsque plusieurs BUS audio appartiennent au même groupe de volumes, chacun doit avoir des définitions de plage de volume identiques. Sinon, le framework audio de la voiture rejette la nouvelle définition de la plage de volumes.