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 nach 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. Die Lautstärke kann für jede Lautstärkegruppe 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="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <device address="bus0_media_out">
                        <context context="music"/>
                    </device>
                </group>
                <group>
                    <device address="bus1_navigation_out">
                        <context context="navigation"/>
                    </device>
                    <device address="bus2_voice_command_out">
                        <context context="voice_command"/>
                    </device>
                </group>
                ...
            </volumeGroups>
        </zone>
     </zones>
</audioZoneConfiguration>

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.
  • Mindestgewinn 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 haben die Werte 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 einzigen 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.

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, 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 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, 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 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.
  • setFadeTowardFront(float value) verschiebt die Lautsprecherlautstärke in Richtung der Vorder- (+) oder Rückseite (-) des Autos.

    • 0,0 ist zentriert
    • +1,0 ist vollständig nach vorne
    • -1.0 ist vollständig nach hinten
    • 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 Ein- und 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 von Audioinhalten 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 dies 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 leiser gestellt werden sollen, an separate Ausgabegeräte weitergeleitet werden, damit die HAL die Ducking-Funktion vor dem Mischen anwenden kann.

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 Beginn 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 beispielsweise Navigationsanweisungen 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 die Gruppen von Lautstärken 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 den einzelnen definierten AudioAttributes.USAGE zugeordnet sind. Diese Datei ermöglicht ein angemessenes Rendern 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 sollen.
  • 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 kontextbezogenen Hintergrund, 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 Anwendungsfälle für die 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 Autolautstärkegruppe 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. Die Entscheidung, wie Sie vorgehen, liegt in Ihrem Ermessen.ExtraInfos Wenn die Dämpfung beispielsweise aufgrund von EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED aktiv ist, können Sie die Lautstärkeleiste auch zuerst 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 den zukünftigen Anforderungen des Audioframeworks für Autos gerecht zu werden. Neue Funktionen werden nur über CarVolumeGroupEvent unterstützt. 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 für CarVolumeGroupEvents zu registrieren und 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 ist, 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ärke 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 Ein/Aus-Schaltfläche für die 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änkung“ > „Dämpfung“.

Einschränkungen für die Stummschaltung

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 sollten 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 der Nutzer 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, während 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
    • Über die oben genannten Einschränkungen hinausgehende Daten 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, werden Anfragen von Nutzern zu folgenden Aktionen abgelehnt:

  • 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 für das Ende des Produktzyklus des Fahrzeugs

    • 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 des Anbieters.

    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 den aktualisierten CarVolumeGroupInfo, den Ereignistyp (was sich geändert hat) und zusätzliche Informationen (warum sich etwas geändert hat).

Bild

Abbildung 1. 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 2. 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 Wird in der Audio HAL-Definition definiert
    • Gain-Modus JOINT
  • Anbieter müssen in der Audio-HAL-Richtlinie eine Supermenge von Definitionen für den Lautstärkebereich 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.