Volumenverwaltung

Die Lautstärkeverwaltung ist in CarAudioService enthalten, das feste Lautstärken verwendet, mit der Erwartung, dass Lautstärken unterhalb des HAL von einem Hardware-Verstärker und nicht in der Software angewendet werden. CarAudioService organisiert Ausgabegeräte in Volumengruppen, um die gleichen Verstärkungen auf alle Geräte anzuwenden, die einer Volumengruppe zugeordnet sind.

Feste Volumina

AAOS-Implementierungen verwenden einen Hardware-Verstärker zur Lautstärkeregelung anstelle eines Software-Mixers. Um Nebenwirkungen zu vermeiden, setzen Sie das Flag config_useFixedVolume auf true (überlagern Sie es 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 je nach Stream-Typ im Software-Mixer zu ändern. Dies ist aufgrund möglicher Auswirkungen auf andere Apps und der Tatsache, dass die Lautstärkedämpfung im Software-Mixer dazu führen kann, dass beim Empfang durch den Hardware-Verstärker weniger signifikante Bits im Signal verfügbar sein können, möglicherweise nicht immer wünschenswert.

Volumengruppen

Lautstärkegruppen verwalten die Lautstärken für eine Sammlung von Geräten innerhalb einer Audiozone. Für jede Lautstärkegruppe kann die Lautstärke unabhängig geregelt werden. Die resultierenden Verstärkungen werden auf den zugehörigen Geräten konfiguriert, um sie vom Verstärker des Fahrzeugs anzuwenden. Die Lautstärkeeinstellungen bleiben für den Benutzer erhalten und werden geladen, wenn sich der Benutzer anmeldet.

Definieren Sie Volumengruppen

CarAudioService verwendet in car_audio_configuration.xml definierte Volumengruppen:

<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 Volume-Gruppe sollte ein oder mehrere Ausgabegeräte mit zugehörigen Adressen enthalten. Die Adressen sollten den in audio_policy_configuration.xml definierten Ausgabegeräten entsprechen.

Konfigurieren Sie die Lautstärkegruppenverstärkungen

Jede Lautstärkegruppe verfügt über minimale, maximale und Standardverstärkungswerte sowie eine Schrittgröße, die auf Werten basiert, die in audio_policy_configuration.xml für die mit der Lautstärkegruppe verknüpften Geräte konfiguriert 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 überprüft die Volume-Gruppe die Verstärkungswerte der zugehörigen Geräte und konfiguriert die Gruppe wie folgt:

  • Schrittlänge. Muss für alle von der Volume-Gruppe gesteuerten Geräte gleich sein.
  • Minimaler Gewinn. Kleinster minimaler Gewinn unter den Geräten in der Gruppe.
  • Maximaler Gewinn. Höchste maximale Verstärkung unter den Geräten in der Gruppe.
  • Standardgewinn. Höchste Standardverstärkung unter den Geräten in der Gruppe.

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

Bezeichner der Datenträgergruppe

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

Mehrzonen-Volume-Management

Es wird erwartet, dass jede Audiozone über eine oder mehrere Lautstärkegruppen verfügt, und jede Lautstärkegruppe ist nur einer einzelnen Audiozone zugeordnet. Diese Beziehung ist als Teil von car_audio_configuration.xml definiert. Weitere Informationen finden Sie im obigen Beispiel unter „Volumegruppen definieren“ .

Die aktuellen Lautstärkepegel für jede Zone bleiben für den Benutzer erhalten, der dieser Zone zugeordnet ist. Diese Einstellungen sind zonenspezifisch, d. h. wenn sich ein Benutzer an einem Display anmeldet, das der primären Zone zugeordnet ist, und sich später dann bei einer Zone anmeldet, die einer sekundären Audiozone zugeordnet ist, unterscheiden sich die geladenen und beibehaltenen Lautstärkepegel für die erste Zone von denen für die sekundäre Zone.

Behandeln Sie Lautstärketastenereignisse

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

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Standardmäßig leitet Android die Lautstärketastenereignisse an Apps weiter. Automotive-Implementierungen sollten die Verarbeitung dieser Schlüsselereignisse durch CarAudioService erzwingen, der dann je nach Bedarf setGroupVolume oder setMasterMute aufruft. Um dieses Verhalten zu erzwingen, setzen Sie das Flag config_handleVolumeKeysInWindowManager auf true :

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

Lautstärketastenereignisse können derzeit nicht unterscheiden, für welche Zone sie bestimmt sind, und es wird davon ausgegangen, dass sie alle mit der primären Audiozone verknüpft sind. Wenn ein Lautstärketastenereignis empfangen wird, bestimmt CarAudioService , welche Lautstärkegruppe angepasst werden soll, indem es die Audiokontexte für die aktiven Player abruft und dann die Lautstärkegruppe anpasst, die das Ausgabegerät enthält, das dem Audiokontext mit der höchsten Priorität zugeordnet ist. Die Priorisierung wird basierend auf einer festen Reihenfolge bestimmt, die in CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY definiert ist.

Verblassen und Ausbalancieren

Beide Versionen des AudioControl HAL enthalten APIs zum Einstellen von Fade und Balance im Fahrzeug. Entsprechende System-APIs für CarAudioManager übergeben Werte an die AudioControl HAL. Diese APIs erfordern android.car.permission.CAR_CONTROL_AUDIO_VOLUME . Die AudioControl-APIs sind:

  • setBalanceTowardRight(float value) verschiebt die Lautsprecherlautstärke zur rechten (+) oder linken (-) Seite des Autos.

    • 0,0 ist zentriert
    • +1,0 ist völlig richtig
    • -1,0 ist vollständig übrig
    • Ein Wert außerhalb des Bereichs von -1 bis 1 ist ein Fehler
  • setFadeTowardFront(float value) verschiebt die Lautsprecherlautstärke in Richtung der Vorderseite (+) oder Rückseite (-) des Fahrzeugs.

    • 0,0 ist zentriert
    • +1,0 ist ganz nach vorne
    • -1,0 ist ganz nach hinten
    • Ein Wert außerhalb des Bereichs von -1 bis 1 ist ein Fehler

Sie entscheiden, wie diese Werte angewendet werden sollen und wie die Werte den Benutzern angezeigt werden. Sie können strikt auf Medien oder allgemein auf alle Android-Sounds angewendet werden. Mit Android 11 wurde außerdem die Unterstützung für die Anwendung von Audioeffekten auf Ausgabegeräten eingeführt. Damit ist es möglich, Fade und Balance alternativ über Audioeffekte auf den entsprechenden Ausgabegeräten statt über diese APIs zu verwalten.

Audio-Ducking

Audio-Ducking tritt auf, wenn das Fahrzeug die Verstärkung für einen Stream reduziert, sodass ein anderer gleichzeitig abgespielter Stream deutlicher zu hören ist. In AAOS wird Audio-Ducking durch die HAL implementiert. Android hat keine Kontrolle über Sounds außerhalb des Betriebssystems. In Android 11 ist die Hauptinformation, die dem HAL zur Verfügung steht, um Ducking-Entscheidungen zu treffen, ob zwei Ausgabegeräte beide über aktive Streams verfügen oder nicht.

Wann man sich ducken sollte

Während es Sache des einzelnen OEM ist, zu bestimmen, wie Ducking von der HAL gehandhabt wird, empfehlen wir die folgenden Richtlinien.

  • In Android werden häufig mehrere Streams abgespielt, wenn zwei Apps oder Dienste gleichzeitig den Audiofokus behalten. Um zu erfahren, wann Android gleichzeitigen Fokus gewähren kann, sehen Sie sich die Interaktionsmatrix unter Einschränkungstypen an. Mit der Einführung des Car-Audio-Plugins hängt dies auch von Ihrem AudioFocus-Management ab.

  • Alle von Android gemischten Streams werden vor der Anwendung etwaiger Gewinne durchgeführt. Daher sollte jeder Stream, der geduckt werden soll, wenn er gleichzeitig mit einem anderen abgespielt wird, an separate Ausgabegeräte weitergeleitet werden, damit der HAL vor dem Mischen Ducken anwenden kann.

Im Folgenden sind mögliche gleichzeitige Interaktionen aufgeführt. Ducking wird empfohlen.

Interaktion Aktion
EMERGENCY Entzieht oder schaltet alles außer SAFETY
SAFETY Entdeckt alles außer EMERGENCY
NAVIGATION Entdeckt alles außer SAFETY und EMERGENCY
CALL Entdeckt alles außer SAFETY , EMERGENCY und NAVIGATION
VOICE Enten CALL_RING
VEHICLE_SOUNDS Sie bestimmen, wie wichtig der aktive Ton ist und ob er andere Geräusche unterdrückt oder nicht.
MUSIC und ANNOUNCEMENT Von allem geduckt. Ausnahmen sind Berührungsinteraktionstöne, die als SYSTEM_SOUND abgespielt werden.

Überlegungen beim Ducken

Einige Apps und Dienste, etwa die Navigation oder ein Assistent, nutzen möglicherweise mehrere Player zum Ausführen von Aktionen. Vermeiden Sie aggressives Unducking, wenn ein Datenstrom nicht mehr durch Ausgabegeräte fließt, um sicherzustellen, dass die Medien nicht wieder die volle Lautstärke erreichen, bevor das Ducking erfolgt, bevor3 die nächste Wiedergabe über die Navigation oder eine Assistenten-App startet.

Bei Fahrzeugen mit mehreren Klangbühnen und ausreichender Isolierung können Sie den Ton in verschiedene Bereiche des Fahrzeugs leiten, anstatt ihn zu ducken. Beispielsweise können Navigationsanweisungen an die Kopfstützenlautsprecher des Fahrers weitergeleitet werden, während im gesamten Innenraum weiterhin Musik in normaler Lautstärke abgespielt wird.

Sicherheitskritische Geräusche

Mit Android 11 wurden HAL-Audiofokus-APIs eingeführt. Der HAL stellt sicher, dass sicherheitskritische Geräusche Vorrang vor anderen Geräuschen haben. Wenn die HAL den Audiofokus für USAGE_EMERGENCY behält, kann nicht garantiert werden, dass Apps und Dienste von Android keine Sounds wiedergeben. Der HAL bestimmt, welche Streams von Android gemischt oder stummgeschaltet werden sollen, um sicherheitskritische Sounds abzuspielen.

Konfigurieren Sie die Benutzeroberfläche für die Lautstärkeeinstellungen

AAOS entkoppelt die Benutzeroberfläche der Volume-Einstellungen von der Volume-Gruppenkonfiguration. Diese können wie unter Volumengruppenverstärkungen konfigurieren beschrieben überlagert werden. Durch diese Trennung wird sichergestellt, dass keine Änderungen erforderlich sind, falls sich die Konfiguration von Volume-Gruppen ä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 jedem definierten AudioAttributes.USAGE zugeordnet sind. Diese Datei sorgt für eine angemessene Darstellung der definierten VolumeGroups , indem Ressourcen verwendet werden, die der ersten erkannten Verwendung zugeordnet sind, die in jeder VolumeGroup enthalten ist.

Im folgenden Beispiel wird beispielsweise eine VolumeGroup so definiert, dass sie voice_communication und voice_communication_signalling enthält. Die Standardimplementierung der Benutzeroberfläche für Fahrzeugeinstellungen rendert die VolumeGroup mithilfe der Ressourcen, die mit voice_communication verknüpft sind, da dies die erste Übereinstimmung in der Datei ist.

<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
    <item car:usage="voice_communication"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="voice_communication_signalling"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="media"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="game"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="alarm"
          car:title="@*android:string/volume_alarm"
          car:icon="@*android:drawable/ic_audio_alarm"/>
    <item car:usage="assistance_navigation_guidance"
          car:title="@string/navi_volume_title"
          car:icon="@drawable/ic_audio_navi"/>
    <item car:usage="notification_ringtone"
          car:title="@*android:string/volume_ringtone"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistant"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="notification"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_request"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_instant"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_delayed"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_event"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_accessibility"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_sonification"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="unknown"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>

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

  • getVolumeGroupCount() , um zu erfahren, wie viele Steuerelemente gezeichnet werden sollen.
  • getGroupMinVolume() und getGroupMaxVolume() , um Unter- und Obergrenzen zu erhalten.
  • getGroupVolume() , um die aktuelle Lautstärke abzurufen.
  • registerVolumeChangeObserver() , um über Volumenänderungen benachrichtigt zu werden.

Auto-Volumen-Gruppenveranstaltung

Automobil-Anwendungsfälle der Lautstärkeaktualisierung und der Stummschaltung verfügen über kontextbezogene Grundlagen, die die Aktionen bestimmter Apps definieren können, beispielsweise die Lautstärkeeinstellungen. Der aktuelle Lautstärke- und Stummschaltungsrückruf vom Car-Audio-Stack bietet begrenzte Kontextinformationen. Um Automobil-Anwendungsfälle und zukünftige Skalierbarkeit besser zu bedienen, wurde CarVolumeGroupEvent zu Android 14 hinzugefügt. Jedes Ereignis enthält drei wichtige Arten von Informationen:

  • Liste von CarVolumeGroupInfo
  • EventTypes (Bitmap)
  • Liste der ExtraInfos

CarVolumeGroupInfo

Der Empfänger des Ereignisrückrufs hat sofortigen Zugriff auf die Liste der betroffenen Fahrzeugdatenträgergruppeninformationen. Dies bedeutet, dass die App keine zusätzlichen Aufrufe an das Car-Audio-Framework tätigen muss, um den neuesten Status zu erhalten. Es kann einfach die empfangenen CarVolumeGroupInfos verwenden to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of , wie unten erläutert.

Ereignistypen

Definiert, welcher Aspekt von CarVolumeGroupInfo geändert wurde. Apps können damit Änderungen erkennen und die erforderlichen Maßnahmen ergreifen. Beispielsweise gibt EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED an, dass sich der CarVolumeGroups' maximum volume gain index has changed and can be queried by .

Die folgende Tabelle zeigt die Beziehung zwischen EventType und CarVolumeGroupInfo .

Ereignistyp 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 darüber, warum sich die CarVolumeGroup geändert hat. Apps können diese Informationen verwenden, um zusätzlichen Kontext bereitzustellen, um den Benutzer entweder zum Handeln aufzufordern oder ihn zu benachrichtigen. EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL zeigt beispielsweise eine aktive transiente Dämpfung aufgrund einer thermischen Überlastung an. Die App kann den Benutzer informieren, wenn er versucht, die Lautstärke zu erhöhen.

Wir erzwingen keinen Prozess für ExtraInfos . Es liegt in Ihrem Ermessen, den Prozess anhand von ExtraInfos festzulegen. Wenn die Dämpfung beispielsweise aufgrund von EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED aktiv ist, können Sie auch die Benutzeroberfläche der Lautstärkeleiste zunächst ausblenden, um zu verhindern, dass der Benutzer die Lautstärke ändert. Andere entscheiden sich möglicherweise dafür, einen Toast anzuzeigen, dass das Ducken aktiv ist, und dem Benutzer die Möglichkeit zu geben, die Lautstärke zu ändern.

Das Car-Audio-Framework ist auf den AudioControl HAL IAudioGainCallback angewiesen, um die vorgeschlagenen ExtraInfos bereitzustellen. Weitere Informationen finden Sie unter Audio Gain Callback .

CarVolumeGroupEvent lässt sich skalieren, um zukünftige Anforderungen des Car-Audio-Frameworks zu erfüllen. Wir beabsichtigen, neue Funktionen nur über CarVolumeGroupEvent zu unterstützen . Wir empfehlen App-Entwicklern dringend, CarVolumeGroupEvent zu verwenden, um die Gruppenlautstärke zu verwalten und Änderungen stummzuschalten.

Rückruf des Fahrzeugvolumengruppen-Ereignisses

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

  • Um sich für einen Rückruf zu registrieren, verwenden Sie CarAudioManager#registerCarVolumeGroupEventCallback()

  • Um die Registrierung des Rückrufs aufzuheben, verwenden Sie CarAudioManager#unregisterCarVolumeGroupEventCallback()

Wenn sich eine App beim neuen CarVolumeGroupEventCallback und beim alten CarVolumeCallback registriert, werden die Ereignisse CarVolumeGroupEventCallbacks priorisiert. Der Car-Audio-Stack löst CarVolumeCallback nicht mehr aus. Dies verhindert doppelte Auslöser für dieselbe App für dasselbe Ereignis.

Wir empfehlen dringend, dass Sie CarVolumeGroupEventCallback verwenden, um die Gruppenlautstärke zu verwalten und Änderungen stummzuschalten.

Rückruf zur Audioverstärkung

Seit Android 13 kann AudioControl HAL einen asynchronen Rückruf auslösen, um Lautstärkeaktualisierungen aufgrund von Änderungen am Auto-Audiosystem zu verwalten.

HAL-API

AudioControl @2.0 AIDL

Version 2.0 von 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 Rückruf zur Benachrichtigung über Änderungen an der Audioverstärkungskonfiguration.

Der AudioControl HAL-Rückruf enthält Listen mit Gründen und die entsprechende AudioGainConfigInfo , die aus Folgendem besteht:

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

Die Gründe können grob wie folgt kategorisiert werden:

  • Einschränkungsgründe. Vorübergehende Änderung der Lautstärke und des Stummschaltungsverhaltens.
  • Update-Gründe. Dauerhafte Änderung des Lautstärkeverhaltens.

Einschränkungstypen

Ab AudioControl HAL AIDL V3 werden folgende Arten von Einschränkungen unterstützt:

  • Stumm
  • Blockierung
  • Einschränkung
  • Dämpfung
Aktive Einschränkung Vom Benutzer ausgelöste Lautstärkeänderung Vom Benutzer ausgelöste Stummschaltung
Stumm ❌ (Stummschaltung aufheben)

✔ (stumm)
Blockierung
Einschränkung ❌ (über dem Limit)

✔ (unter Grenzwert)
Dämpfung

Die Priorität zwischen den Einschränkungen ist „Stumm“ > „Blockierung“ > „Beschränkung“ > „Dämpfung“.

Stummschaltungsbeschränkungen

Stummschaltungsbeschränkungen sind:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Das Car-Audio-Framework behält intern diese beiden Stummschaltungszustände bei:

  • Benutzerstummschaltung. Wird auf Anfrage des Benutzers umgeschaltet, entweder über CarAudioManager oder wichtige Ereignisse.

  • HAL-Stummschaltung. Wird basierend auf Stummschaltungsbeschränkungen umgeschaltet, die über AudioGain Rückruf empfangen wurden.

Für Hörer wie die App „Einstellungen“ basiert der allgemeine Stummschaltungsstatus ( CarVolumeGroupInfo.isMuted() ) der Lautstärkegruppe darauf, ob eine der oben genannten Stummschaltungen aktiviert ist.

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

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

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

  • Der allgemeine Stummschaltungsstatus der Volume-Gruppe wird in true geändert.
  • Anfragen des Benutzers, die Stummschaltung zu aktivieren, werden bearbeitet.
    • Grund: Stummschaltungsanfragen von Benutzern sollten jederzeit berücksichtigt werden, um die Privatsphäre der Benutzer zu schützen.

Wenn die HAL-Stummschaltung aktiviert ist und die Benutzer-Stummschaltung aktiviert ist:

  • Der allgemeine Stummschaltungsstatus der Volume-Gruppe wird in true geändert.

  • Anfragen des Benutzers, die Stummschaltung zu deaktivieren, werden NOT bearbeitet. Der Stummschaltungsstatus des zwischengespeicherten Benutzers bleibt aktiviert.

    • Grund: Anfragen zum Aufheben der Stummschaltung durch Benutzer werden nur dann berücksichtigt, wenn keine aktiven Einschränkungen vorliegen.

    • Grund: Das Aufheben der zwischengespeicherten Stummschaltung durch den Benutzer kann zu einer unbeabsichtigten Geräuschexplosion führen und die Sicherheit des Benutzers gefährden. Dies gilt insbesondere dann, wenn der Stummschaltungszustand über alle Zündzyklen hinweg aktiviert ist, was die Wahrnehmung des Geräuschpegels durch den Benutzer beeinträchtigt.

Interaktionsfall: HAL Mute aktiviert und deaktiviert, während User Mute keine Änderungen hat

Durch das Umschalten der HAL-Stummschaltung wird der allgemeine Stummschaltungsstatus der Lautstärkegruppe geändert. Der Stummschaltungsstatus des Benutzers wird jedoch nicht direkt aktualisiert. Wenn die Stummschaltung des Benutzers deaktiviert ist und ein HAL-Stummschaltungsrückruf zum Aktivieren empfangen wird:

  • Der allgemeine Stummschaltungsstatus der Volume-Gruppe wird in true geändert.
  • Anfragen des Benutzers, die Lautstärke zu ändern, werden NOT verarbeitet, solange die HAL-Stummschaltung aktiviert ist.

    • Grund: Der Benutzer kann keinen Ton wahrnehmen, während die Stummschaltung aktiviert ist. Das Zulassen einer Lautstärkeänderung kann zu einer Geräuschexplosion führen und die Sicherheit des Benutzers gefährden.

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

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

  • Der Stummschaltungsstatus der Volume-Gruppe wird in false geändert.

    Grund: Das Festhalten des Stummschaltungsstatus und die Aufforderung an den Benutzer, die Stummschaltung aufzuheben, kann den Benutzer unnötig unterbrechen, wenn die Stummschaltungszustände häufig wechseln.

  • Anfragen von Benutzern, die Lautstärke zu ändern, werden normal bearbeitet.

Blockierung

Sperrbeschränkungen sind:

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

Wenn Blockierungsbeschränkungen aktiv sind, können Anfragen von Benutzern an Folgendes gerichtet werden:

  • Änderungsmengen werden nicht verarbeitet.
  • Stummschaltung umschalten werden verarbeitet.

Einschränkung

Einschränkungsbeschränkungen sind:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Wenn Beschränkungseinschränkungen aktiv sind, können Anfragen von Benutzern an Folgendes gerichtet werden:

  • Lautstärke ändern:

    • Im Rahmen der Limitierung werden verarbeitet
    • Die oben genannten Einschränkungen werden nicht verarbeitet
  • Stummschaltung umschalten werden verarbeitet.

Dämpfung

Dämpfungsbeschränkungen sind:

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

Wenn Dämpfungseinschränkungen aktiv sind, können Anfragen von Benutzern an Folgendes gerichtet werden:

  • Änderungsvolumen werden verarbeitet. Der neue aktuelle Lautstärkepegel wird auf die gedämpfte Lautstärke eingestellt (statt auf die vorherige Lautstärke). Zukünftige Lautstärkeänderungen werden von dieser Ebene aus vorgenommen.

  • Stummschaltung umschalten wird verarbeitet.

Auf Index aktualisieren

Folgendes wird als asynchrone Datenträgerindexaktualisierung betrachtet: Reasons.EXTERNAL_AMP_VOL_FEEDBACK .

Aus diesem Grund kann AudioControl HAL den aktuellen Index der Volume-Gruppe auf den angegebenen Index aktualisieren. Dies wird hauptsächlich als Rückmeldung des Audiosystems für die Lautstärkeänderungsanforderung des Car-Audio-Frameworks verwendet. Die Indexaktualisierung wird auch mit Apps als CarVolumeGroupEvent Callback kommuniziert, um den Index zu synchronisieren.

Beispiele

Anwendungsfall: Der Benutzer aktualisiert den Volume-Index auf 30

  • Der Benutzer verwendet die Volume-App, um den Volume-Index auf 30 zu ändern.

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

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

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

  • Anbieterimplementierungen von AudioControl HAL Triggern:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Der Car-Audio-Dienst nutzt den neuen Index von Callback, der für Persistenz und Callbacks zur Lautstärke-App verwendet wird. Der vom Benutzer angeforderte Index ist 30. Das asynchrone Feedback des Audiosystems aktualisiert den Index jedoch auf 15.

Anwendungsfall: Erste Audiowiedergabe nach Verlassen des Suspend-Modus

  • Der Lautstärkeindex vor dem Anhalten ist auf einen hohen Wert von 95 eingestellt (Bereich: [0–99]).

  • Android geht in den Suspend-Modus.

  • Sobald Android vorhanden ist, wird es angehalten (z. B. fortgesetzt):

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

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

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Der Car-Audio-Dienst nutzt den neuen Index aus dem Rückruf, der für die Persistenz verwendet wird, und seine eigenen Rückrufe an die Lautstärke-App, die den Index synchronisiert. Der Lautstärkeindex vor dem Anhalten beträgt 95. Nach der Wiederaufnahme wird dieser Index jedoch vom AudioControl HAL Implementierer auf einen sicheren Lautstärkepegel von 30 gesetzt.

Dynamische Volume-Konfiguration

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

  1. Fahrzeug-End-of-Line-Konfiguration (EOL).

    • Autohersteller bevorzugen es, die Lautstärkekonfigurationen bei EOL basierend auf der Konfiguration des Fahrzeug-Audiosystems zu aktualisieren. In der Regel handelt es sich hierbei um einen Sideload ohne Aktualisierung des Android-SW-Images.

    • Autohersteller müssen möglicherweise die Volumenkonfiguration während eines Wartungsplans aktualisieren.

  2. Laufzeitkonfiguration. Automotive-Audiosysteme unterstützen externe Verstärkerkonfigurationen und diese Steuergeräte können die Lautstärkebereichskonfigurationen hosten, die während des Startvorgangs abgefragt werden.

  3. Konfiguration nach Bedarf. Wird angeboten, um den wachsenden Bedarf an bedarfsorientierten Audiofunktionen zu decken, bei denen Benutzer für einen bestimmten Zeitraum eine verbesserte Signalverarbeitung abonnieren. Die neuen Volumenbereichskonfigurationen gelten für die Dauer eines Abonnements.

Design

Die dynamische Lautstärkekonfiguration erfolgt in drei Stufen:

  • Entdeckung. Die AudioControl HAL-Implementierung des Anbieters erkennt neue Aktualisierungen des Lautstärkebereichs über einen benutzerdefinierten IPC-Mechanismus des Anbieters.

    Sobald es erkannt wurde, wird über AudioControl::IModuleChangeCallback ein Rückruf generiert.

  • Aktualisieren. Der Car-Audio-Stack aktualisiert die Lautstärkegruppenzustände mit den neuen Lautstärkebereichen.

    Es werden Anstrengungen unternommen, um nach der Aktualisierung des Lautstärkebereichs den gleichen Lautstärkepegel beizubehalten. Wenn der Index jedoch außerhalb der Grenzen liegt, wird der aktuelle Volumenindex auf einen sicheren Wert gesetzt. Beispielsweise die vom Anbieter während des Rückrufs bereitgestellte Standardstufe.

  • Ruf zurück.

    • Nach Aktualisierungen des Volumengruppenbereichs löst der Car-Audio-Stack einen Rückruf an Apps aus, die über CarVolumeGroupEventCallback registriert wurden.

    • CarVolumeGroupEvent enthält die aktualisierte CarVolumeGroupInfo , den Ereignistyp (was sich geändert hat) und die Zusatzinformation (warum es sich geändert hat).

Bild

Abbildung 1. Dynamische Volume-Konfiguration.

HAL-API

AudioControl @ 3.0 AIDL

Version 3.0 von AudioControl AIDL HAL führt die folgenden APIs ein:

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 Rückruf, um Änderungen an AudioPorts zu benachrichtigen

Reihenfolge

Das Sequenzdiagramm der dynamischen Volume-Konfiguration wird unten angezeigt.

Bild

Abbildung 2. Sequenzdiagramm für die dynamische Volume-Konfiguration.

Schlüsselaspekte

Beachten Sie Folgendes, um diese Funktion zu optimieren.

  • Als Teil des Rückrufs bereitgestellte AudioPorts müssen mit der Automotive-BUS-Definition übereinstimmen:

    • Geräteport. 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 Obermenge von Lautstärkebereichsdefinitionen definieren und den Rückruf verwenden, um ihn für Fahrzeugvarianten anzupassen. Weitere Informationen finden Sie in der AIDL-Definition IModuleChangeCallbac .

  • Wenn mehr als ein Audio-BUS zur gleichen Lautstärkegruppe gehört, muss jeder über identische Lautstärkebereichsdefinitionen verfügen. Geschieht dies nicht, lehnt das Car-Audio-Framework die neue Definition des Lautstärkebereichs ab.