Gestion des volumes

AAOS dispose de sa propre gestion des volumes dans CarAudioService. Elle utilise des composants volumes, en partant du principe que les volumes doivent être appliqués en dessous de la couche HAL plutôt que dans un logiciel. Il organise également les périphériques de sortie en groupes de volumes. pour appliquer les mêmes gains à tous les appareils associés au groupe de volumes.

Utiliser des volumes fixes

Les implémentations AAOS doivent 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'option config_useFixedVolume n'est pas définie (ou est définie sur "false"), applications peuvent appeler AudioManager.setStreamVolume() et modifier le le volume par type de flux dans le mélangeur logiciel. Cela peut être indésirable pour les raisons suivantes : l'effet potentiel sur d'autres applications et l'atténuation du volume le mélangeur logiciel réduit le nombre de bits significatifs disponibles dans le signal lorsque reçu au niveau de l'amplificateur matériel.

Groupes de volumes

Les groupes de volumes permettent de gérer les volumes d'un ensemble d'appareils dans une zone audio. Pour chaque groupe de volumes, le volume peut être contrôlé indépendamment, gains 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 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 de 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

Configurer les gains du groupe de volumes

Chaque groupe de volumes possède des valeurs de gain minimale, maximale et par défaut, ainsi que une taille de pas. Elles sont déterminées en fonction des valeurs configurées dans audio_policy_configuration.xml pour les appareils associés avec le 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>

Pendant l'initialisation, le groupe de volumes vérifie les valeurs de gain des appareils et configurez 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

En raison de la configuration de ces valeurs, il est possible de définir le gain groupe de volumes situé en dehors de la plage acceptée par un appareil associé à ce groupe de volumes Dans ce cas, pour cet appareil, le gain sera défini sur la valeur minimale ou maximale de l'appareil la valeur de gain 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 par leur ordre de définition dans le fichier XML. Les ID sont compris entre 0 et N-1 au sein d'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 d'une zone à l'autre. Ces identifiants sont utilisés pour les API CarAudioManager associées à des groupes de volumes. N'importe quelle API qui accepte un groupId sans zoneId utilise par défaut le 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ée qu'à une seule zone audio. Cette relation est définie comme faisant partie car_audio_configuration.xml Consultez l'exemple fourni dans Définir des groupes de volumes ci-dessus.

Les niveaux de volume actuels pour chaque zone sont conservés pour l'utilisateur associé à dans cette zone. Ces paramètres sont propres à une zone, ce qui signifie que si un utilisateur se connecte sur un écran associée à la zone principale, puis se connecte à une zone associée à dans une zone audio secondaire, les niveaux de volume chargés et conservés pour la première zone différents de ceux de la zone secondaire.

Gérer les événements de touche de volume

Android définit plusieurs codes de clavier pour le contrôle du volume, y compris KEYCODE_VOLUME_UP, KEYCODE_VOLUME_DOWN et KEYCODE_VOLUME_MUTE Par défaut, Android achemine la touche de volume aux applications. Dans le secteur automobile, les implémentations doivent forcer ces événements clés CarAudioService, qui peut ensuite appeler setGroupVolume ou setMasterMute, le cas échéant.

Pour forcer ce comportement, définissez config_handleVolumeKeysInWindowManager à true:

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

Actuellement, les événements de touches de volume n'ont aucun moyen de distinguer la zone dans laquelle ils se trouvent destinées et, à ce titre, sont tous associés à la zone audio principale. Lorsqu'un événement de touche de volume est reçu, CarAudioService détermine le volume en récupérant les contextes audio des joueurs actifs, puis en ajustant groupe de volumes contenant le périphérique de sortie associé à la priorité la plus élevée contexte audio. 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 de l'HAL AudioControl incluent des API permettant de définir le fondu et l'équilibre dans le véhicule. Il existe des API système correspondantes pour CarAudioManager qui transmettent des valeurs jusqu'au HAL AudioControl. Ces API nécessitent android.car.permission.CAR_CONTROL_AUDIO_VOLUME

Les API AudioControl sont les suivantes:

  • setBalanceTowardRight(float value) Règle le volume du haut-parleur sur côté droit (+) ou gauche (-) du véhicule. 0,0 est centré, +1,0 est complètement à droite, -1,0 correspond à -1,0 et toute valeur non comprise entre -1 et 1 est considérée comme une erreur.
  • setFadeTowardFront(float value) : règle le volume du haut-parleur sur avant (+) ou arrière (-) du véhicule. 0,0 est centré, +1,0 est complètement en avant, -1,0 correspond entièrement à l'arrière, et une valeur en dehors de la plage -1 à 1 est une erreur.

Il appartient aux OEM de décider comment appliquer ces valeurs seront présentées aux utilisateurs. Elles peuvent s'appliquer exclusivement 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 de mieux entendre un autre flux diffusé en même temps. Dans AAOS, L'atténuation de l'audio est confiée à l'HAL, car il peut y avoir de nombreux sons en dehors d'Android que le système d'exploitation n'a aucun contrôle. Sous Android 11, les principales informations disponible au HAL pour prendre des décisions d'atténuation : si deux périphériques de sortie ont tous les deux flux actifs.

Quand s'échapper

Il revient à chaque OEM de déterminer comment l'atténuation sera géré par son HAL, nous recommandons quelques consignes générales. La lecture de plusieurs flux sur Android se produisent le plus souvent lorsque deux applications ou services sont à l'origine de la priorité audio simultanément. Dans cette optique, Voir la section Matrice d'interaction pour savoir quand Android peut accorder un ciblage simultané et, par conséquent, quand il est possible que différents flux à lire simultanément.

N'oubliez pas que tous les flux mélangés par Android le seront avant tout gain. en cours d'application. 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 pour que le HAL puisse appliquer l'atténuation avant en les mélangeant.

Comportement d'atténuation recommandé

Voici des interactions simultanées potentielles pour lesquelles nous vous recommandons de baisser à appliquer:

  • EMERGENCY Baisser le son ou couper le son de tout, sauf SAFETY pour vérifier que le conducteur entend bien le son
  • SAFETY Basculez tous les éléments sauf EMERGENCY pour vous assurer le conducteur entend le son
  • NAVIGATION Ignorer tout, sauf SAFETY et EMERGENCY
  • CALL Basculez tout sauf SAFETY, EMERGENCY et NAVIGATION
  • VOICE Canard CALL_RING
  • C'est aux OEM de déterminer l'importance de l'VEHICLE_SOUNDS active. et s'ils doivent ou non atténuer les autres sons pour être sûrs que le conducteur les entende.
  • MUSIC et ANNOUNCEMENT doivent être masqués par tout. La principale exception à cette règle concerne les tonalités d'interaction tactile, qui sont actuellement lues SYSTEM_SOUND

Autres points à prendre en compte lors de la diminution

Certains services/applis, comme la navigation ou l'assistant, peuvent utiliser plusieurs joueurs pour effectuer leurs actions. Les OEM doivent éviter de procéder à une réduction trop agressive en fonction du moment où les données de flux s'arrêtent. passant par ces périphériques de sortie pour s'assurer que l'utilisateur n'a pas momentanément de retour multimédia au volume maximal avant d'être abaissé vers le bas lors de la prochaine lecture depuis le menu de navigation ou l'application Assistant Google.

Pour les véhicules dotés de plusieurs étapes acoustiques et une isolation suffisante, vous pouvez aussi pour acheminer le son vers différentes zones du véhicule au lieu de baisser. Par exemple, la navigation ces instructions peuvent être transmises aux haut-parleurs de l'appui-tête du conducteur pendant que la musique continue à un volume normal dans toute la cabine.

Sons critiques pour la sécurité

Bien qu'Android 11 ait été lancé API HAL Audio Focus C'est toujours au HAL de s'assurer que les sons critiques pour la sécurité sont prioritaires sur autres. Même si le HAL contient la priorité audio pour USAGE_EMERGENCY, cela ne garantir que les applications et services Android ne diffusent aucun son. C'est au HAL de déterminer Déterminez quels flux provenant d'Android doivent être mélangés ou coupés lorsque des sons critiques pour la sécurité sont joué.

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 (qui peut être superposé comme décrit dans la section "Configurer des groupes de volumes"). Cette séparation garantit qu'aucun des modifications sont nécessaires si la configuration des groupes de volumes est modifiée par la suite.

Dans l'interface utilisateur des paramètres de la voiture, 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 Ce fichier offre un rendu raisonnable le VolumeGroups défini à l'aide des ressources associées au premier Utilisation reconnue contenue dans chaque VolumeGroup.

Par exemple, l'exemple suivant définit un VolumeGroup comme incluant les deux voice_communication et voice_communication_signalling. La valeur par défaut de l'interface utilisateur des paramètres de la voiture affiche le VolumeGroup à l'aide des ressources associées avec voice_communication, qui est le premier 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 Paramètres de volume L'UI utilise les API CarAudioManager basées sur VolumeGroup suivantes:

  • 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 recevoir une notification en cas de changement de volume.