Volume-Verwaltung

Die Lautstärkeverwaltung ist in CarAudioService enthalten. Dort werden feste Lautstärken verwendet, da davon ausgegangen wird, dass die Lautstärke unterhalb der HAL von einem Hardwareverstärker und nicht in der Software angepasst wird. Mit CarAudioService werden Ausgabegeräte in Lautstärkegruppen organisiert, um dieselben Verstärkungen auf alle Geräte anzuwenden, die einer Lautstärkegruppe zugeordnet sind.

Feste Volumes

AAOS-Implementierungen verwenden einen Hardwareverstärker zur Lautstärkeregelung anstelle eines Software-Mixers. Um Nebenwirkungen zu vermeiden, setzen Sie das Flag config_useFixedVolume auf true (bei Bedarf überlagern):

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

Wenn das Flag config_useFixedVolume nicht festgelegt ist (oder auf false gesetzt ist), können Apps AudioManager.setStreamVolume() aufrufen, um die Lautstärke nach Streamtyp im Softwaremixer zu ändern. Das ist möglicherweise nicht immer wünschenswert, da es sich auf andere Apps auswirken kann und die Lautstärkeabschwächung im Softwaremixer dazu führen kann, dass weniger signifikante Bits im Signal verfügbar sind, wenn es vom Hardwareverstärker empfangen wird.

Volume-Gruppen

Mit Lautstärkegruppen werden die Lautstärken für eine Sammlung von Geräten in einer Audiozone verwaltet. Die Lautstärke kann für jede Lautstärkegruppe unabhängig voneinander geregelt werden. Die resultierenden Verstärkungen werden auf den zugehörigen Geräten konfiguriert, damit sie vom Verstärker des Fahrzeugs angewendet werden können. Die Lautstärkeeinstellungen werden für den Nutzer beibehalten und geladen, wenn er sich anmeldet.

Bände definieren

CarAudioService verwendet in car_audio_configuration.xml definierte Lautstärkegruppen:

<audioZoneConfiguration version="4">
    </deviceConfigurations>
    <activationVolumeConfigs>
        <activationVolumeConfig name="activation_volume_on_boot_config">
            <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
            invocationType="onBoot" />
        </activationVolumeConfig>
        ...
    </activationVolumeConfigs>
    <zones>
        <zone name="primary zone" isPrimary="true">
          <zoneConfigs>
              <zoneConfig name="primary zone config 0" isDefault="true">
                <volumeGroups>
                    <group activationConfig="activation_volume_on_boot_config">
                        <device address="bus0_media_out">
                            <context context="music"/>
                        </device>
                    </group>
                    <group>
                        <device address="bus1_navigation_out">
                            <context context="navigation"/>
                        </device>
                        <device address="bus2_voice_command_out">
                            <context context="voice_command"/>
                        </device>
                    </group>
                    ...
                </volumeGroups>
              </zoneConfig>
              ...
            </zoneConfigs>
        </zone>
     </zones>
</audioZoneConfiguration>

Jede Lautstärkegruppe sollte ein oder mehrere Ausgabegeräte mit zugehörigen Adressen enthalten. Die Adressen müssen den in audio_policy_configuration.xml definierten Ausgabegeräten entsprechen.

Verstärkung von Lautstärkegruppen konfigurieren

Jede Lautstärkegruppe hat Mindest-, Höchst- und Standardwerte für die Verstärkung sowie eine Schrittgröße, die auf den in audio_policy_configuration.xml konfigurierten Werten für die Geräte basiert, die der Lautstärkegruppe zugeordnet sind.

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

Bei der Initialisierung prüft die Lautstärkegruppe die Verstärkungswerte der zugehörigen Geräte und konfiguriert die Gruppe so:

  • Schrittgröße: Muss für alle Geräte, die von der Lautstärkegruppe gesteuert werden, gleich sein.
  • Mindeststeigerung: Der kleinste Mindestgewinn unter den Geräten in der Gruppe.
  • Maximale Verstärkung: Der höchste maximale Gain unter den Geräten in der Gruppe.
  • Standardverstärkung: Höchste Standardverstärkung unter den Geräten in der Gruppe.

Aufgrund der Art und Weise, wie diese Werte konfiguriert werden, ist es möglich, die Verstärkung einer Lautstärkegruppe außerhalb des für ein Gerät, das mit der Lautstärkegruppe verknüpft ist, unterstützten Bereichs festzulegen. In diesem Fall wird die Verstärkung für dieses Gerät auf den minimalen oder maximalen Verstärkungswert des Geräts festgelegt, je nachdem, ob der Wert der Lautstärkegruppe unter oder über dem Bereich liegt.

Volume-Gruppen-IDs

Volumegruppen werden zur Laufzeit in der Reihenfolge identifiziert, die in der XML-Datei definiert ist. Die IDs reichen in einer Audiozone von 0 bis N-1, wobei N die Anzahl der Lautstärkegruppen in dieser Zone ist. Auf diese Weise sind Lautstärkegruppen-IDs nicht zonenübergreifend eindeutig. Diese Kennungen werden für CarAudioManager-APIs verwendet, die Volumegruppen zugeordnet sind. Bei jeder API, die groupId ohne zoneId verwendet, wird standardmäßig die primäre Audiozone verwendet.

Lautstärkeregelung in mehreren Zonen

Jede Audiozone muss mindestens eine Lautstärkegruppe haben und jede Lautstärkegruppe ist nur einer Audiozone zugeordnet. Diese Beziehung wird im Rahmen von car_audio_configuration.xml definiert. Weitere Informationen finden Sie im Beispiel oben unter Volumegruppen definieren.

Die aktuellen Lautstärkepegel für jede Zone werden für den Nutzer gespeichert, der mit dieser Zone verknüpft ist. Diese Einstellungen sind zonenspezifisch. Wenn sich ein Nutzer also auf einem Display anmeldet, das der primären Zone zugeordnet ist, und sich später in einer Zone anmeldet, die einer sekundären Audiozone zugeordnet ist, unterscheiden sich die Lautstärkepegel, die für die erste Zone geladen und beibehalten werden, von denen für die sekundäre Zone.

Mindest- und Höchstaktivierungsvolumen

In Android 15 wird die Steuerung von Lautstärkegruppenindizes eingeführt, um die Sicherheit und den Nutzerkomfort in Car-Audio-Systemen zu verbessern. Dies wird durch die Verwendung von minimalen und maximalen Aktivierungsvolumes erreicht, die in der Car Audio-Konfiguration konfiguriert werden (siehe Lautstärkegruppen definieren). Sie können diese Funktion aktivieren, indem Sie in den RROs für den Autoservice audioUseMinMaxActivationVolume auf true setzen.

Sie können in activationVolumeConfigs mehrere activationVolumeConfig-Einträge definieren, die jeweils eine andere Konfiguration für die Mindest- und Maximalaktivierung darstellen. Jede activationVolumeConfig:

  • Muss in der Konfigurationsdatei für die Audioanlage im Auto ein eindeutiges name enthalten, damit später in der Lautstärkegruppe (group) darauf verwiesen werden kann.
  • Darf nur ein activationVolumeConfigEntry enthalten.

Jedes activationVolumeConfig enthält die folgenden Attribute:

  • minActivationVolumePercentage (Ganzzahl, 0–100, optional, Standardwert: 0): Gibt das Mindestaktivierungsvolumen als Prozentsatz an.
  • maxActivationVolumePercentage (Ganzzahl, 0–100, optional, Standardwert: 100): Gibt das maximale Aktivierungsvolumen in Prozent an.
  • invocationType (String, optional, Standard: onPlaybackChanged): Definiert die Bedingungen, unter denen das Mindest- und Höchstvolumen für die Aktivierung angewendet wird:

    • onBoot: Wird nur auf die erste neu aktive Wiedergabe in einer Lautsprechergruppe nach dem Booten angewendet.
    • onSourceChanged: Wird nur auf eine neu aktive Wiedergabe mit einer geänderten App- oder UID-Quelle in einer Lautstärkegruppe angewendet.
    • onPlaybackChanged: Wird auf jede neu aktive Wiedergabe in einer Volumengruppe angewendet.

CarAudioService verwaltet die minimale und maximale Aktivierung durch Überwachung der folgenden derzeit aktiven Audio-Unterkomponenten:

  • Aktuelle aktive Wiedergabetracks
  • Aktueller Anrufstatus
  • Aktuelle Audiofokus-Anfrage vom Audio Control HAL, wobei die Audiofokus-Anfrage vom Audio Control HAL signalisiert, dass eine aktive Audiowiedergabe außerhalb von Android stattfindet.

Das folgende Bild zeigt einen allgemeinen Überblick über die Verwaltung des Mindest- und Höchstaktivierungsvolumens:

Bild

Abbildung 1. Verwaltung des minimalen und maximalen Aktivierungsvolumens für aktive Audio-Datenpfade.

Mit den angegebenen minActivationVolumePercentage, maxActivationVolumePercentage, dem Mindest- und dem Höchstwert für den Index für die Steigerung des Volumens können Sie den Mindest- und den Höchstwert für den Index für die Steigerung des Aktivierungsvolumens für jede Volumengruppe berechnen. CarAudioService überwacht jede neu aktivierte Wiedergabe und wendet das minimale und maximale Aktivierungsvolumen unter den folgenden Bedingungen an:

  • Aufruftyp stimmt überein: Der Aktivierungstyp der Wiedergabe (abgeleitet vom Audio Manager, Audio Control HAL oder Telephony Manager) muss mit dem invocationType übereinstimmen, der in der activationVolumeConfigEntry angegeben ist, die mit der Lautstärkegruppe verknüpft ist.
  • Lautstärkeindex außerhalb des zulässigen Bereichs: Der aktuelle Lautstärkeindex der Lautstärkegruppe muss außerhalb des definierten Aktivierungsbereichs für den Lautstärkeindex liegen. Das bedeutet, dass eine der folgenden Bedingungen zutrifft:

    • Der Index ist niedriger als der berechnete Mindestindex für die Steigerung des Aktivierungsvolumens.

      ODER

    • Der Index ist höher als der berechnete Index für den maximalen Anstieg des Aktivierungsvolumens.

Bei einer Aktivierungsübereinstimmung wird der Index für die Volumensteigerung der Volume-Gruppe auf einen der folgenden Werte angepasst:

  • Index für den Mindestanstieg des Aktivierungsvolumens, wenn er niedriger ist als der Index für den Mindestanstieg des Aktivierungsvolumens

    ODER

  • Maximaler Index für die Steigerung des Aktivierungsvolumens, wenn er höher als der maximale Index für die Steigerung des Aktivierungsvolumens ist

Außerdem wird ein Ereignis für die Lautstärkegruppe mit dem Ereignistyp EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED an alle registrierten Rückrufe für Lautstärkegruppenereignisse gesendet.

Lautstärketasten-Ereignisse verarbeiten

Android definiert mehrere Keycodes für die Lautstärkeregelung, darunter:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Standardmäßig leitet Android die Lautstärketastenereignisse an Apps weiter. Bei Automotive-Implementierungen sollten diese Schlüsselereignisse von CarAudioService verarbeitet werden, das dann je nach Bedarf setGroupVolume oder setMasterMute aufruft. Wenn Sie dieses Verhalten erzwingen möchten, setzen Sie das Flag config_handleVolumeKeysInWindowManager auf true:

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

Bei Lautstärketasten-Ereignissen kann derzeit nicht unterschieden werden, für welche Zone sie vorgesehen sind. Es wird davon ausgegangen, dass sie alle der primären Audiozone zugeordnet sind. Wenn ein Ereignis für eine Lautstärketaste empfangen wird, ermittelt CarAudioService, welche Lautstärkegruppe angepasst werden soll. Dazu werden die Audiokontexte für die aktiven Player abgerufen und dann die Lautstärkegruppe angepasst, die das Ausgabegerät enthält, das dem Audiokontext mit der höchsten Priorität zugeordnet ist. Die Priorisierung basiert auf einer festen Reihenfolge, die in CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY definiert ist.

Überblenden und Balance

Beide Versionen des AudioControl HAL enthalten APIs zum Festlegen von Fading und Balance im Fahrzeug. Entsprechende System-APIs für CarAudioManager übergeben Werte an den AudioControl HAL. Für diese APIs ist android.car.permission.CAR_CONTROL_AUDIO_VOLUME erforderlich. Die AudioControl-APIs sind:

  • Mit setBalanceTowardRight(float value) wird die Lautstärke der Lautsprecher nach rechts (+) oder links (-) im Auto verschoben.

    • 0,0 ist zentriert.
    • +1.0 ist vollkommen richtig
    • -1,0 ist ganz links.
    • Ein Wert außerhalb des Bereichs von -1 bis 1 ist ein Fehler.
  • setFadeTowardFront(float value) – Hiermit wird die Lautstärke des Lautsprechers nach vorn (+) oder hinten (–) im Auto verschoben.

    • 0,0 ist zentriert.
    • +1,0 ist vollständig vorwärts
    • –1,0 ist ganz hinten.
    • Ein Wert außerhalb des Bereichs von -1 bis 1 ist ein Fehler.

Sie entscheiden, wie diese Werte angewendet und Nutzern angezeigt werden sollen. Sie können nur auf Medien oder auf alle Android-Sounds angewendet werden. Mit Android 11 wurde auch die Unterstützung für das Anwenden von Audioeffekten auf Ausgabegeräte eingeführt. So ist es möglich, Fading und Balance alternativ über Audioeffekte auf den entsprechenden Ausgabegeräten anstatt über diese APIs zu verwalten.

Audio-Ducking

Beim Audio-Ducking wird die Verstärkung für einen Stream verringert, damit ein anderer Stream, der gleichzeitig wiedergegeben wird, besser zu hören ist. In AAOS wird die Audio-Ducking-Funktion von der HAL implementiert. Android hat keine Kontrolle über Sounds, die über das Betriebssystem hinausgehen. In Android 11 sind die wichtigsten Informationen, die das HAL für die Entscheidung zum Ducking benötigt, die Information, ob auf zwei Ausgabegeräten aktive Streams vorhanden sind.

Wann sollte ich ausweichen?

Es liegt im Ermessen des jeweiligen OEM, wie das Ducking von der HAL gehandhabt wird. Wir empfehlen jedoch die folgenden Richtlinien.

  • Mehrere Streams, die auf Android-Geräten wiedergegeben werden, treten häufig auf, wenn zwei Apps oder Dienste gleichzeitig den Audiofokus haben. Informationen dazu, wann Android den gleichzeitigen Fokus gewähren kann, finden Sie in der Interaktionsmatrix unter Einschränkungstypen. Mit der Einführung des Car Audio-Plug-ins hängt dies auch von der Verwaltung des AudioFocus ab.

  • Alle Streams, die von Android gemischt werden, werden vor der Anwendung von Verstärkungen gemischt. Daher sollte jeder Stream, der bei gleichzeitiger Wiedergabe mit einem anderen Stream geduckt werden soll, an separate Ausgabegeräte weitergeleitet werden, damit das HAL die Dämpfung vor dem Mischen anwenden kann.

Die folgenden gleichzeitigen Interaktionen sind potenzielle Fälle, in denen Ducking empfohlen wird.

Interaktion Aktion
EMERGENCY Ducks oder schaltet alles außer SAFETY stumm
SAFETY Duckt alles außer EMERGENCY
NAVIGATION Ducks alles außer SAFETY und EMERGENCY
CALL Schließt alles außer SAFETY, EMERGENCY und NAVIGATION aus.
VOICE Enten CALL_RING
VEHICLE_SOUNDS Sie legen fest, wie wichtig das aktive Geräusch ist und ob andere Geräusche dadurch gedämpft werden sollen.
MUSIC und ANNOUNCEMENT Von allem abgeduckt. Ausnahmen sind Töne für die Touch-Interaktion, die als SYSTEM_SOUND wiedergegeben werden.

Wichtige Aspekte beim Ducking

Einige Apps und Dienste, z. B. Navigations- oder Assistenten-Apps, verwenden möglicherweise mehrere Player, um Aktionen auszuführen. Vermeiden Sie aggressives Absenken der Lautstärke, wenn kein Datenstrom mehr über Ausgabegeräte fließt, damit die Lautstärke nicht wieder auf das volle Niveau zurückkehrt, bevor sie vor dem Start der nächsten Wiedergabe durch die Navigations- oder Assistenten-App abgesenkt wird.

Bei Fahrzeugen mit mehreren Soundstages mit ausreichender Isolierung können Sie Audioinhalte an verschiedene Bereiche des Fahrzeugs weiterleiten, anstatt sie zu unterdrücken. So können beispielsweise Navigationsanweisungen an die Lautsprecher der Kopfstütze des Fahrers weitergeleitet werden, während weiterhin Musik in der gesamten Kabine mit normaler Lautstärke abgespielt wird.

Sicherheitskritische Geräusche

Mit Android 11 wurden HAL-Audiofokus-APIs eingeführt. Das HAL sorgt dafür, dass sicherheitskritische Töne gegenüber anderen Tönen priorisiert werden. Wenn das HAL den Audiofokus für USAGE_EMERGENCY beibehält, kann nicht garantiert werden, dass Apps und Dienste von Android keine Töne abspielen. Das HAL bestimmt, welche Streams von Android gemischt oder stummgeschaltet werden sollen, um sicherheitskritische Töne abzuspielen.

UI für Lautstärkeeinstellungen konfigurieren

In AAOS wird die Benutzeroberfläche für die Lautstärkeeinstellungen von der Lautstärkegruppenkonfiguration entkoppelt. Sie können wie unter Verstärkungen für Lautstärkegruppen konfigurieren beschrieben überlagert werden. Durch diese Trennung sind keine Änderungen erforderlich, wenn sich die Konfiguration von Volumegruppen ändert.

In der Benutzeroberfläche für die Fahrzeugeinstellungen enthält packages/apps/Car/Settings/res/xml/car_volume_items.xml die UI-Elemente (Titel- und Symbolressourcen), die mit jedem definierten AudioAttributes.USAGE verknüpft sind. Diese Datei sorgt für eine angemessene Darstellung der definierten VolumeGroups, indem Ressourcen verwendet werden, die mit der ersten erkannten Nutzung in jedem VolumeGroup verknüpft sind.

Im folgenden Beispiel wird beispielsweise ein VolumeGroup definiert, das voice_communication und voice_communication_signalling enthält. Bei der Standardimplementierung der Benutzeroberfläche für die Fahrzeugeinstellungen wird VolumeGroup mit den Ressourcen gerendert, die mit voice_communication verknüpft sind, da dies die erste Übereinstimmung in der Datei ist.

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

Die in der obigen Konfiguration verwendeten Attribute und Werte werden in packages/apps/Car/Settings/res/values/attrs.xml deklariert. Die Benutzeroberfläche für die Lautstärkeeinstellungen verwendet die folgenden VolumeGroup-basierten CarAudioManager-APIs:

  • getVolumeGroupCount() – hier erfahren Sie, wie viele Kontrollvariablen gezogen werden sollten.
  • getGroupMinVolume() und getGroupMaxVolume(), um die untere und obere Grenze zu erhalten.
  • getGroupVolume(), um die aktuelle Lautstärke abzurufen.
  • registerVolumeChangeObserver() über Änderungen der Lautstärke benachrichtigt werden.

Ereignis für die Gruppe „Autovolumen“

Die Anwendungsfälle für die Lautstärkeanpassung und die Stummschaltung im Automobilbereich haben kontextbezogene Grundlagen, die die Aktionen bestimmter Apps, z. B. die Lautstärkeeinstellungen, definieren können. Der aktuelle Volume- und Stummschaltungs-Callback aus dem Car Audio-Stack bietet nur begrenzte Kontextinformationen. Um Automotive-Anwendungsfälle und die zukünftige Skalierbarkeit besser zu unterstützen, wird CarVolumeGroupEvent in Android 14 hinzugefügt. Jedes Ereignis enthält drei wichtige Arten von Informationen:

  • CarVolumeGroupInfo Elemente in der Liste
  • EventTypes (bit-mapped)
  • ExtraInfos Elemente in der Liste

CarVolumeGroupInfo

Der Empfänger des Ereignis-Callbacks hat direkten Zugriff auf die Liste der Informationen zur betroffenen Lautstärkegruppe des Autos. Das bedeutet, dass die App keine zusätzlichen Aufrufe an das Car Audio Framework senden muss, um den aktuellen Status abzurufen. Sie kann einfach die empfangene CarVolumeGroupInfos verwenden, um die Benutzeroberfläche oder interne Status zu aktualisieren. Um Apps die Arbeit zu erleichtern, werden die Aspekte, die sich in einer Gruppe mit hohem Fahrzeugvolumen geändert haben, auch als Teil von EventTypes bereitgestellt, wie unten erläutert.

EventTypes

Gibt an, welcher Aspekt von CarVolumeGroupInfo sich geändert hat. Apps können diese Informationen verwenden, um Änderungen zu erkennen und die erforderlichen Maßnahmen zu ergreifen. Beispiel: EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED gibt an, dass sich der entsprechende CarVolumeGroups-Index für die maximale Volumenzunahme geändert hat und über CarVolumeGroupInfo.getMaxVolumeGainIndex() abgefragt werden kann.

Die folgende Tabelle zeigt die Beziehung zwischen EventType und CarVolumeGroupInfo.

EventType CarVolumeGroupInfo
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

ExtraInfos

Bietet zusätzliche Informationen dazu, warum sich die CarVolumeGroup geändert hat. Apps können diese Informationen verwenden, um dem Nutzer zusätzlichen Kontext zu liefern, damit er reagieren oder sich benachrichtigen lassen kann. Beispiel: EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL gibt eine aktive vorübergehende Dämpfung aufgrund einer thermischen Überlastung an. Die App kann den Nutzer informieren, wenn er versucht, die Lautstärke zu erhöhen.

Wir schreiben keinen bestimmten Prozess für ExtraInfos vor. Es liegt in Ihrem Ermessen, den Prozess auf Grundlage von ExtraInfos festzulegen. Wenn die Dämpfung beispielsweise aufgrund von EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED aktiv ist, können Sie die Lautstärkeregelung anfangs ausblenden, um zu verhindern, dass der Nutzer die Lautstärke ändert. Andere zeigen möglicherweise einen Hinweis an, dass die Lautstärkeabsenkung aktiv ist, und ermöglichen dem Nutzer, die Lautstärke zu ändern.

Das Car Audio-Framework ist vom AudioControl-HAL IAudioGainCallback abhängig, um die vorgeschlagene ExtraInfos bereitzustellen. Weitere Informationen finden Sie unter Audio Gain Callback.

CarVolumeGroupEvent wird skaliert, um zukünftige Anforderungen des Car Audio Framework zu erfüllen. Wir beabsichtigen, neue Funktionen nur über CarVolumeGroupEvent zu unterstützen. Wir empfehlen App-Entwicklern dringend, CarVolumeGroupEvent zu verwenden, um Änderungen an der Gruppenlautstärke und Stummschaltung zu verarbeiten.

Callback für Ereignisse der Lautstärkegruppe für Autos

Android 14 bietet einen neuen Callback für privilegierte Apps und Plattform-Apps, mit dem sie sich für CarVolumeGroupEvents registrieren und darüber benachrichtigt werden können.

  • Verwenden Sie CarAudioManager#registerCarVolumeGroupEventCallback(), um sich für den Callback zu registrieren.

  • Verwenden Sie CarAudioManager#unregisterCarVolumeGroupEventCallback(), um die Registrierung des Callbacks aufzuheben.

Wenn eine App mit dem neuen CarVolumeGroupEventCallback und dem alten CarVolumeCallback registriert wird, wird dem Ereignis CarVolumeGroupEventCallbacks Priorität eingeräumt. Der Car Audio-Stack löst CarVolumeCallback nicht mehr aus. So wird verhindert, dass für dasselbe Ereignis doppelte Trigger für dieselbe App ausgelöst werden.

Wir empfehlen dringend, CarVolumeGroupEventCallback zu verwenden, um die Lautstärke und Stummschaltung von Gruppen zu verwalten.

Rückruf für Audioverstärkung

Seit Android 13 kann AudioControl HAL einen asynchronen Callback auslösen, um Lautstärkepegel-Aktualisierungen aufgrund von Änderungen am Car-Audiosystem zu verwalten.

HAL API

AudioControl @2.0 AIDL

Version 2.0 des AudioControl AIDL HAL fügt die folgende API hinzu:

API Zweck
IAudioControl#registerGainCallback Registriert eine Instanz von IAudioGainCallback bei der AudioControl-HAL.
IAudioGainCallback#onAudioDeviceGainsChanged Asynchroner Callback, um über Änderungen an der Audioverstärkungskonfiguration zu informieren.

Der AudioControl HAL-Callback enthält Listen mit Gründen und den entsprechenden AudioGainConfigInfo, die Folgendes umfassen:

  • Zonen-ID
  • Geräteportadresse
  • Der Volumenindex > Index kann entweder ein eingeschränkter Index oder ein Aktualisierungsindex sein.

Die Gründe lassen sich grob in folgende Kategorien einteilen:

  • Gründe für Einschränkungen. Vorübergehende Änderung des Lautstärke- und Stummschaltverhaltens
  • Gründe für die Aktualisierung Dauerhafte Änderung des Lautstärkeverhaltens.

Einschränkungstypen

Seit dem AudioControl HAL AIDL V3 werden die folgenden Einschränkungstypen unterstützt:

  • Stummschalten
  • Blockierungen
  • Beschränkung
  • Dämpfung
Aktive Einschränkung Vom Nutzer ausgelöste Lautstärkeänderung Vom Nutzer ausgelöster Ein-/Aus-Button für die Stummschaltung
Stummschalten ❌ (Ton einschalten)

✔ (Ton ausschalten)
Blockierungen
Beschränkung ❌ (über dem Limit)

✔ (unter dem Limit)
Dämpfung

Die Priorität zwischen Einschränkungen ist „Stummschalten“ > „Blockieren“ > „Einschränkung“ > „Abschwächung“.

Einschränkungen beim Ausblenden

Folgende Einschränkungen gelten für das Stummschalten:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Das Car Audio-Framework verwaltet intern die folgenden beiden Stummschaltungsstatus:

  • Nutzer stummschalten. Wird auf Anfrage des Nutzers über CarAudioManager oder Schlüsselereignisse umgeschaltet.

  • HAL-Stummschaltung: Wird basierend auf den über den AudioGain-Callback empfangenen Stummschaltungsbeschränkungen umgeschaltet.

Für Listener wie die Einstellungen App basiert der Gesamtzustand der Stummschaltung der Lautstärkegruppe (CarVolumeGroupInfo.isMuted()) darauf, ob eine der oben genannten Stummschaltungen aktiviert ist.

Wenn die HAL-Stummschaltung aktiviert ist, werden alle eingehenden Lautstärkeänderungs- und Gruppenentstummungsanfragen für die Dauer der Einschränkung ignoriert.

Interaktionsfall: HAL-Stummschaltung ist aktiv und Nutzer fordert das Umschalten der Stummschaltung an

Wenn die HAL-Stummschaltung aktiviert und die Nutzerstummschaltung deaktiviert ist:

  • Der allgemeine Stummschaltungsstatus der Lautstärkegruppe wurde in true geändert.
  • Anfragen von Nutzern zum Aktivieren der Stummschaltung werden verarbeitet.
    • Grund: Anfragen von Nutzern zum Stummschalten sollten immer berücksichtigt werden, um den Datenschutz der Nutzer zu wahren.

Wenn das Stummschalten über HAL und das Stummschalten über den Nutzer aktiviert sind:

  • Der allgemeine Stummschaltungsstatus der Lautstärkegruppe wurde in true geändert.

  • Anfragen von Nutzern zum Deaktivieren der Stummschaltung werden NOT bearbeitet. Der zwischengespeicherte Stummschaltungsstatus des Nutzers bleibt aktiviert.

    • Grund: Anfragen zur Aufhebung der Stummschaltung von Nutzern werden nur berücksichtigt, wenn keine aktiven Einschränkungen vorliegen.

    • Grund: Wenn die Stummschaltung eines Nutzers im Cache aufgehoben wird, kann dies zu einer unbeabsichtigten Lautstärkeerhöhung führen und die Sicherheit des Nutzers gefährden. Das gilt insbesondere, wenn der Stummschaltungsstatus über Zündzyklen hinweg aktiviert ist, was die Wahrnehmung des Schallpegels durch die Nutzer verringert.

Interaktionsfall: HAL-Stummschaltung aktiviert und deaktiviert, während die Nutzerstummschaltung unverändert bleibt

Durch das Umschalten der HAL-Stummschaltung wird der allgemeine Stummschaltungsstatus der Lautstärkegruppe geändert. Der Stummschaltungsstatus des Nutzers wird jedoch nicht direkt aktualisiert. Wenn die Stummschaltung des Nutzers deaktiviert ist und ein HAL-Callback zur Aktivierung der Stummschaltung empfangen wird:

  • Der allgemeine Stummschaltungsstatus der Lautstärkegruppe wurde in true geändert.
  • Anfragen vom Nutzer zum Ändern der Lautstärke werden NOT verarbeitet, während HAL-Stummschaltung aktiviert ist.

    • Grund: Der Nutzer kann keine Töne hören, wenn die Stummschaltung aktiviert ist. Wenn die Lautstärke geändert werden kann, kann es zu einer plötzlichen Lautstärkeerhöhung kommen, die die Sicherheit der Nutzer gefährdet.

    • Grund: Volume-Apps können sich für Callbacks registrieren und das Stummschalten automatisch aufheben (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)), ohne dass der Nutzer eingreifen muss, wenn dies vom OEM so vorgesehen ist.

Wenn die HAL-Stummschaltung deaktiviert ist, während die Nutzerstummschaltung deaktiviert ist:

  • Der Stummschaltungsstatus der Lautstärkegruppe wurde in false geändert.

    Grund: Wenn der Stummschaltungsstatus beibehalten wird und der Nutzer aufgefordert wird, die Stummschaltung aufzuheben, kann dies den Nutzer unnötig unterbrechen, wenn der Stummschaltungsstatus häufig geändert wird.

  • Anfragen von Nutzern zur Änderung der Lautstärke werden normal verarbeitet.

Blockierungen

Sperrbeschränkungen:

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

Wenn Blockierungsbeschränkungen aktiv sind, werden Anfragen von Nutzern,

  • Änderungen des Volumens werden nicht verarbeitet.
  • Die Stummschaltung wird aktiviert oder deaktiviert.

Beschränkung

Einschränkungen:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Wenn Einschränkungen aktiv sind, können Nutzer Folgendes nicht anfordern:

  • Lautstärke ändern:

    • Verarbeitung innerhalb der Einschränkung
    • Die oben genannten Einschränkungen werden nicht berücksichtigt.
  • Die Stummschaltung wird aktiviert oder deaktiviert.

Dämpfung

Einschränkungen bei der Dämpfung:

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

Wenn die Einschränkungen für die Dämpfung aktiv sind, können Nutzer Folgendes nicht anfordern:

  • Änderungen des Volumens werden verarbeitet. Die neue aktuelle Lautstärke wird auf die gedämpfte Lautstärke (anstelle der bisherigen Lautstärke) eingestellt. Künftige Lautstärkeänderungen werden ab dieser Stufe vorgenommen.

  • Die Stummschaltung wird ein- oder ausgeschaltet.

Index aktualisieren

Das Folgende wird als asynchrone Aktualisierung des Volume-Index betrachtet: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

Aus diesem Grund kann die AudioControl-HAL den aktuellen Index der Lautstärkegruppe auf den angegebenen Index aktualisieren. Dies wird hauptsächlich als Feedback vom Audiosystem für die Anfrage zur Lautstärkeänderung vom Car Audio Framework verwendet. Die Indexaktualisierung wird auch über einen CarVolumeGroupEvent-Callback an Apps gesendet, um den Index zu synchronisieren.

Beispiele

Anwendungsfall: Nutzer aktualisiert den Volume-Index auf 30

  • Der Nutzer ändert den Lautstärkeindex in der Lautstärke-App auf 30.

  • Dieser Index wird in die Lautstärkeanhebung umgewandelt und an Audio HAL gesendet.

  • Anbieterimplementierungen vonAudio HAL erhalten die neue Lautstärkeerhöhung und aktualisieren das Audiosystem (z. B. externer Verstärker).

  • Das Audiosystem antwortet, dass der Lautstärkepegel nur auf Index 15 aktualisiert wird (aus Gründen, die Android nicht bekannt sind).

  • Anbieterimplementierungen vonAudioControl HAL-Triggern:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Der Car Audio-Dienst verwendet den neuen Index aus dem Callback, der für die Persistenz und die Rückrufe an die Lautstärke-App verwendet wird. Der vom Nutzer angeforderte Index ist 30. Durch die asynchrone Rückmeldung des Audiosystems wird der Index jedoch auf 15 aktualisiert.

Anwendungsfall: Erste Audiowiedergabe nach dem Beenden des Stand-by-Modus

  • Der Volumenindex vor der Sperrung ist auf einem hohen Niveau von 95 festgelegt (Bereich: [0–99]).

  • Android wechselt in den inaktiven Modus.

  • Wenn Android vorhanden ist, halten Sie die Ausführung an (z. B. durch Fortsetzen):

    • Der Anbieter Audio HAL/AudioControl HAL wendet lokal einen sicheren Index von 30 auf das Audiosystem an.

    • Der Anbieter AudioControl HAL löst auch den Callback für den sicheren Index aus:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Der Car Audio-Dienst verwendet den neuen Index aus dem Callback, der für die Persistenz verwendet wird, und eigene Callbacks, um den Index mit der Lautstärke-App zu synchronisieren. Der Volume-Index vor der Sperrung beträgt 95. Nach dem Fortsetzen wird dieser Index jedoch vom AudioControl HAL-Implementierer auf einen sicheren Lautstärkepegel von 30 gesetzt.

Dynamische Volume-Konfiguration

Für diese Funktion werden die folgenden primären Anwendungsfälle berücksichtigt:

  1. Konfiguration des Fahrzeugs am Ende der Fertigungslinie (End-of-Line, EOL):

    • Automobilhersteller aktualisieren die Lautstärke-Konfigurationen lieber am EOL basierend auf der Einrichtung des Audio-Systems des Fahrzeugs. In der Regel handelt es sich dabei um ein Sideloading ohne Aktualisierung des Android-Software-Images.

    • Automobilhersteller müssen die Lautstärke-Konfiguration möglicherweise während eines Service-Termins aktualisieren.

  2. Laufzeitkonfiguration: Audioanlagen in Fahrzeugen unterstützen Konfigurationen mit externen Verstärkern. Auf diesen Steuergeräten können die Konfigurationen für den Lautstärkebereich gespeichert sein, die beim Booten abgefragt werden.

  3. On-Demand-Konfiguration: Diese Funktion wurde eingeführt, um dem wachsenden Bedarf an bedarfsbasierten Audiofunktionen gerecht zu werden, bei denen Nutzer für einen bestimmten Zeitraum ein Abo für eine verbesserte Signalverarbeitung abschließen. Die neuen Konfigurationen für den Umfangsbereich gelten für die Dauer eines Abos.

Design

Die dynamische Volume-Konfiguration erfolgt in drei Phasen:

  • Auffindbarkeit: Die AudioControl HAL-Implementierung des Anbieters erkennt neue Lautstärkeänderungen über einen benutzerdefinierten IPC-Mechanismus, der dem Anbieter gehört.

    Wenn ein Problem erkannt wird, wird über AudioControl::IModuleChangeCallback ein Callback generiert.

  • Aktualisieren: Der Car Audio-Stack aktualisiert die Status der Lautstärkegruppe mit den neuen Lautstärkebereichen.

    Wir bemühen uns, das Lautstärkeniveau nach der Aktualisierung des Lautstärkebereichs beizubehalten. Wenn der Index jedoch außerhalb des zulässigen Bereichs liegt, wird der aktuelle Lautstärkeindex auf einen sicheren Wert gesetzt. Beispiel: Die Standardebene, die vom Anbieter während des Rückrufs angegeben wird.

  • Rückruf:

    • Nach Aktualisierungen des Lautstärkegruppenbereichs löst der Car-Audio-Stack einen Callback für Apps aus, die über CarVolumeGroupEventCallback registriert sind.

    • CarVolumeGroupEvent enthält die aktualisierten CarVolumeGroupInfo, den Ereignistyp (was sich geändert hat) und zusätzliche Informationen (warum sich etwas geändert hat).

Bild

Abbildung 2: Dynamische Volume-Konfiguration

HAL API

AudioControl @ 3.0 AIDL

In Version 3.0 der AudioControl AIDL HAL werden die folgenden APIs eingeführt:

API
IAudioControl#setModuleChangeCallback Legt eine Instanz von IModuleChangeCallback mit AudioControl HAL fest.
IAudioControl#clearModuleChangeCallback Löscht die Instanz von IModuleChangeCallback, die zuvor mit der AudioControl-HAL festgelegt wurde.
IModuleChangeCallback#onAudioPortsChanged Callback zum Benachrichtigen über Änderungen an AudioPorts

Sequenz

Das Sequenzdiagramm der dynamischen Volume-Konfiguration wird unten angezeigt.

Bild

Abbildung 3: Sequenzdiagramm für die dynamische Volume-Konfiguration.

Wichtige Aspekte

Beachten Sie Folgendes, um diese Funktion zu optimieren.

  • AudioPorts, die als Teil des Callbacks bereitgestellt werden, müssen der Automotive-BUS-Definition entsprechen:

    • Geräteanschluss IN_DEVICE, OUT_DEVICE
    • Verbindung BUS
    • Adresse In der Audio-HAL-Definition definiert
    • Verstärkungsmodus JOINT
  • Anbieter müssen eine Obermenge von Lautstärkebereichsdefinitionen in der Audio HAL-Richtlinie definieren und den Callback verwenden, um sie für Fahrzeugvarianten anzupassen. Weitere Informationen finden Sie in der AIDL-Definition für IModuleChangeCallbac.

  • Wenn mehrere Audio-BUSSE zur selben Lautstärkegruppe gehören, muss für jeden von ihnen derselbe Lautstärkebereich definiert sein. Andernfalls wird die neue Lautstärkebereichsdefinition vom Car Audio Framework abgelehnt.