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.
Empfohlenes Ducking-Verhalten
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()
undgetGroupMaxVolume()
, 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:
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.
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.
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 aktualisierteCarVolumeGroupInfo
, den Ereignistyp (was sich geändert hat) und die Zusatzinformation (warum es sich geändert hat).
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.
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
- Geräteport.
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.