Gestion des volumes

La gestion du volume est contenue dans CarAudioService , qui utilise des volumes fixes dans l'espoir que les volumes soient appliqués en dessous du 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 périphériques 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 des effets potentiels sur d'autres applications et du fait que l'atténuation du volume dans le mélangeur 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 volumes gèrent les volumes d'un ensemble d'appareils au sein d'une zone audio. Pour chaque groupe de volumes, le volume peut être contrôlé indépendamment. Les gains résultants 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 l'utilisateur se connecte.

Définir des groupes de volumes

CarAudioService utilise les 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 a 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 périphériques 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 périphériques associés et configure le groupe comme suit :

  • Taille de pas. Doit être le même pour tous les appareils contrôlés par le groupe de volumes.
  • Gain minimum. Le plus petit gain minimum parmi les appareils du groupe.
  • Gain maximal. Gain maximum le plus élevé parmi les appareils du groupe.
  • Gain par défaut. Gain par défaut le plus élevé parmi les appareils du groupe.

Compte tenu de la façon dont ces valeurs sont configurées, il est possible de définir le gain d'un groupe de volumes en dehors de la plage prise en charge pour un périphérique associé au groupe de volumes. Dans ce cas, pour cet appareil, le gain est défini sur la valeur de gain minimale ou maximale de l'appareil, selon que la valeur du groupe de volumes est inférieure ou supérieure à la plage.

Identificateurs 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 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 aux groupes de volumes. Toute API qui accepte un groupId sans zoneId est par défaut la zone audio principale.

Gestion des volumes multizones

Chaque zone audio est censée 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 le cadre de 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 pour chaque zone sont conservés pour l'utilisateur associé à cette zone. Ces paramètres sont spécifiques à une zone, ce qui signifie que si un utilisateur se connecte sur un écran associé à la zone principale, puis se connecte plus tard 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 clé de volume

Android définit plusieurs codes clés pour le contrôle du volume, notamment :

  • 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 devraient 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'indicateur config_handleVolumeKeysInWindowManager sur true :

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

Les événements de touches de volume n'ont actuellement aucun moyen de distinguer à quelle zone 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 quel 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 la plus prioritaire. La priorisation est déterminée sur la base d'un ordre fixe défini dans CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY .

Fondu et équilibre

Les deux versions d'AudioControl HAL incluent des API pour régler le fondu et la balance dans le véhicule. Les API système correspondantes pour CarAudioManager transmettent les valeurs à AudioControl HAL. Ces API nécessitent android.car.permission.CAR_CONTROL_AUDIO_VOLUME . Les API AudioControl sont :

  • setBalanceTowardRight(float value) déplace le volume du haut-parleur vers le côté droit (+) ou gauche (-) de la voiture.

    • 0.0 est centré
    • +1,0 est tout à fait vrai
    • -1.0 est entièrement laissé
    • Une valeur en dehors de la plage de -1 à 1 est 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é
    • +1,0 est complètement en avant
    • -1.0 est complètement à l'arrière
    • Une valeur en dehors de la plage de -1 à 1 est une erreur

Vous décidez comment ces valeurs doivent être appliquées et comment les afficher aux utilisateurs. Ils pourraient être appliqués strictement aux médias ou à 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. Avec cela, il est possible de gérer alternativement le fondu et la balance via des effets audio sur les périphériques de sortie appropriés plutôt que via ces API.

Ducking audio

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, l'atténuation audio est implémentée par HAL. Android n'a aucun contrôle sur les sons au-delà du système d'exploitation. Dans Android 11, la principale information dont dispose HAL pour prendre des décisions d'esquivement est de savoir si deux périphériques de sortie ont tous deux des flux actifs.

Quand esquiver

Bien qu'il appartienne à chaque OEM de déterminer comment l'esquivement est géré par HAL, nous recommandons les directives suivantes.

  • Plusieurs flux diffusés sur Android se produisent généralement lorsque deux applications ou services détiennent simultanément le focus audio. Pour savoir quand Android peut accorder le focus simultané, consultez la matrice d'interaction dans Types de restrictions . Avec l'introduction du plugin car audio, cela dépend également de votre gestion AudioFocus.

  • Tous les flux mélangés par Android le sont avant que les gains ne soient appliqués. En tant que tel, tout flux qui doit être esquivé lorsqu'il est lu simultanément avec un autre doit être acheminé vers des périphériques de sortie séparés afin que HAL puisse appliquer l'esquive avant de les mélanger.

Voici les interactions concurrentes potentielles. Il est recommandé de s'esquiver.

Interaction Action
EMERGENCY Canards ou coupe tout sauf SAFETY
SAFETY Canards tout sauf EMERGENCY
NAVIGATION Canards tout sauf SAFETY et EMERGENCY
CALL Canards tout sauf SAFETY , EMERGENCY et NAVIGATION
VOICE Canards CALL_RING
VEHICLE_SOUNDS Vous déterminez l'importance du son actif et s'il évite ou non les autres sons.
MUSIC et ANNOUNCEMENT Esquivé par tout. Les exceptions sont les tonalités d'interaction tactile jouées en tant que SYSTEM_SOUND .

Considérations lors de l'esquive

Certaines applications et services, tels que la navigation ou un assistant, peuvent utiliser plusieurs lecteurs pour effectuer des actions. Évitez les atténuations agressives lorsqu'un flux de données cesse de circuler via les périphériques de sortie afin de garantir que le média ne revienne pas au volume maximum avant d'être esquivé avant3 la prochaine lecture à partir de la navigation ou le démarrage d'une application d'assistance.

Pour les véhicules dotés de plusieurs scènes sonores avec une isolation suffisamment bonne, vous pouvez acheminer le son vers différentes zones de la voiture au lieu de l'esquiver. Par exemple, les instructions de navigation peuvent être acheminées vers les haut-parleurs de l'appuie-tête du conducteur tout en continuant à diffuser de la musique dans toute la cabine à 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 détient le focus audio pour USAGE_EMERGENCY , il n'est pas garanti que les applications et services d'Android ne joueront pas de sons. Le HAL détermine quels flux d'Android doivent être mixés ou coupés pour diffuser des sons critiques pour 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 Configurer les gains du groupe de volumes . Cette séparation garantit qu'aucune modification n'est requise en cas de changement de configuration des groupes de volumes.

Dans l'interface utilisateur des paramètres de la voiture, packages/apps/Car/Settings/res/xml/car_volume_items.xml contient les éléments de l'interface utilisateur (ressources de titre et d'icône) associés à chaque AudioAttributes.USAGE défini. Ce fichier fournit un rendu raisonnable des VolumeGroups définis 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'interface utilisateur des paramètres de la voiture restitue le VolumeGroup en utilisant les ressources associées à voice_communication car il s'agit du premier 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 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 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 changements de volume.

Événement de groupe de volume de voiture

Les cas d'utilisation automobile de la mise à jour du volume et de la bascule de sourdine ont des fondements contextuels qui peuvent définir les actions de certaines applications, telles que les paramètres de volume. Le volume actuel et le rappel de sourdine 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 contient trois types d'informations critiques :

  • Liste des CarVolumeGroupInfo
  • EventTypes (bitmap)
  • Liste des ExtraInfos

CarVolumeGroupInfo

Le destinataire du rappel d'événement a un accès immédiat à la liste des informations sur les groupes de volumes de voitures 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 les CarVolumeGroupInfos reçus to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of EventTypes, comme expliqué ci-dessous.

Types d'événements

Définit quel aspect de CarVolumeGroupInfo a changé. Les applications peuvent l'utiliser pour identifier les changements et prendre les actions requises. Par exemple, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED indique que l' CarVolumeGroups' maximum volume gain index has changed and can be queried by CarVolumeGroupInfo.getMaxVolumeGainIndex()`.

Le tableau suivant montre la relation entre EventType et CarVolumeGroupInfo .

Type d'événement 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()

Informations supplémentaires

Fournit des informations supplémentaires sur la raison pour laquelle CarVolumeGroup a changé. Les applications peuvent utiliser ces informations pour fournir un contexte supplémentaire afin d'avertir l'utilisateur d'agir ou de le notifier. 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 essaie d'augmenter le volume.

Nous n'appliquons aucun processus pour ExtraInfos . Il est laissé à votre discrétion de déterminer le processus en fonction d' ExtraInfos . Par exemple, si l'atténuation est active en raison de EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED , vous pouvez également choisir d'atténuer initialement l'interface utilisateur de la barre de volume pour empêcher l'utilisateur de modifier le volume. D'autres peuvent choisir de montrer un toast indiquant que l'esquivement est actif et permettre à l'utilisateur de modifier le volume.

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

CarVolumeGroupEvent évolue pour répondre aux besoins futurs du framework audio automobile. Nous avons l'intention de prendre en charge les nouvelles fonctionnalités uniquement via CarVolumeGroupEvent . Nous recommandons fortement aux développeurs d'applications d'utiliser CarVolumeGroupEvent pour gérer le volume du groupe et désactiver les modifications.

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

Android 14 fournit un nouveau rappel permettant aux applications privilégiées et de plate-forme de s'inscrire et d'être informées de CarVolumeGroupEvents .

  • Pour vous inscrire au rappel, utilisez CarAudioManager#registerCarVolumeGroupEventCallback()

  • Pour désenregistrer le rappel, utilisez CarAudioManager#unregisterCarVolumeGroupEventCallback()

Si une application s'enregistre auprès du nouveau CarVolumeGroupEventCallback et de l'ancien CarVolumeCallback , les événements CarVolumeGroupEventCallbacks sont prioritaires. La pile audio de la voiture ne déclenche plus CarVolumeCallback . Cela évite les déclencheurs en double vers la même application pour le même événement.

Nous vous recommandons fortement d'utiliser CarVolumeGroupEventCallback pour gérer le volume du groupe et les modifications de sourdine.

Rappel du 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

Contrôle audio @2.0 AIDL

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

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

Le rappel AudioControl HAL comprend des listes de raisons et les AudioGainConfigInfo respectifs, qui comprennent :

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

Les raisons peuvent être globalement classées comme suit :

  • Raisons de restrictions. Modification transitoire du volume et comportement muet.
  • Mettre à jour les raisons. Modification permanente du comportement du volume.

Types de restrictions

Depuis AudioControl HAL AIDL V3 , les types de restrictions pris en charge sont les suivants :

  • Muet
  • Blocage
  • Limitation
  • Atténuation
Restriction active Changement de volume déclenché par l'utilisateur Bascule de sourdine déclenchée par l'utilisateur
Muet ❌ (activer le son)

✔ (muet)
Blocage
Limitation ❌ (au-delà de la limite)

✔ (sous la limite)
Atténuation

La priorité entre les restrictions est Muet > Blocage > Limitation > Atténuation.

Restrictions de sourdine

Les restrictions de mise en sourdine sont :

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Le framework audio de voiture maintient en interne ces deux états muets :

  • Utilisateur muet. Basculé en fonction de la demande de l'utilisateur, via CarAudioManager ou des événements clés.

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

Pour les auditeurs comme l'application Paramètres, l'état de sourdine globale du groupe de volumes ( CarVolumeGroupInfo.isMuted() ) sera basé sur l'activation de l'une ou l'autre des sourdines ci-dessus.

Lorsque la sourdine HAL est activée, toutes les demandes entrantes de modification du volume et de rétablissement du son de groupe sont ignorées pendant la durée de la restriction.

Cas d'interaction : la sourdine HAL est active et l'utilisateur demande le basculement de la sourdine

Lorsque la sourdine HAL est activée et que la sourdine utilisateur est désactivée :

  • L’état muet global du groupe de volumes devient true .
  • Les demandes de l'utilisateur pour activer la sourdine seront traitées.
    • Raison : Les demandes de mise en sourdine des utilisateurs doivent être honorées à tout moment afin de préserver la confidentialité des utilisateurs.

Lorsque la sourdine HAL et la sourdine utilisateur sont activées :

  • L’état muet global du groupe de volumes devient true .

  • Les demandes de l'utilisateur visant à désactiver la sourdine ne seront NOT traitées. L’état muet de l’utilisateur mis en cache reste activé.

    • Raison : Les demandes de rétablissement du son des utilisateurs ne seront honorées que si aucune restriction n'est active.

    • Raison : La désactivation de la sourdine de l'utilisateur mise en cache peut provoquer une explosion sonore involontaire et mettre en danger la sécurité de l'utilisateur. Cela est particulièrement vrai si l'état muet est activé pendant les cycles d'allumage, ce qui réduit la conscience des utilisateurs de la perception du niveau sonore.

Cas d'interaction : HAL Mute activé et désactivé alors que la sourdine de l'utilisateur n'a aucun changement

Activer la sourdine HAL modifiera l’état de sourdine global du groupe de volumes. Cependant, il ne met pas directement à jour l'état de sourdine de l'utilisateur. Lorsque la sourdine de l'utilisateur est désactivée et que le rappel de la sourdine HAL pour l'activer est reçu :

  • L’état muet global du groupe de volumes devient true .
  • Les demandes de l'utilisateur visant à modifier le volume ne seront NOT traitées lorsque la sourdine HAL est activée.

    • Raison : L'utilisateur ne peut pas percevoir le son lorsque la sourdine est activée. Autoriser le changement de volume peut entraîner une explosion sonore et mettre en danger la sécurité de l'utilisateur.

    • Raison : les applications de volume peuvent s'inscrire aux rappels et déclencher automatiquement une activation (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) sans intervention de l'utilisateur, si tel est le comportement attendu de l'OEM.

Lorsque la sourdine HAL est désactivée alors que la sourdine utilisateur est désactivée :

  • L’état de sourdine du groupe de volumes devient false .

    Raison : Rendre l'état muet persistant et demander à l'utilisateur de réactiver le son peut interrompre inutilement l'utilisateur lorsque les états muets basculent fréquemment.

  • Les demandes des utilisateurs visant à modifier le volume seront traitées normalement.

Blocage

Les restrictions de blocage sont :

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE .

Lorsque les restrictions de blocage sont actives, les utilisateurs demandent :

  • Les modifications de volume ne sont pas traitées.
  • Les bascules muettes sont traitées.

Limitation

Les restrictions sont les suivantes :

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Lorsque les restrictions de limitation sont actives, les utilisateurs demandent à :

  • Changer le volume :

    • Dans la limite sont traités
    • Les limitations ci-dessus ne sont pas traitées
  • Les bascules muettes sont traitées.

Atténuation

Les restrictions d'atténuation sont :

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

Lorsque les restrictions d'atténuation sont actives, les utilisateurs demandent :

  • Les changements de volume sont traités. Le nouveau niveau de volume actuel est réglé sur le volume atténué (au lieu du volume précédent). Les futurs changements de volume sont effectués à partir de ce niveau.

  • La bascule en sourdine est traitée.

Mise à jour de l'index

Les éléments suivants sont considérés comme la 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 volumes vers l'index spécifié. Ceci est principalement utilisé comme retour du système audio pour la demande de changement de volume du framework audio de la voiture. 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 met à jour l'index de volume à 30

  • L'utilisateur utilise l'application Volume pour modifier l'index de volume à 30.

  • Cet index est converti en gain de volume et envoyé à Audio HAL.

  • Les implémentations des fournisseurs d' Audio HAL 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'à l'index 15 (pour des raisons inconnues d'Android).

  • Implémentations par les fournisseurs des déclencheurs AudioControl HAL :

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Le service audio de voiture consomme le nouvel index du rappel qui est utilisé pour la persistance et les rappels vers 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'indice de volume avant la suspension est réglé sur un niveau élevé de 95 (plage : [0-99]).

  • Android entre en suspension.

  • Une fois Android existant, suspendez (par exemple, reprenez) :

    • Vendor Audio HAL/AudioControl HAL applique localement un indice 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 de voiture consomme le nouvel index du rappel utilisé pour la persistance et ses propres rappels vers l'application de volume synchronisant l'index. L'indice de volume avant la suspension est de 95. Cependant, après la reprise, cet indice est défini sur un niveau de volume sûr de 30 par l'implémenteur AudioControl HAL .

Configuration de volumes dynamiques

Pour cette fonctionnalité, nous considérons les principaux cas d'utilisation suivants :

  1. Configuration de fin de ligne de véhicule (EOL).

    • Les constructeurs automobiles préfèrent mettre à jour les configurations de volume à EOL en fonction de la configuration du système audio du véhicule. En règle générale, il s'agit d'un chargement latéral sans mise à jour de l'image du logiciel Android.

    • Les constructeurs automobiles devront peut-être mettre à jour la configuration du volume lors d'un programme de service.

  2. Configuration d'exécution. Les systèmes audio automobiles prennent en charge les configurations d'amplificateurs externes et ces calculateurs peuvent héberger les configurations de plage de volume interrogées pendant le démarrage.

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

Conception

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

  • Découverte. L'implémentation AudioControl HAL du fournisseur découvre de nouvelles mises à jour de plages de volumes via un mécanisme IPC personnalisé appartenant au fournisseur.

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

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

    Des efforts sont faits pour maintenir le même niveau de volume après la mise à jour de la plage de volumes. Cependant, si l'indice sort des 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.

  • Rappeler.

    • Après les mises à jour de la plage de groupes de volumes, la pile audio de la voiture déclenche un rappel aux 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 1. Configuration de volume dynamique.

API HAL

Contrôle audio @ 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 AudioControl HAL.
IAudioControl#clearModuleChangeCallback Efface l’instance de IModuleChangeCallback précédemment définie avec AudioControl HAL.
IModuleChangeCallback#onAudioPortsChanged Rappel pour notifier les modifications apportées aux AudioPorts

Séquence

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

image

Figure 2. Diagramme de séquence pour la configuration de volume dynamique.

Aspects clés

Pour optimiser cette fonctionnalité, considérez ce qui suit.

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

    • Port de l'appareil. IN_DEVICE , OUT_DEVICE
    • Connexion. BUS
    • Adresse. Défini dans la définition Audio HAL
    • Mode gain. JOINT
  • Les fournisseurs doivent définir un sur-ensemble de définitions de plage de volume dans la politique Audio HAL et utiliser le rappel pour le personnaliser pour les variantes de véhicules. Voir la définition AIDL IModuleChangeCallbac pour plus d’informations.

  • Lorsque plusieurs BUS audio appartiennent au même groupe de volumes, chacun doit avoir des définitions de plage de volume identiques. Dans le cas contraire, le cadre audio de la voiture rejettera la nouvelle définition de plage de volume.