Volume-Verwaltung

Die Lautstärkeregelung ist in CarAudioService enthalten. Dabei werden feste Lautstärken verwendet, wobei davon ausgegangen wird, dass die Lautstärken unterhalb der HAL von einem Hardwareverstärker und nicht in der Software angewendet werden. CarAudioService ordnet Ausgabegeräte in Gruppen an, um dieselben Verstärkungen auf alle Geräte anzuwenden, die mit einer Gruppe verknüpft sind.

Feste Volumes

Bei AAOS-Implementierungen wird zur Lautstärkeregelung ein Hardwareverstärker anstelle eines Software-Mixers verwendet. Um Nebenwirkungen zu vermeiden, setzen Sie das Flag config_useFixedVolume auf true (Overlay bei Bedarf):

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

Wenn das Flag config_useFixedVolume nicht gesetzt ist (oder auf false gesetzt ist), können Apps AudioManager.setStreamVolume() aufrufen, um die Lautstärke im Software-Mixer nach Streamtyp zu ändern. Dies ist aufgrund möglicher Auswirkungen auf andere Apps und der Tatsache, dass die Lautstärkedämpfung im Software-Mixer zu weniger signifikanten Bits im Signal führen kann, wenn es vom Hardwareverstärker empfangen wird, möglicherweise nicht immer wünschenswert.

Volumegruppen

Mit Lautstärkegruppen wird die Lautstärke für eine Gruppe von Geräten in einer Audiozone verwaltet. Für jede Lautstärkegruppe kann die Lautstärke unabhängig geregelt werden. Die daraus resultierenden Verstärkungen werden auf den zugehörigen Geräten konfiguriert, um vom Verstärker des Fahrzeugs angewendet zu werden. Die Lautstärkeeinstellungen werden für den Nutzer gespeichert und geladen, wenn er sich anmeldet.

Volumegruppen 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 Volumegruppe sollte mindestens ein Ausgabegerät mit zugehörigen Adressen enthalten. Die Adressen müssen den in audio_policy_configuration.xml definierten Ausgabegeräten entsprechen.

Gewinne für Volumegruppen konfigurieren

Jede Volumegruppe hat Mindest-, Maximal- und Standardverstärkungswerte sowie eine Schrittweite, die auf den in audio_policy_configuration.xml für die mit der Volumegruppe verknüpften Geräte konfigurierten Werten basiert.

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

Während der Initialisierung prüft die Volumegruppe 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.
  • Minimaler Gewinn Niedrigster Mindestgewinn unter den Geräten in der Gruppe.
  • Maximaler Gewinn Der höchste maximale Gewinn unter den Geräten in der Gruppe.
  • Standardverstärkung Der höchste Standardgewinn unter den Geräten in der Gruppe.

Aufgrund der Konfiguration dieser Werte kann die Verstärkung einer Lautstärkegruppe außerhalb des für ein mit der Lautstärkegruppe verknüpftes Gerät unterstützten Bereichs liegen. In diesem Fall wird für das Gerät die Verstärkung auf den Mindest- oder Maximalwert 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 in der XML-Datei definierten Reihenfolge identifiziert. IDs innerhalb einer Audiozone reichen von 0 bis N-1, wobei N die Anzahl der Lautstärkegruppen in dieser Zone ist. Daher sind Volumegruppen-IDs nicht zonenübergreifend eindeutig. Diese Kennungen werden für CarAudioManager APIs verwendet, die mit Volumegruppen verknüpft sind. Bei jeder API, die eine groupId ohne zoneId akzeptiert, wird standardmäßig die primäre Audiozone verwendet.

Volumeverwaltung für mehrere Zonen

Jede Audiozone sollte eine oder mehrere Lautstärkegruppen haben. Jede Lautstärkegruppe ist nur einer Audiozone zugeordnet. Diese Beziehung wird als Teil 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 zonenabhängig. Wenn sich ein Nutzer auf einem Display anmeldet, das mit der primären Zone verknüpft ist, und sich später in einer Zone anmeldet, die mit einer sekundären Audiozone verknüpft 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 Maximalvolumen für die Aktivierung

Android 15 bietet eine Steuerung der Lautstärkegruppenindizes für mehr Sicherheit und Nutzerfreundlichkeit in Auto-Audiosystemen. Dies wird durch die Verwendung von Mindest- und Höchstlautstärken für die Aktivierung erreicht, die in der Audiokonfiguration des Autos konfiguriert werden (siehe Lautstärkegruppen definieren). Sie können diese Funktion aktivieren, indem Sie in den RROs für den Autoservice audioUseMinMaxActivationVolume auf true festlegen.

Sie können mehrere activationVolumeConfig-Einträge in activationVolumeConfigs definieren, die jeweils eine andere Mindest- und Höchstaktivierungskonfiguration darstellen. Für jede activationVolumeConfig gilt:

  • Muss in der Konfigurationsdatei für die Autoaudioanlage eine eindeutige name enthalten, damit später in der Volumegruppe (group) darauf verwiesen werden kann.
  • Darf nur ein activationVolumeConfigEntry enthalten.

Jedes activationVolumeConfig enthält die folgenden Attribute:

  • minActivationVolumePercentage (ganze Zahl, 0–100, optional, Standard: 0): Gibt das Mindestvolumen für die Aktivierung in Prozent an.
  • maxActivationVolumePercentage (Ganzzahl, 0–100, optional, Standard: 100): Gibt das maximale Aktivierungsvolumen in Prozent an.
  • invocationType (String, optional, Standard: onPlaybackChanged): Hiermit werden die Bedingungen definiert, unter denen das minimale und maximale Aktivierungsvolumen angewendet wird:

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

CarAudioService verwaltet die minimale und maximale Aktivierung, indem die folgenden derzeit aktiven Audio-Unterkomponenten überwacht werden:

  • Aktuell aktive Wiedergabetracks
  • Aktueller Anrufstatus
  • Aktuelle Audiofokusanfrage von der Audio Control HAL, bei der die Audiofokusanfrage von der Audio Control HAL signalisiert, dass eine aktive Audiowiedergabe außerhalb von Android stattfindet

Das folgende Bild zeigt eine allgemeine Übersicht über die Verwaltung des Mindest- und Höchstvolumens für die Aktivierung:

Bild

Abbildung 1: Verwaltung aktiver Audiodatenpfade mit minimalem und maximalem Aktivierungsvolumen.

Mit den angegebenen Werten für minActivationVolumePercentage, maxActivationVolumePercentage, den Mindest- und Höchstwert für den Volumengewinnindex können Sie den Mindest- und Höchstwert für den Aktivierungsvolumengewinnindex für jede Volumegruppe berechnen. CarAudioService überwacht jede neu aktive Wiedergabe und wendet das Mindest- und Höchstvolumen für die Aktivierung unter den folgenden Bedingungen an:

  • Übereinstimmung des Aufruftyps: Der Aktivierungstyp der Wiedergabe (abgeleitet vom Audio Manager, Audio Control HAL oder Telephony Manager) muss mit dem invocationType übereinstimmen, der in activationVolumeConfigEntry angegeben ist, das mit der Lautstärkegruppe verknüpft ist.
  • Lautstärkeindex außerhalb des zulässigen Bereichs: Der aktuelle Lautstärkegewinnindex der Lautstärkegruppe darf nicht außerhalb des definierten Bereichs für den Lautstärkegewinnindex liegen. Das ist insbesondere dann der Fall, wenn eine der folgenden Bedingungen erfüllt ist:

    • Der Index liegt unter dem berechneten Mindestwert für den Aktivierungsvolumengewinn.

      ODER

    • Der Index ist höher als der berechnete maximale Index für den Aktivierungsvolumengewinn.

Bei einer Aktivierungsübereinstimmung wird der Lautstärkegewinnindex der Lautstärkegruppe auf einen der folgenden Werte angepasst:

  • Index für den Gewinn bei Mindestaktivierungsvolumen, wenn er niedriger ist als der Index für den Gewinn bei Mindestaktivierungsvolumen

    ODER

  • Index für den maximalen Aktivierungsvolumengewinn, wenn er höher als der Index für den maximalen Aktivierungsvolumengewinn ist

Außerdem wird ein Ereignis vom Typ „Autolautstärkegruppe“ mit dem Ereignistyp EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED an alle registrierten Rückrufe für Ereignisse vom Typ „Lautstärkegruppe“ gesendet.

Ereignisse für Lautstärketasten verarbeiten

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

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Standardmäßig leitet Android die Ereignisse der Lautstärketasten an Apps weiter. Bei Implementierungen für die Automobilbranche sollten diese Schlüsselereignisse von CarAudioService verarbeitet werden, die 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ärke-Schlüsselereignissen kann derzeit nicht unterschieden werden, für welche Zone sie bestimmt sind. Es wird davon ausgegangen, dass sie alle mit der primären Audiozone verknüpft sind. Wenn ein Ereignis mit einer Lautstärketaste empfangen wird, bestimmt 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 mit dem Audiokontext mit der höchsten Priorität enthält. Die Priorisierung wird anhand einer festen Reihenfolge bestimmt, die in CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY definiert ist.

Ein- und Ausblenden sowie Ausbalancieren

Beide Versionen der AudioControl HAL enthalten APIs zum Einstellen von Fading und Balance im Fahrzeug. Entsprechende System-APIs für CarAudioManager übergeben Werte an die 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 Lautsprecherlautstärke auf die rechte (+) oder linke (-) Seite des Fahrzeugs verschoben.

    • 0,0 ist zentriert
    • +1,0 ist vollständig richtig
    • -1,0 bedeutet „vollständig links“.
    • Ein Wert außerhalb des Bereichs von -1 bis 1 ist ein Fehler.
  • Mit setFadeTowardFront(float value) wird die Lautsprecherlautstärke in Richtung der Vorder- (+) oder Rückseite (-) des Fahrzeugs verschoben.

    • 0,0 ist zentriert
    • +1,0 ist vollständig nach vorne
    • -1,0 bedeutet, dass das Gerät vollständig nach hinten geneigt ist.
    • Ein Wert außerhalb des Bereichs von -1 bis 1 ist ein Fehler.

Sie legen fest, wie diese Werte angewendet und wie sie Nutzern angezeigt werden sollen. Sie können nur auf Medien oder allgemein auf alle Android-Töne angewendet werden. Mit Android 11 wurde außerdem die Unterstützung für die Anwendung von Audioeffekten auf Ausgabegeräte eingeführt. So ist es möglich, das Ausblenden und die Balance stattdessen über Audioeffekte auf den entsprechenden Ausgabegeräten und nicht über diese APIs zu verwalten.

Audio-Ducking

Beim Audio-Ducking wird die Verstärkung für einen Stream reduziert, damit ein anderer Stream, der gleichzeitig wiedergegeben wird, besser zu hören ist. In AAOS wird die Audioducking-Funktion vom HAL implementiert. Android hat keine Kontrolle über Töne, die nicht vom Betriebssystem stammen. In Android 11 sind die wichtigsten Informationen, die der HAL für die Entscheidung zur Stummschaltung zur Verfügung stehen, ob zwei Ausgabegeräte aktive Streams haben oder nicht.

Wann Sie sich ducken sollten

Es liegt im Ermessen des jeweiligen OEM, wie die Stummschaltung durch die HAL verarbeitet wird. Wir empfehlen jedoch die folgenden Richtlinien.

  • Wenn auf Android-Geräten mehrere Streams gleichzeitig wiedergegeben werden, liegt das häufig daran, dass 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 Audio-Plug-ins für Autos hängt das auch von der AudioFocus-Verwaltung ab.

  • Streams, die von Android zusammengeführt werden, werden vor der Anwendung von Gewinnen zusammengeführt. Daher sollten alle Streams, die bei gleichzeitiger Wiedergabe mit einem anderen Stream gedimmt werden sollen, an separate Ausgabegeräte weitergeleitet werden, damit die HAL das Ducking anwenden kann, bevor sie gemischt werden.

In den folgenden Fällen wird empfohlen, die Audiowiedergabe bei gleichzeitigen Interaktionen auszublenden.

Interaktion Aktion
EMERGENCY Alles außer SAFETY wird stummgeschaltet oder leiser gestellt
SAFETY Alle Töne außer EMERGENCY werden stummgeschaltet
NAVIGATION Unterdrückt alles außer SAFETY und EMERGENCY
CALL Unterdrückt alles außer SAFETY, EMERGENCY und NAVIGATION
VOICE Enten CALL_RING
VEHICLE_SOUNDS Sie legen fest, wie wichtig der aktive Ton ist und ob er andere Töne unterdrückt.
MUSIC und ANNOUNCEMENT Er hat alles abgewehrt. Eine Ausnahme bilden Töne für Touch-Interaktionen, die als SYSTEM_SOUND wiedergegeben werden.

Hinweise zum Ducking

Einige Apps und Dienste wie Navigation oder ein Assistent verwenden möglicherweise mehrere Player, um Aktionen auszuführen. Vermeiden Sie ein zu schnelles Aufheben der Stummschaltung, wenn ein Datenstream nicht mehr über die Ausgabegeräte übertragen wird. So wird verhindert, dass die Medien wieder auf die volle Lautstärke zurückgesetzt werden, bevor sie vor der nächsten Wiedergabe über die Navigation oder eine Assistant-App stummgeschaltet werden.

Bei Fahrzeugen mit mehreren Lautsprechern, die ausreichend voneinander isoliert sind, können Sie Audioinhalte an verschiedene Bereiche des Fahrzeugs weiterleiten, anstatt sie auszublenden. So können Navigationsanweisungen beispielsweise an die Lautsprecher in der Kopfstütze des Fahrers geleitet werden, während in der Kabine weiterhin Musik mit normaler Lautstärke abgespielt wird.

Für die Sicherheit wichtige Töne

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

Benutzeroberfläche für die Lautstärkeeinstellungen konfigurieren

Bei AAOS ist die Benutzeroberfläche für die Lautstärkeeinstellungen von der Konfiguration der Lautstärkegruppe getrennt. Diese können wie unter Gewinne für Volumegruppen konfigurieren beschrieben überlagert werden. Durch diese Trennung sind keine Änderungen erforderlich, wenn sich die Konfiguration der Volumegruppen ändert.

In der Benutzeroberfläche der Fahrzeugeinstellungen enthält packages/apps/Car/Settings/res/xml/car_volume_items.xml die UI-Elemente (Titel- und Symbolressourcen), die mit den einzelnen 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 Verwendung in jedem VolumeGroup verknüpft sind.

Im folgenden Beispiel wird beispielsweise ein VolumeGroup als einschließlich voice_communication und voice_communication_signalling definiert. Bei der Standardimplementierung der Benutzeroberfläche für die Autoeinstellungen wird VolumeGroup mit den mit voice_communication verknüpften Ressourcen gerendert, da dies der erste Match 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. Für die Benutzeroberfläche der Lautstärkeeinstellungen werden die folgenden VolumeGroup-basierten CarAudioManager APIs verwendet:

  • getVolumeGroupCount(), um zu erfahren, wie viele Steuerelemente gezeichnet werden sollten.
  • getGroupMinVolume() und getGroupMaxVolume(), um untere und obere Grenzwerte zu erhalten.
  • getGroupVolume(), um die aktuelle Lautstärke abzurufen.
  • registerVolumeChangeObserver(), um über Lautstärkeänderungen benachrichtigt zu werden.

Ereignis „Autovolumengruppe“

Anwendungsfälle für die Lautstärkeregelung und die Stummschaltung im Auto haben einen Kontext, der die Aktionen bestimmter Apps wie die Lautstärkeeinstellungen definieren kann. Der Rückruf für die aktuelle Lautstärke und Stummschaltung vom Audiostack des Autos bietet nur begrenzte Kontextinformationen. Um die Nutzung in der Automobilbranche besser zu unterstützen und die Skalierbarkeit in Zukunft zu verbessern, wurde Android 14 das Ereignis „CarVolumeGroupEvent“ hinzugefügt. Jedes Ereignis enthält drei wichtige Arten von Informationen:

  • Liste von CarVolumeGroupInfo
  • EventTypes (Bit-Mapped)
  • Liste von ExtraInfos

CarVolumeGroupInfo

Der Empfänger des Ereignis-Callbacks hat direkten Zugriff auf die Liste der betroffenen Informationen zur Fahrzeugvolumengruppe. Das bedeutet, dass die App keine zusätzlichen Aufrufe an das Car Audio Framework ausführen muss, um den aktuellen Status abzurufen. Es kann einfach die empfangene CarVolumeGroupInfos verwenden, um die Benutzeroberfläche oder internen Status zu aktualisieren. Für Apps werden die Aspekte, die sich in einer Lautstärkegruppe für Autos geändert haben, wie unten erläutert, auch als Teil von EventTypes bereitgestellt.

EventTypes

Hier wird definiert, welcher Aspekt von CarVolumeGroupInfo sich geändert hat. Apps können dies nutzen, um Änderungen zu erkennen und die erforderlichen Maßnahmen zu ergreifen. Beispiel: EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED gibt an, dass sich der entsprechende Index für den maximalen Volumengewinn von CarVolumeGroups 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

Hier finden Sie weitere Informationen dazu, warum sich die CarVolumeGroup geändert hat. Apps können diese Informationen verwenden, um zusätzlichen Kontext bereitzustellen, um den Nutzer zu einer Aktion aufzufordern oder ihn zu benachrichtigen. EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL steht beispielsweise für eine aktive transiente Dämpfung aufgrund einer thermischen Überlastung. Die App kann den Nutzer informieren, wenn er versucht, die Lautstärke zu erhöhen.

Wir erzwingen keinen Prozess für ExtraInfos. Sie können den Prozess basierend auf ExtraInfos festlegen. Wenn die Dämpfung beispielsweise aufgrund von EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED aktiv ist, können Sie die Lautstärkeleiste anfangs auch ausblenden, um zu verhindern, dass der Nutzer die Lautstärke ändert. Andere können ein Toast-Fenster anzeigen, dass die Stummschaltung aktiv ist, und dem Nutzer die Möglichkeit geben, die Lautstärke zu ändern.

Das Car Audio Framework hängt von der AudioControl HAL IAudioGainCallback ab, um die vorgeschlagene ExtraInfos bereitzustellen. Weitere Informationen finden Sie unter Audio Gain Callback.

CarVolumeGroupEvent kann skaliert werden, um zukünftigen Anforderungen des Audioframeworks für Autos gerecht zu werden. Wir beabsichtigen, neue Funktionen nur über CarVolumeGroupEvent zu unterstützen. Wir empfehlen App-Entwicklern dringend, CarVolumeGroupEvent für die Lautstärkeregelung und Stummschaltung von Gruppen zu verwenden.

Rückruf für Ereignis „Autolautstärkegruppe“

Android 14 bietet einen neuen Rückruf für privilegierte und Plattform-Apps, um sich zu registrieren und über CarVolumeGroupEvents benachrichtigt zu werden.

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

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

Wenn eine App mit der neuen CarVolumeGroupEventCallback und der alten CarVolumeCallback registriert wird, wird das Ereignis CarVolumeGroupEventCallbacks priorisiert. Der Audiostack des Autos löst CarVolumeCallback nicht mehr aus. So wird verhindert, dass für dieselbe App und dasselbe Ereignis doppelte Trigger erstellt werden.

Wir empfehlen dringend, CarVolumeGroupEventCallback zum Verwalten der Lautstärke von Gruppen und zum Stummschalten zu verwenden.

Rückruf für Audioverstärkung

Seit Android 13 kann die AudioControl HAL einen asynchronen Rückruf auslösen, um Aktualisierungen der Lautstärke aufgrund von Änderungen am Audiosystem des Autos zu verwalten.

HAL API

AudioControl @2.0 AIDL

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

API Zweck
IAudioControl#registerGainCallback Registriert eine Instanz von IAudioGainCallback bei der AudioControl HAL.
IAudioGainCallback#onAudioDeviceGainsChanged Asynchronous callback to notify changes to audio gain config.

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

  • Zonen-ID
  • Geräteportadresse
  • „Volume index > index“ kann entweder ein eingeschränkter Index oder ein Aktualisierungsindex sein.

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

  • Gründe für die Einschränkung Vorübergehende Änderung am Verhalten der Lautstärkeregelung und des Stummschaltens.
  • Gründe für die Aktualisierung Dauerhafte Änderung des Lautstärkeverhaltens.

Arten von Einschränkungen

Seit dem AudioControlHAL AIDLV3 werden die folgenden Arten von Einschränkungen unterstützt:

  • Stummschalten
  • Blockierungen
  • Einschränkung
  • Dämpfung
Aktive Einschränkung Vom Nutzer ausgelöste Lautstärkeänderung Vom Nutzer ausgelöste Stummschaltung
Stummschalten ❌ (Stummschaltung aufheben)

✔ (Stummschalten)
Blockierungen
Einschränkung ❌ (Limit überschritten)

✔ (Limit nicht überschritten)
Dämpfung

Die Priorität der Einschränkungen ist Stummschalten > Blockieren > Einschränken > Dämpfung.

Einschränkungen für Stummschalten

Einschränkungen für die Stummschaltung:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Das Car Audio Framework verwaltet intern diese beiden Stummschaltungsstatus:

  • Nutzer stummschalten Wird auf Nutzeranfrage entweder über CarAudioManager oder über Schlüsselereignisse aktiviert oder deaktiviert.

  • HAL-Stummschaltung Wird basierend auf Stummschaltungsbeschränkungen aktiviert und deaktiviert, die über den AudioGain-Callback empfangen wurden.

Für Zuhörer wie die Einstellungen-App hängt der Status der Stummschaltung der Lautstärkegruppe (CarVolumeGroupInfo.isMuted()) davon ab, ob eine der oben genannten Stummschaltungen aktiviert ist.

Wenn die HAL-Stummschaltung aktiviert ist, werden alle eingehenden Anfragen zur Lautstärkeänderung und zum Aufheben der Stummschaltung der Gruppe während der Dauer der Einschränkung ignoriert.

Interaktionsfall: Die HAL-Stummschaltung ist aktiv und der Nutzer fordert die Stummschaltung an

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

  • Der Stummschaltungsstatus der Lautstärkegruppe wurde in true geändert.
  • Anfragen von Nutzern, die Stummschaltung zu aktivieren, werden bearbeitet.
    • Grund: Anfragen von Nutzern zum Stummschalten von Inhalten müssen immer berücksichtigt werden, um die Privatsphäre der Nutzer zu schützen.

Wenn die HAL-Stummschaltung und die Nutzerstummschaltung aktiviert sind:

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

  • Anfragen von Nutzern, die Stummschaltung aufzuheben, werden NOT bearbeitet. Der im Cache gespeicherte Status der Nutzerstummschaltung bleibt aktiviert.

    • Grund: Anträge auf Aufheben der Stummschaltung werden nur genehmigt, wenn keine Einschränkungen aktiv sind.

    • Grund: Wenn die Stummschaltung für einen Nutzer aufgehoben wird, der zuvor im Cache stummgeschaltet wurde, kann das zu einer unerwarteten Lautstärkeexplosion führen und die Sicherheit des Nutzers gefährden. Dies gilt insbesondere, wenn der Stummschaltungsstatus über mehrere Zündzyklen hinweg aktiviert ist, was die Wahrnehmung der Lautstärke für die Nutzer verringert.

Interaktionsfall: HAL-Stummschaltung aktiviert und deaktiviert, während sich die Nutzerstummschaltung nicht ändert

Wenn Sie die HAL-Stummschaltung umschalten, ändert sich der allgemeine Stummschaltungsstatus der Lautstärkegruppe. Der Stummschaltungsstatus des Nutzers wird dadurch jedoch nicht direkt aktualisiert. Wenn die Stummschaltung durch den Nutzer deaktiviert ist und ein HAL-Stummschaltungs-Callback zum Aktivieren empfangen wird:

  • Der Stummschaltungsstatus der Lautstärkegruppe wurde in true geändert.
  • Anfragen von Nutzern zum Ändern der Lautstärke werden NOT verarbeitet, solange die 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 das zu einer Lautstärkeexplosion führen und die Sicherheit der Nutzer gefährden.

    • Grund: Lautstärke-Apps können sich für Rückrufe registrieren und die Stummschaltung automatisch ohne Nutzereingriff aufheben (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)), wenn dies das vom OEM erwartete Verhalten ist.

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

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

    Begründung: Wenn der Stummschaltungsstatus dauerhaft festgelegt ist und der Nutzer aufgefordert wird, die Stummschaltung aufzuheben, wird er möglicherweise unnötigerweise unterbrochen, wenn der Stummschaltungsstatus häufig wechselt.

  • Anfragen von Nutzern zum Ändern der Lautstärke werden wie gewohnt verarbeitet.

Blockierungen

Blockierungsbeschränkungen:

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

Wenn Blockierungsbeschränkungen aktiv sind, können Nutzer Folgendes nicht tun:

  • Lautstärkeänderungen werden nicht verarbeitet.
  • Die Stummschaltung wird aktiviert oder deaktiviert.

Einschränkung

Einschränkungen:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

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

  • So ändern Sie die Lautstärke:

    • Innerhalb des Limits werden verarbeitet
    • Anfragen, die die oben genannten Einschränkungen überschreiten, werden nicht verarbeitet.
  • Die Stummschaltung wird aktiviert oder deaktiviert.

Dämpfung

Einschränkungen bei der Dämpfung:

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

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

  • Die Lautstärke wird geändert. Die neue aktuelle Lautstärke wird auf die gedämpfte Lautstärke (anstelle der ursprünglichen Lautstärke) eingestellt. Alle zukünftigen Änderungen der Lautstärke werden auf dieser Ebene vorgenommen.

  • Die Stummschaltung wird ein-/ausgeschaltet.

Index aktualisieren

Die folgende Aktualisierung des Volume-Index gilt als asynchron: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

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

Beispiele

Anwendungsfall: Nutzer aktualisiert den Lautstärkeindex auf 30

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

  • Dieser Index wird in eine Lautstärkeverstärkung umgewandelt und an die Audio HAL gesendet.

  • Anbieterimplementierungen von Audio HAL erhalten die neue Lautstärke und aktualisieren das Audiosystem (z. B. einen externen Verstärker).

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

  • Anbieterimplementierungen von AudioControl HAL-Triggern:

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

Anwendungsfall: Erste Audiowiedergabe nach dem Beenden des Ruhemodus

  • Der Volumeindex vor dem Aussetzen ist auf 95 (Bereich: [0–99]) festgelegt.

  • Android wird in den Ruhemodus versetzt.

  • Wenn Android vorhanden ist, anhalten (z. B. 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 Safe Index aus:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Der Autoaudiodienst verwendet den neuen Index aus dem Rückruf, der für die Persistenz und seine eigenen Rückrufe an die Volume App verwendet wird, um den Index zu synchronisieren. Der Volumeindex vor dem Aussetzen ist 95. Nach der Wiederaufnahme wird dieser Index jedoch vom AudioControl HAL-Implementierer auf ein sicheres Lautstärkeniveau von 30 gesetzt.

Dynamische Volumekonfiguration

Für diese Funktion berücksichtigen wir die folgenden primären Anwendungsfälle:

  1. Konfiguration des End-of-Line-Fahrzeugs (EOL).

    • Automobilhersteller aktualisieren die Lautstärkekonfigurationen am Ende des Lebenszyklus lieber basierend auf der Konfiguration des Audiosystems des Fahrzeugs. In der Regel handelt es sich dabei um ein Sideload ohne Aktualisierung des Android-SW-Images.

    • Automobilhersteller müssen die Lautstärkekonfiguration möglicherweise während eines Wartungsplans aktualisieren.

  2. Laufzeitkonfiguration Audiosysteme in Fahrzeugen unterstützen externe Verstärkerkonfigurationen. Diese Steuergeräte können die Konfigurationen für den Lautstärkebereich hosten, die während des Startens abgefragt werden.

  3. On-Demand-Konfiguration Bietet auf der Grundlage der wachsenden Nachfrage nach bedarfsbasierten Audiofunktionen, bei denen Nutzer eine erweiterte Signalverarbeitung für einen bestimmten Zeitraum abonnieren können. Die neuen Konfigurationen für den Speicherplatzbereich gelten für die Dauer eines Abos.

Design

Die dynamische Volumekonfiguration erfolgt in drei Phasen:

  • Discovery Die AudioControl HAL-Implementierung des Anbieters erkennt neue Aktualisierungen des Lautstärkebereichs über einen benutzerdefinierten IPC-Mechanismus, der dem Anbieter gehört.

    Sobald ein Gerät gefunden wurde, wird über AudioControl::IModuleChangeCallback ein Callback generiert.

  • Aktualisieren Der Audiostack für Autos aktualisiert die Status der Lautstärkegruppen mit den neuen Lautstärkebereichen.

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

  • Callback

    • Nach Aktualisierungen des Bereichs der Lautstärkegruppe löst der Auto-Audiostack einen Rückruf an über CarVolumeGroupEventCallback registrierte Apps aus.

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

Bild

Abbildung 2: Dynamische Lautstärkekonfiguration

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 der AudioControl HAL fest.
IAudioControl#clearModuleChangeCallback Die Instanz von IModuleChangeCallback wird gelöscht, die zuvor mit der AudioControl HAL festgelegt wurde.
IModuleChangeCallback#onAudioPortsChanged Rückruf zur Benachrichtigung über Änderungen an Audioports

Sequenz

Das Sequenzdiagramm der dynamischen Volumekonfiguration wird unten angezeigt.

Bild

Abbildung 3: Sequenzdiagramm für die dynamische Volumekonfiguration.

Wichtige Aspekte

Beachten Sie Folgendes, um diese Funktion zu optimieren:

  • Die im Rahmen des Rückrufs bereitgestellten Audioports müssen der Automotive BUS-Definition entsprechen:

    • Geräteanschluss IN_DEVICE, OUT_DEVICE
    • Verbindung. BUS
    • Adresse Definiert in der Audio HAL-Definition
    • Gain-Modus JOINT
  • Anbieter müssen in der Audio-HAL-Richtlinie eine Supermenge von Lautstärkebereichsdefinitionen definieren und sie mithilfe des Rückrufs für Fahrzeugvarianten anpassen. Weitere Informationen finden Sie in der IModuleChangeCallbac-AIDL-Definition.

  • Wenn mehrere Audio-BUSse zur selben Lautstärkegruppe gehören, müssen sie identische Definitionen für den Lautstärkebereich haben. Andernfalls wird die neue Definition des Lautstärkebereichs vom Audio-Framework des Autos abgelehnt.