Volume-Verwaltung

Die Lautstärkeregelung ist in CarAudioService enthalten. Dort werden feste Lautstärken verwendet, da davon ausgegangen wird, dass die Lautstärken unterhalb der HAL von einem Hardwareverstärker und nicht in der Software angewendet werden. Mit CarAudioService werden Ausgabegeräte in Lautstärkegruppen organisiert, um dieselben Verstärkungen auf alle Geräte anzuwenden, die mit einer Lautstärkegruppe verknüpft 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. Dies 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.

Volumegruppen definieren

CarAudioService verwendet Lautstärkegruppen, die in car_audio_configuration.xml definiert sind:

<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 sollten den in audio_policy_configuration.xml definierten Ausgabegeräten entsprechen.

Steigerungen für Volume-Gruppen 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.
  • Maximaler Gewinn: 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

Jeder Audiozone ist mindestens eine Lautstärkegruppe zugeordnet und 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 Volumengruppen 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 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 Höchstaktivierungsvolumen

In Android 15 können Lautstärkegruppenindexe gesteuert werden, um die Sicherheit und den Nutzerkomfort in Car-Audio-Systemen zu verbessern. Dies wird durch die Verwendung von Mindest- und Höchstaktivierungsvolumes 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 aktivierte Wiedergabe in einer Volumengruppe angewendet.

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

  • Aktuell aktive Wiedergabetracks
  • Aktueller Anrufstatus
  • Aktuelle Audiofokus-Anfrage von der Audio Control HAL, bei der die Audiofokus-Anfrage von der 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 Werten für minActivationVolumePercentage, maxActivationVolumePercentage, den Mindest- und Höchstindex für die Steigerung des Volumens können Sie den Mindest- und Höchstindex 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, das im activationVolumeConfigEntry angegeben ist, das 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 Aktivierungslautstärkeindexbereichs liegen. Das bedeutet, dass einer der folgenden Punkte zutrifft:

    • Der Index ist niedriger als der berechnete Index für die Mindeststeigerung 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 Volumengruppe auf einen der folgenden Werte angepasst:

  • Der Index für den Mindestanstieg des Aktivierungsvolumens ist niedriger 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 des Autos mit dem Ereignistyp EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED an alle registrierten Rückrufe für Lautstärkegruppenereignisse gesendet.

Lautstärketasten-Ereignisse verarbeiten

In Android sind mehrere Keycodes für die Lautstärkeregelung definiert, 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 zur Verarbeitung durch CarAudioService gezwungen 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ärke-Schlüsselereignissen 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 Lautstärketastenevent 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 Fade 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:

  • setBalanceTowardRight(float value) verschiebt die Lautsprecherlautstärke nach rechts (+) oder links (-) im Auto.

    • 0,0 ist zentriert
    • +1,0 ist vollständig richtig
    • -1,0 ist ganz links.
    • Ein Wert außerhalb des Bereichs von -1 bis 1 ist ein Fehler.
  • setFadeTowardFront(float value) verschiebt die Lautsprecherlautstärke nach vorn (+) oder hinten (–) im Auto.

    • 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 den Nutzern angezeigt werden sollen. Sie können entweder 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 nicht vom Betriebssystem stammen. In Android 11 ist die wichtigste Information, die dem HAL zur Verfügung steht, um Entscheidungen zum Ducking zu treffen, ob auf zwei Ausgabegeräten aktive Streams vorhanden sind.

Wann du dich ducken solltest

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 Ducking anwenden kann, bevor die Streams gemischt werden.

Im Folgenden finden Sie Beispiele für mögliche gleichzeitige Interaktionen, bei denen Ducking empfohlen wird.

Interaktion Aktion
EMERGENCY Ducks oder stummschaltet alles außer SAFETY
SAFETY Ducks alles außer EMERGENCY
NAVIGATION Weicht allem aus, 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 der aktive Sound ist und ob andere Sounds dadurch gedämpft werden sollen.
MUSIC und ANNOUNCEMENT Von allem abgelenkt. 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. Vermeide aggressives Absenken der Lautstärke, wenn kein Datenstrom mehr über Ausgabegeräte übertragen wird, damit die Lautstärke nicht wieder auf das volle Niveau zurückkehrt, bevor sie vor der nächsten Wiedergabe durch die Navigations- oder eine Assistenten-App abgesenkt wird.

Bei Fahrzeugen mit mehreren Soundstages mit ausreichender Isolation können Sie Audioinhalte an verschiedene Bereiche des Autos weiterleiten, anstatt sie zu unterbrechen. 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 Lautstärkeanpassungen 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 definiert, dass VolumeGroup voice_communication und voice_communication_signalling umfasst. 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. In der Benutzeroberfläche für die Lautstärkeeinstellungen werden die folgenden VolumeGroup-basierten CarAudioManager-APIs verwendet:

  • 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 des Volumens 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 definieren können, z. B. die Lautstärkeeinstellungen. 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 Listen
  • EventTypes (bitmapped)
  • ExtraInfos Listen

CarVolumeGroupInfo

Der Empfänger des Ereignis-Callbacks hat direkten Zugriff auf die Liste der Informationen zur betroffenen Lautstärkegruppe für das Auto. 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 die Integration zu vereinfachen, werden die Aspekte, die sich in einer Gruppe mit Autolautstärke geändert haben, auch als Teil von EventTypes bereitgestellt, wie unten beschrieben.

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 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 weist auf eine aktive vorübergehende Dämpfung aufgrund einer thermischen Überlastung hin. 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 können einen Hinweis einblenden, dass die Lautstärkeabsenkung aktiv ist, und dem Nutzer die Möglichkeit geben, 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 lässt sich an zukünftige Anforderungen des Car Audio Framework anpassen. 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 Gruppe „Car volume“

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. Dadurch werden doppelte Trigger für dieselbe App für dasselbe Ereignis verhindert.

Wir empfehlen dringend, CarVolumeGroupEventCallback zu verwenden, um Änderungen an der Gruppenlautstärke und Stummschaltung zu verwalten.

Audio-Gain-Callback

Seit Android 13 kann AudioControl HAL einen asynchronen Callback auslösen, um Lautstärkepegel-Updates aufgrund von Änderungen am Car-Audiosystem 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 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 in folgende Kategorien einteilen:

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

Einschränkungstypen

Seit dem AudioControl HAL AIDL V3 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 Ein/Aus-Schaltfläche für die Stummschaltung
Stummschalten ❌ (Ton einschalten)

✔ (Ton ausschalten)
Blockierungen
Einschrä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 aktiviert.

  • 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 Nutzer-Stummschaltung 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 müssen jederzeit 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 zum Aufheben 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. Dies 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-Stummschaltungs-Callback zum Aktivieren 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 Geräusche wahrnehmen, 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: Volumen-Apps können sich für Rückrufe registrieren und das Stummschalten automatisch aufheben (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)), ohne dass der Nutzer eingreifen muss, 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 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 zum Ändern 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.

Einschränkung

Einschränkungen für Limits:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

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

  • Lautstärke ändern:

    • Innerhalb der Einschränkung verarbeitet
    • 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, werden Anfragen von Nutzern für Folgendes:

  • Änderungen des Volumens werden verarbeitet. Die neue aktuelle Lautstärke wird auf die gedämpfte Lautstärke (statt auf die bisherige Lautstärke) eingestellt. Zukünftige Lautstärkeänderungen werden ab diesem Pegel vorgenommen.

  • Die Stummschaltung wird ein- oder ausgeschaltet.

Index aktualisieren

Das Folgende gilt als asynchrone Aktualisierung des Volume-Index: 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 eine Lautstärkeerhöhung umgewandelt und an Audio HAL gesendet.

  • Anbieterimplementierungen vonAudio HALerhalten die neue Lautstärkeanhebung und aktualisieren das Audiosystem (z. B. einen externen 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 das asynchrone Feedback 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 es 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 für die Lautstärke-App, um den Index zu synchronisieren. Der Volumenindex vor der Sperrung beträgt 95. Nach dem Fortsetzen wird dieser Index jedoch vom AudioControl HAL-Implementierer auf eine sichere Lautstärke 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 (EOL):

    • Automobilhersteller aktualisieren 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: Automotive-Audiosysteme 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 Lautstärkebereich gelten für die gesamte Laufzeit 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 bereitgestellt 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 IModuleChangeCallbac-AHDL-Definition.

  • 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 Definition des Lautstärkebereichs vom Car Audio Framework abgelehnt.