Volume-Verwaltung

Die Volume-Verwaltung ist in CarAudioService enthalten. Es verwendet feste Volumes und erwartet, dass Volumes unterhalb des HAL von einem Hardwareverstärker und nicht von der Software angewendet werden. CarAudioService organisiert Ausgabegeräte in Volume-Gruppen, um dieselben Verbesserungen auf alle Geräte anzuwenden, die einer Volume-Gruppe zugeordnet sind.

Feste Volumes

AAOS-Implementierungen verwenden einen Hardwareverstärker, um die Lautstärke zu regeln, anstelle eines Softwaremixers. Setze das Flag config_useFixedVolume auf true (Overlay bei Bedarf), um Nebenwirkungen zu vermeiden:

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

Wenn das Flag config_useFixedVolume nicht festgelegt oder auf false gesetzt ist, können Anwendungen AudioManager.setStreamVolume() aufrufen, um die Lautstärke nach Streamtyp im Softwaremixer zu ändern. Dies ist möglicherweise nicht immer wünschenswert, da potenzielle Auswirkungen auf andere Anwendungen auftreten und die Lautstärkedämpfung im Softwaremixer dazu führen kann, dass das Signal beim Empfang vom Hardwareverstärker weniger signifikante Bits zur Verfügung stehen kann.

Volume-Gruppen

Volume-Gruppen verwalten die Volumes für eine Sammlung von Geräten in einer Audiozone. Die Lautstärke kann für jede Lautstärkegruppe einzeln gesteuert werden. Die daraus resultierenden Verstärkungen werden auf den zugehörigen Geräten konfiguriert und vom Verstärker des Fahrzeugs angewendet. Lautstärkeeinstellungen werden für den Nutzer beibehalten und geladen, wenn sich der Nutzer anmeldet.

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

Verbesserungen für Volumengruppen konfigurieren

Jede Volume-Gruppe hat Mindest-, Maximal- und Standardverstärkungswerte sowie eine Schrittgröße, die auf Werten basiert, die in audio_policy_configuration.xml für die mit der Volume-Gruppe 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>

Während der Initialisierung prüft die Volume-Gruppe die Verstärkungswerte der zugehörigen Geräte und konfiguriert die Gruppe so:

  • Schrittgröße: Muss für alle Geräte gleich sein, die über die Lautstärkegruppe gesteuert werden.
  • Minimale Steigerung Kleinster Mindestgewinn unter den Geräten in der Gruppe.
  • Maximale Verstärkung: Höchster maximaler Gewinn von allen Geräten in der Gruppe.
  • Standardverstärkung: Höchster Standardgewinn aller Geräte in der Gruppe.

Aufgrund der Konfiguration dieser Werte ist es möglich, die Verstärkung einer Lautstärkegruppe außerhalb des Bereichs festzulegen, der für ein mit der Lautstärkegruppe verknüpftes 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 festgelegt, je nachdem, ob der Wert der Lautstärkegruppe über oder unter dem Bereich liegt.

Volume-Gruppen-IDs

Volume-Gruppen werden zur Laufzeit in der Reihenfolge identifiziert, die in der XML-Datei definiert ist. IDs innerhalb einer Audiozone reichen von 0 bis N-1, wobei N die Anzahl der Volume-Gruppen in dieser Zone ist. So sind die Volume-Gruppen-IDs zonenübergreifend nicht eindeutig. Diese Kennungen werden für CarAudioManager APIs verwendet, die mit Volume-Gruppen verknüpft sind. Jede API, die eine groupId ohne zoneId verwendet, verwendet standardmäßig die primäre Audiozone.

Volume-Verwaltung in mehreren Zonen

Jede Audiozone muss mindestens eine Lautstärkegruppe haben 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 Volume-Gruppen definieren.

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

Ereignisse mit Lautstärketasten verarbeiten

Android definiert mehrere Keycodes zur Lautstärkeregelung, darunter:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Standardmäßig leitet Android die Lautstärke-Schlüsselereignisse an Apps weiter. In Automotive-Implementierungen sollte die Verarbeitung dieser Schlüsselereignisse durch CarAudioService erzwungen werden, das dann gegebenenfalls setGroupVolume oder setMasterMute aufruft. Setzen Sie das Flag config_handleVolumeKeysInWindowManager auf true, um dieses Verhalten zu erzwingen:

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

Für Volume-Schlüsselereignisse kann derzeit nicht unterschieden werden, für welche Zone sie bestimmt sind. Es wird davon ausgegangen, dass sie alle der primären Audiozone zugeordnet sind. Wenn ein Lautstärkeschlüsselereignis empfangen wird, bestimmt CarAudioService, welche Lautstärkegruppe angepasst werden soll. Dazu werden die Audiokontexte für die aktiven Player abgerufen und dann die Lautstärkegruppe angepasst, die das Ausgabegerät enthält, das dem Audiokontext mit der höchsten Priorität zugeordnet ist. Die Priorisierung wird anhand einer festen Reihenfolge bestimmt, die in CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY definiert ist.

Überblenden und ausbalancieren

Beide Versionen des AudioControl HAL enthalten APIs zum Einstellen der Ein- und Ausblendung im Fahrzeug. Die entsprechenden 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 Lautstärke des Lautsprechers in Richtung der rechten (+) oder linken (-) Seite des Autos.

    • 0,0 ist zentriert
    • +1,0 entspricht vollkommen
    • -1,0 ist vollständig links
    • Ein Wert außerhalb des Bereichs von -1 bis 1 ist ein Fehler.
  • setFadeTowardFront(float value) verschiebt die Lautstärke des Lautsprechers in Richtung der Vorder- (+) oder hinteren (-) des Autos.

    • 0,0 ist zentriert
    • +1,0 bedeutet vollständig nach vorn
    • -1,0 ist vollständig 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 Nutzern angezeigt werden. Sie könnten streng auf Medien oder allgemein auf alle Android-Töne angewendet werden. Mit Android 11 wird auch die Anwendung von Audioeffekten auf Ausgabegeräte unterstützt. So ist es möglich, Über- und Ausblendungen 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 eines Streams reduziert, sodass ein anderer gleichzeitig wiedergegebener Stream deutlicher zu hören ist. In AAOS wird Audio-Ducking vom HAL implementiert. Android hat keine Kontrolle über Töne außerhalb des Betriebssystems. In Android 11 ist die wichtigste Information, die dem HAL für Ducking-Entscheidungen zur Verfügung steht, die Frage, ob zwei Ausgabegeräte beide aktive Streams haben oder nicht.

Wann du dich verstecken solltest

Es liegt zwar an dem jeweiligen OEM, wie der Ducking-Vorgang vom HAL gehandhabt wird, wir empfehlen jedoch die folgenden Richtlinien.

  • In Android werden in der Regel mehrere Streams abgespielt, wenn zwei Apps oder Dienste gleichzeitig Audiofokus haben. Wann Android einen gleichzeitigen Fokus gewähren kann, erfährst du in der Interaktionsmatrix unter Beschränkungstypen. Mit der Einführung des Audio-Plug-ins für Autos hängt dies auch von Ihrer Audiofokus-Verwaltung ab.

  • Alle Streams, die von Android vermischt werden, werden vor der Anwendung von Vorteilen durchgeführt. Daher sollte jeder Stream, der bei gleichzeitiger Wiedergabe mit einem anderen Stream per Ducking beendet werden soll, an separate Ausgabegeräte weitergeleitet werden, damit der HAL Ducking vor dem Mischen anwenden kann.

Wir empfehlen, das Ducking der folgenden potenziellen gleichzeitigen Interaktionen vorzunehmen.

Interaktion Aktion
EMERGENCY Alle außer SAFETY werden ausgeblendet oder stummgeschaltet
SAFETY Entpackt alles außer EMERGENCY
NAVIGATION Entpackt alles außer SAFETY und EMERGENCY
CALL Entpackt alles außer SAFETY, EMERGENCY und NAVIGATION
VOICE Enten CALL_RING
VEHICLE_SOUNDS Du legst fest, wie wichtig der aktive Ton ist und ob er sich von anderen Geräuschen ablenken lässt.
MUSIC und ANNOUNCEMENT Von allem verdorben. Ausnahmen sind Töne für die Touchbedienung, die als SYSTEM_SOUND abgespielt werden.

Überlegungen beim Entziehen

Einige Apps und Dienste, z. B. die Navigation oder ein Assistent, verwenden möglicherweise mehrere Spieler, um Aktionen auszuführen. Vermeiden Sie aggressives Entucken, wenn ein Datenstrom durch Ausgabegeräte unterbrochen wird. So stellen Sie sicher, dass die Medien erst wieder auf die volle Lautstärke zurückgekehrt sind, bevor sie vor dem Start der nächsten Wiedergabe aus der Navigation oder einer Assistant-App gestartet werden.

Bei Fahrzeugen mit mehreren Schallphasen und ausreichender Isolation können Sie die Audiodaten an verschiedene Bereiche des Autos weiterleiten, anstatt sich zu verdauen. So können beispielsweise Navigationsanweisungen an die Lautsprecher der Kopfstütze des Fahrers geleitet werden, während die Musik im gesamten Kabinen weiterhin mit normaler Lautstärke abgespielt wird.

Sicherheitskritische Geräusche

Mit Android 11 wurden HAL Audio Focus APIs eingeführt. Der HAL sorgt dafür, dass sicherheitskritische Töne Vorrang vor anderen Tönen haben. Wenn der HAL den Audiofokus für USAGE_EMERGENCY enthält, ist das keine Garantie dafür, dass Apps und Dienste von Android keine Töne abspielen. Der HAL bestimmt, welche Streams von Android gemischt oder stummgeschaltet werden sollen, um sicherheitskritische Töne wiederzugeben.

Benutzeroberfläche für Lautstärkeeinstellungen konfigurieren

AAOS entkoppelt die UI für Volume-Einstellungen von der Konfiguration der Volume-Gruppe. Diese können wie unter Erhöhen der Volumengruppe konfigurieren beschrieben überlagert werden. Dadurch wird sichergestellt, dass bei einer Änderung der Konfiguration von Volume-Gruppen keine Änderungen erforderlich sind.

In der Benutzeroberfläche der Autoeinstellungen enthält packages/apps/Car/Settings/res/xml/car_volume_items.xml die UI-Elemente (Titel- und Symbolressourcen), die mit jeder definierten AudioAttributes.USAGE verknüpft sind. Diese Datei sorgt für ein angemessenes Rendering der definierten VolumeGroups. Dazu werden Ressourcen verwendet, die der ersten erkannten Nutzung in den einzelnen VolumeGroup zugeordnet sind.

Im folgenden Beispiel wird ein VolumeGroup so definiert, dass voice_communication und voice_communication_signalling enthalten sind. Bei der Standardimplementierung der UI für Autoeinstellungen wird VolumeGroup mithilfe der Ressourcen gerendert, die mit voice_communication verknüpft sind, da dies die erste Matc 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(), um zu erfahren, wie viele Steuerelemente gezeichnet werden sollen.
  • getGroupMinVolume() und getGroupMaxVolume(), um die Unter- und Obergrenze zu erhalten.
  • getGroupVolume(), um die aktuelle Lautstärke abzurufen.
  • registerVolumeChangeObserver(), um über Änderungen der Lautstärke informiert zu werden.

Ereignis für Autovolumengruppe

Anwendungsfälle der Automobilbranche der Ein/Aus-Schaltfläche für die Lautstärkeaktualisierung und die Stummschaltung sind kontextabhängig und können die Aktionen bestimmter Apps definieren, z. B. die Lautstärkeeinstellungen. Die aktuelle Lautstärke und Stummschaltung des Callbacks vom Auto-Audio-Stack liefern begrenzte Kontextinformationen. „CarVolumeGroupEvent“ wird zu Android 14 hinzugefügt, um Anwendungsfälle im Automobilbereich und zukünftige Skalierbarkeit besser zu unterstützen. Jedes Ereignis enthält drei wichtige Arten von Informationen:

  • Liste mit CarVolumeGroupInfo
  • EventTypes (Bitzuordnung)
  • Liste mit ExtraInfos

AutoVolumengruppeninfo

Der Empfänger des Ereignis-Callbacks hat sofort Zugriff auf die Liste der Informationen zu den betroffenen Volumengruppen. Das bedeutet, dass die App keine zusätzlichen Aufrufe an das Auto-Audio-Framework senden muss, um den neuesten Status zu erhalten. Er kann einfach das empfangene CarVolumeGroupInfos verwenden, um die UI oder interne Status zu aktualisieren. Zur Vereinfachung von Apps werden die Aspekte, die sich in einer Autovolumengruppe geändert haben, auch als Teil von EventTypes bereitgestellt, wie unten erläutert.

Ereignistypen

Definiert, welcher Aspekt von CarVolumeGroupInfo geändert wurde. Anwendungen können damit Änderungen identifizieren und die erforderlichen Aktionen ausführen. EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED gibt beispielsweise an, dass sich der entsprechende CarVolumeGroups-Index für die Verstärkung des maximalen Volumens geändert hat und der Wert von CarVolumeGroupInfo.getMaxVolumeGainIndex() abgefragt werden kann.

Die folgende Tabelle zeigt die Beziehung zwischen EventType und CarVolumeGroupInfo.

Ereignistyp AutoVolumengruppeninfo
EVENT_TYPE_VOLUME_GAIN_INDEX_GEÄNDERT CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_GEÄNDERT CarVolumeGroupInfo.getMinVolumeGainIndex().
EVENT_TYPE_VOLUME_MAX_INDEX_GEÄNDERT CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocking()
VERANSTALTUNGSTYP_ATTENUATION_GEÄNDERT CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_GEÄNDERT CarVolumeGroupInfo.getAudioAttributes()

Zusätzliche Informationen

Liefert zusätzliche Informationen darüber, warum sich CarVolumeGroup geändert hat. Anhand dieser Informationen können Anwendungen zusätzlichen Kontext liefern, um den Nutzer entweder zum Handeln oder zur Benachrichtigung aufzufordern. Beispiel: EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL zeigt eine aktive vorübergehende Absenkung aufgrund einer thermischen Überlastung an. Die App kann den Nutzer informieren, wenn er versucht, die Lautstärke zu erhöhen.

Wir setzen keine Vorgehensweise für ExtraInfos durch. 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, kannst du auch die Benutzeroberfläche der Lautstärkeleiste anfangs ausblenden, um zu verhindern, dass der Nutzer die Lautstärke ändert. Andere können einen Toast anzeigen, der das Ducking aktiviert hat, und dem Nutzer die Möglichkeit geben, die Lautstärke zu ändern.

Das Audio-Framework des Autos erfordert, dass das AudioControl-HAL-IAudioGainCallback die vorgeschlagene ExtraInfos bereitstellt. Weitere Informationen finden Sie unter Callback für Audio-Gewinnung.

CarVolumeGroupEvent lässt sich skalieren, um zukünftige Anforderungen des Audio-Frameworks von Autos zu erfüllen. Neue Funktionen sollen nur über CarVolumeGroupEvent unterstützt werden. App-Entwicklern wird dringend empfohlen, CarVolumeGroupEvent zu verwenden, um die Gruppenlautstärke anzupassen und Änderungen stummzuschalten.

Rückruf für Auto-Lautstärkegruppen-Ereignis

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

  • Verwende CarAudioManager#registerCarVolumeGroupEventCallback(), um dich für den Callback zu registrieren.

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

Wenn sich eine Anwendung mit dem neuen CarVolumeGroupEventCallback und dem alten CarVolumeCallback registriert, hat das Ereignis CarVolumeGroupEventCallbacks Vorrang. Der Audio-Stack des Autos löst CarVolumeCallback nicht mehr aus. Dadurch wird verhindert, dass für dasselbe Ereignis doppelte Trigger in derselben App ausgelöst werden.

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

Callback für Audioverstärkung

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

HAL API

AudioControl @2.0 AIDL

In Version 2.0 von AudioControl AIDL HAL wird die folgende API hinzugefügt:

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

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

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

Die Gründe können grob kategorisiert werden als:

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

Einschränkungstypen

Ab AudioControl HAL AIDL V3 werden folgende 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 vom Nutzer ausgelöste Stummschaltung
Stummschalten ❌ Vorstellung ❌ (Stummschaltung aufheben)

✔ (Stummschalten)
Blockierungen ❌ Vorstellung
Einschränkung ❌ (über Limit)

✔ (unter dem Limit)
Dämpfung

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

Einschränkungen beim Stummschalten

Für das Stummschalten gelten folgende Einschränkungen:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Das Audio-Framework des Autos behält intern diese beiden Stummschaltungsstatus bei:

  • Nutzer ignorieren: Wird basierend auf der Anfrage des Nutzers über CarAudioManager oder Schlüsselereignisse umgeschaltet.

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

Bei Hörern wie der App „Einstellungen“ hängt der Status der Stummschaltung (CarVolumeGroupInfo.isMuted()) für die Lautstärkegruppe 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 von Gruppen für die Dauer der Einschränkung ignoriert.

Interaktionsfall: HAL-Stummschaltung ist aktiv und Nutzeranfragen zur Stummschaltung

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

  • Stummschaltung der Lautstärkegruppe insgesamt zu „true“ geändert.
  • Anfragen vom Nutzer zur Aktivierung der Stummschaltung werden verarbeitet.
    • Grund: Anfragen zur Stummschaltung von Nutzern sollten immer berücksichtigt werden, um die Privatsphäre der Nutzer zu schützen.

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

  • Stummschaltung der Lautstärkegruppe insgesamt zu „true“ geändert.

  • Anfragen vom Nutzer zur Deaktivierung der Stummschaltung werden NOT verarbeitet. Der Stummschaltungsstatus für im Cache gespeicherte Nutzer bleibt aktiviert.

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

    • Ursache: Wenn die Stummschaltung von im Cache gespeicherten Nutzern aufgehoben wird, kann dies zu einer unbeabsichtigten Geräuschexplosion führen und die Nutzersicherheit gefährden. Dies gilt insbesondere, wenn die Stummschaltung über mehrere Zündungszyklen hinweg aktiviert ist, wodurch die Wahrnehmung des Schallpegels durch den Nutzer verringert wird.

Interaktionsfall: HAL-Stummschaltung aktiviert und deaktiviert, solange die Nutzerstummschaltung nicht geändert wurde

Durch Umschalten der HAL-Stummschaltung wird der Status der Stummschaltung der Lautstärkegruppe insgesamt geändert. Der Stummschaltungsstatus des Nutzers wird jedoch nicht direkt aktualisiert. Wenn die Nutzerstummschaltung deaktiviert ist und ein HAL-Rückruf zur Aktivierung der Stummschaltung eingeht:

  • Stummschaltung der Lautstärkegruppe insgesamt zu „true“ geändert.
  • Anfragen vom Nutzer zum Ändern der Lautstärke werden NOT verarbeitet, während die HAL-Stummschaltung aktiviert ist.

    • Ursache: Der Nutzer kann den Ton nicht wahrnehmen, wenn die Stummschaltung aktiviert ist. Wenn Sie die Lautstärke ändern, kann dies zu einer Geräuschexplosion führen und die Sicherheit des Nutzers gefährden.

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

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

  • Stummschaltung der Lautstärkegruppe wird zu „false“ geändert.

    Grund: Wenn Sie die Stummschaltung dauerhaft festlegen und den Nutzer auffordern, die Stummschaltung aufzuheben, kann dies zu einer unnötigen Unterbrechung des Nutzers führen, wenn die Stummschaltung häufig gewechselt wird.

  • Anfragen von Nutzern zur Änderung des Volumens werden normal verarbeitet.

Blockierungen

Folgende Einschränkungen gelten für die Blockierung:

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

Wenn Blockierungseinschränkungen aktiv sind, werden Anfragen von Nutzern an Folgendes gesendet:

  • Änderungsvolumen werden nicht verarbeitet.
  • Die Ein/Aus-Schaltfläche wurde stummgeschaltet.

Einschränkung

Es gelten die folgenden Einschränkungen:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Wenn die Beschränkungsbeschränkungen aktiv sind, werden Anfragen von Nutzern an Folgendes gesendet:

  • Lautstärke ändern:

    • Innerhalb der Begrenzung werden verarbeitet
    • Über dem Limit überschrittene Einschränkungen werden nicht verarbeitet.
  • Die Ein/Aus-Schaltfläche wurde stummgeschaltet.

Dämpfung

Mögliche Einschränkungen für die Dämpfung:

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

Wenn Einschränkungen der Dämpfung aktiv sind, werden Anfragen von Nutzern an Folgendes gesendet:

  • Die Änderung der Lautstärke wird verarbeitet. Die neue aktuelle Lautstärke wird auf die abgeschwächte Lautstärke statt auf die vorherige Lautstärke eingestellt. Auf dieser Stufe werden zukünftige Volumenänderungen vorgenommen.

  • Die Ein/Aus-Schaltfläche wurde stummgeschaltet.

Auf Index aktualisieren

Folgendes gilt als asynchrone Volumenindexaktualisierung: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

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

Beispiele

Anwendungsfall: Der Nutzer aktualisiert den Lautstärkeindex auf 30

  • Der Nutzer verwendet die Lautstärke-App, um den Lautstärkeindex auf 30 zu ändern.

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

  • Anbieterimplementierungen von Audio HAL empfangen die neue Lautstärkeerhöhung und aktualisieren das Audiosystem (z. B. ein externer Verstärker).

  • Das Audiosystem reagiert, 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 Auto-Audiodienst verwendet den neuen Index des Rückrufs, der für Persistenz und Rückrufe an die Lautstärke-App verwendet wird. Der vom Nutzer angeforderte Index ist 30. Das asynchrone Feedback des Audiosystems aktualisiert den Index jedoch auf 15.

Anwendungsfall: Erste Audiowiedergabe nach Beenden des Ruhemodus

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

  • Android gerät in den Ruhemodus.

  • Sobald Android gesperrt ist (z. B. fortsetzen):

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

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

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Der Auto-Audiodienst verwendet den neuen Index des Callbacks, der für die Persistenz verwendet wird, und seine eigenen Callbacks an die Volume-App, die den Index synchronisiert. Der Volume-Index vor dem Sperren beträgt 95. Nach dem Fortsetzen wird dieser Index jedoch vom AudioControl HAL-Implementierer auf eine sichere Lautstärke von 30 gesetzt.

Konfiguration des dynamischen Volumes

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

  1. Konfiguration des Fahrzeugendes (Vehicle End of Line, EOL).

    • Die Autohersteller aktualisieren die Lautstärkekonfigurationen am Ende der Lebensdauer am liebsten basierend auf der Konfiguration des Fahrzeug-Audiosystems. In der Regel ist dies ein Sideload, bei dem das Android-Software-Image nicht aktualisiert wird.

    • Autohersteller müssen möglicherweise die Volume-Konfiguration während eines Dienstzeitplans aktualisieren.

  2. Laufzeitkonfiguration: Automotive-Audiosysteme unterstützen externe Verstärkerkonfigurationen. Diese ECUs können die Konfigurationen des Lautstärkebereichs hosten, die beim Booten abgefragt werden.

  3. On-Demand-Konfiguration: Bietet die Möglichkeit, den wachsenden Bedarf an bedarfsbasierten Audiofunktionen zu decken, bei denen Nutzer für einen bestimmten Zeitraum die verbesserte Signalverarbeitung abonnieren. Die neuen Konfigurationen für den Volumenbereich gelten für die Dauer eines Abos.

Design

Die Konfiguration des dynamischen Volumes erfolgt in drei Phasen:

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

    Nach der Erkennung wird ein Callback über AudioControl::IModuleChangeCallback generiert.

  • Aktualisieren Der Audio-Stack des Autos aktualisiert die Status der Lautstärkegruppen mit den neuen Lautstärkebereichen.

    Es wird versucht, nach der Aktualisierung des Volumenbereichs das gleiche Volumen beizubehalten. Wenn der Index jedoch außerhalb des gültigen Bereichs liegt, wird der aktuelle Volumenindex auf einen sicheren Wert gesetzt. Zum Beispiel die Standardstufe, die der Anbieter während des Rückrufs angegeben hat.

  • Callback:

    • Nach der Aktualisierung des Lautstärkegruppenbereichs löst der Auto-Audiostack einen Callback an Apps aus, die über CarVolumeGroupEventCallback registriert wurden.

    • CarVolumeGroupEvent enthält die aktualisierten Angaben zu CarVolumeGroupInfo, Ereignistyp (was geändert) und zusätzlichen Informationen (Gründe für die Änderung).

Bild

Abbildung 1: Konfiguration des dynamischen Volumes.

HAL API

AudioControl @ 3.0 AIDL

In Version 3.0 von AudioControl AIDL HAL wurden 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 dem AudioControl HAL festgelegt wurde.
IModuleChangeCallback#onAudioPortsChanged Rückruf zur Benachrichtigung über Änderungen an AudioPorts

Reihenfolge zuordnen

Das Sequenzdiagramm der Konfiguration von dynamischen Volumes wird unten angezeigt.

Bild

Abbildung 2: Sequenzdiagramm für die Konfiguration dynamischer Volumes.

Wichtige Aspekte

Berücksichtigen Sie bei der Optimierung dieser Funktion Folgendes:

  • AudioPorts, die als Teil des Callbacks angegeben werden, müssen mit der Automotive BUS-Definition übereinstimmen:

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

  • Gehört mehr als ein Audio-BUS zur selben Lautstärkegruppe, muss jeder davon identische Lautstärkebereichsdefinitionen haben. Andernfalls wird die neue Definition des Lautstärkebereichs vom Audio-Framework des Autos abgelehnt.