Gestion des volumes

AAOS dispose de sa propre gestion des volumes au sein de CarAudioService . Il 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 logiciel. Il organise également les périphériques de sortie en groupes de volumes pour appliquer les mêmes gains à tous les périphériques associés au groupe de volumes.

Utiliser des volumes fixes

Les implémentations AAOS devraient contrôler le volume à l'aide d'un amplificateur matériel 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 défini sur false), les applications peuvent appeler AudioManager.setStreamVolume() et modifier le volume par type de flux dans le mélangeur logiciel. Cela peut être indésirable en raison de l'effet potentiel sur d'autres applications et du fait que l'atténuation du volume dans le mélangeur logiciel entraîne une diminution du nombre de bits significatifs disponibles dans le signal lorsqu'il est reçu au niveau de 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 volume, le volume peut être contrôlé indépendamment et 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>

Exemple d'implémentation car_audio_configuration.xml .

Chaque groupe de volumes doit contenir un ou plusieurs périphériques de sortie avec des adresses associées. Ces adresses doivent correspondre aux périphériques de sortie définis dans audio_policy_configuration.xml .

Configuration des 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. Celles-ci sont déterminées en fonction des 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érifiera les valeurs de gain des périphériques associés et configurera 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

En raison 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 sera réglé 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 par leur ordre de définition 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 sera 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 . Voir l'exemple fourni dans Définition des groupes de volumes ci-dessus.

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 seront différents de ceux ceux de la zone secondaire.

Gestion des é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 et KEYCODE_VOLUME_MUTE . Par défaut, Android achemine les événements des touches de volume vers les applications. Les implémentations automobiles doivent forcer ces événements clés à CarAudioService , qui peut ensuite appeler 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, en tant que tels, 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 de priorité la plus élevée. 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. Il existe des API système correspondantes pour CarAudioManager qui 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 complètement à droite, -1,0 est complètement à gauche et une valeur en dehors de la plage -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 vers l'avant, -1,0 est complètement vers l'arrière et une valeur en dehors de la plage -1 à 1 est une erreur.

Il appartient aux constructeurs OEM de décider comment ces valeurs doivent être appliquées et comment elles seront présentées 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é en même temps puisse être entendu plus clairement. Dans AAOS, la mise en œuvre de l'atténuation audio est laissée au HAL, car il existe potentiellement de nombreux sons en dehors d'Android sur lesquels le système d'exploitation n'a aucun contrôle. Dans Android 11, la principale information dont dispose HAL pour prendre des décisions d'évitement 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'esquive sera gérée par son HAL, nous recommandons quelques lignes directrices générales. La lecture de plusieurs flux sur Android se produit le plus souvent lorsque deux applications/services détiennent simultanément le focus audio. Dans cet esprit, consultez la matrice d'interaction pour savoir quand Android peut accorder un focus simultané et, par conséquent, quand il est possible que deux flux différents soient lus simultanément.

Gardez à l’esprit que tous les flux mélangés par Android le seront 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.

Comportement d'esquive recommandé

Voici les interactions simultanées potentielles pour lesquelles nous recommandons d'appliquer l'esquive :

  • EMERGENCY . Canardez ou coupez tout sauf SAFETY pour vous assurer que le conducteur entend le son
  • SAFETY . Évitez tout sauf EMERGENCY pour vous assurer que le conducteur entend le son
  • NAVIGATION . Canardez tout sauf SAFETY et EMERGENCY
  • CALL . Évitez tout sauf SAFETY , EMERGENCY et NAVIGATION
  • VOICE . Canard CALL_RING
  • C'est aux constructeurs OEM de déterminer l'importance du VEHICLE_SOUNDS actif et s'ils doivent ou non éviter les autres sons pour s'assurer que le conducteur les entende.
  • MUSIC et ANNOUNCEMENT doivent être évitées par tout. La principale exception à cette règle concerne les tonalités d'interaction tactile qui sont actuellement jouées en tant que SYSTEM_SOUND .

Autres considérations lors de l'esquive

Certaines applications/services tels que la navigation ou l'assistant peuvent utiliser plusieurs joueurs pour effectuer leurs actions. Les constructeurs OEM doivent éviter de procéder à un désabaissement trop agressif en fonction du moment où les données de flux cessent de passer par ces périphériques de sortie, afin de garantir que l'utilisateur ne voit pas momentanément le retour du média au volume maximum avant d'être redescendu au début de la lecture suivante à partir de l'application de navigation ou d'assistant.

Pour les véhicules dotés de plusieurs scènes sonores avec une isolation suffisamment bonne, il existe également la possibilité d'acheminer l'audio vers différentes zones de la voiture plutôt que de l'esquiver. Par exemple, les instructions de navigation pourraient être acheminées vers les haut-parleurs de l'appuie-tête du conducteur pendant que la musique continue de jouer dans toute la cabine à un volume normal.

Sons critiques pour la sécurité

Bien qu'Android 11 ait introduit les API de focalisation audio HAL , il appartient toujours à HAL de garantir que les sons critiques pour la sécurité sont prioritaires par rapport aux autres. Même si le HAL se concentre sur l'audio pour USAGE_EMERGENCY , cela ne garantit pas que les applications et les services Android ne joueront pas de sons. Il appartient au HAL de déterminer quels flux provenant d'Android doivent être mixés ou mis en sourdine lorsque des sons critiques pour la sécurité sont diffusés.

Configuration de 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 (qui peut être superposée comme décrit dans Configuration des groupes de volumes). Cette séparation garantit qu'aucune modification n'est requise si la configuration des groupes de volumes change à l'avenir.

Dans l'interface utilisateur des paramètres de voiture, le fichier packages/apps/Car/Settings/res/xml/car_volume_items.xml contient des éléments d'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 à la fois 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 de la première 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 averti des changements de volume.