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.
Empfohlenes Ducking-Verhalten
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()
undgetGroupMaxVolume()
, 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:
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.
Laufzeitkonfiguration: Automotive-Audiosysteme unterstützen externe Verstärkerkonfigurationen. Diese ECUs können die Konfigurationen des Lautstärkebereichs hosten, die beim Booten abgefragt werden.
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 zuCarVolumeGroupInfo
, Ereignistyp (was geändert) und zusätzlichen Informationen (Gründe für die Änderung).
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.
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
- Geräteport:
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.