Die Lautstärkeregelung ist in CarAudioService
enthalten. Dabei werden feste Lautstärken verwendet, wobei davon ausgegangen wird, dass die Lautstärken unterhalb der HAL von einem Hardwareverstärker und nicht in der Software angewendet werden. CarAudioService
ordnet Ausgabegeräte in Gruppen an, um dieselben Verstärkungen auf alle Geräte anzuwenden, die mit einer Gruppe verknüpft sind.
Feste Volumes
Bei AAOS-Implementierungen wird zur Lautstärkeregelung ein Hardwareverstärker anstelle eines Software-Mixers verwendet. Um Nebenwirkungen zu vermeiden, setzen Sie das Flag config_useFixedVolume
auf true
(Overlay nach Bedarf):
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
Wenn das Flag config_useFixedVolume
nicht gesetzt ist (oder auf false
gesetzt ist), können Apps AudioManager.setStreamVolume()
aufrufen, um die Lautstärke im Software-Mixer nach Streamtyp zu ändern. Dies ist aufgrund möglicher Auswirkungen auf andere Apps und der Tatsache, dass die Lautstärkedämpfung im Software-Mixer zu weniger signifikanten Bits im Signal führen kann, wenn es vom Hardwareverstärker empfangen wird, möglicherweise nicht immer wünschenswert.
Volumegruppen
Mit Lautstärkegruppen wird die Lautstärke für eine Gruppe von Geräten in einer Audiozone verwaltet. Die Lautstärke kann für jede Lautstärkegruppe unabhängig geregelt werden. Die daraus resultierenden Verstärkungen werden auf den zugehörigen Geräten konfiguriert, um vom Verstärker des Fahrzeugs angewendet zu werden. Die Lautstärkeeinstellungen werden für den Nutzer gespeichert und geladen, wenn er sich anmeldet.
Volumegruppen definieren
CarAudioService verwendet in car_audio_configuration.xml
definierte Lautstärkegruppen:
<audioZoneConfiguration version="2.0">
<zones>
<zone name="primary zone" isPrimary="true">
<volumeGroups>
<group>
<device address="bus0_media_out">
<context context="music"/>
</device>
</group>
<group>
<device address="bus1_navigation_out">
<context context="navigation"/>
</device>
<device address="bus2_voice_command_out">
<context context="voice_command"/>
</device>
</group>
...
</volumeGroups>
</zone>
</zones>
</audioZoneConfiguration>
Jede Volumegruppe sollte mindestens ein Ausgabegerät mit zugehörigen Adressen enthalten. Die Adressen müssen den in audio_policy_configuration.xml
definierten Ausgabegeräten entsprechen.
Gewinne für Volumegruppen konfigurieren
Jede Volumegruppe hat Mindest-, Maximal- und Standardverstärkungswerte sowie eine Schrittweite, die auf den in audio_policy_configuration.xml
für die mit der Volumegruppe verknüpften Geräte konfigurierten Werten basiert.
<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
<gains>
<gain name="" mode="AUDIO_GAIN_MODE_JOINT"
minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
</gains>
</devicePort>
Während der Initialisierung prüft die Volumegruppe die Verstärkungswerte der zugehörigen Geräte und konfiguriert die Gruppe so:
- Schrittgröße Muss für alle Geräte, die von der Lautstärkegruppe gesteuert werden, gleich sein.
- Mindestgewinn Niedrigster Mindestgewinn unter den Geräten in der Gruppe.
- Maximaler Gewinn Der höchste maximale Gewinn unter den Geräten in der Gruppe.
- Standardverstärkung: Der höchste Standardgewinn unter den Geräten in der Gruppe.
Aufgrund der Konfiguration dieser Werte kann die Verstärkung einer Lautstärkegruppe außerhalb des für ein mit der Lautstärkegruppe verknüpftes Gerät unterstützten Bereichs liegen. In diesem Fall wird für das Gerät die Verstärkung auf den Mindest- oder Maximalwert des Geräts festgelegt, je nachdem, ob der Wert der Lautstärkegruppe unter oder über dem Bereich liegt.
Volume-Gruppen-IDs
Volumegruppen werden zur Laufzeit in der in der XML-Datei definierten Reihenfolge identifiziert.
IDs innerhalb einer Audiozone haben die Werte 0
bis N-1
, wobei N
die Anzahl der Lautstärkegruppen in dieser Zone ist. Daher sind Volumegruppen-IDs nicht zonenübergreifend eindeutig. Diese Kennungen werden für CarAudioManager
APIs verwendet, die mit Volumegruppen verknüpft sind. Bei jeder API, die eine groupId
ohne zoneId
akzeptiert, wird standardmäßig die primäre Audiozone verwendet.
Volumeverwaltung für mehrere Zonen
Jede Audiozone sollte eine oder mehrere Lautstärkegruppen haben. Jede Lautstärkegruppe ist nur einer einzigen Audiozone zugeordnet. Diese Beziehung wird als Teil von car_audio_configuration.xml
definiert. Weitere Informationen finden Sie im Beispiel oben unter Volumegruppen definieren.
Die aktuellen Lautstärkepegel für jede Zone werden für den Nutzer gespeichert, der mit dieser Zone verknüpft ist. Diese Einstellungen sind zonenabhängig. Wenn sich ein Nutzer auf einem Display anmeldet, das mit der primären Zone verknüpft ist, und sich später in einer Zone anmeldet, die mit einer sekundären Audiozone verknüpft ist, unterscheiden sich die Lautstärkepegel, die für die erste Zone geladen und beibehalten werden, von denen für die sekundäre Zone.
Ereignisse für Lautstärketasten verarbeiten
Android definiert mehrere Tastencodes für die Lautstärkeregelung, darunter:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
Standardmäßig leitet Android die Ereignisse der Lautstärketasten an Apps weiter. Bei Implementierungen für die Automobilbranche sollten diese Schlüsselereignisse von CarAudioService
verarbeitet werden, das dann je nach Bedarf setGroupVolume
oder setMasterMute
aufruft. Wenn Sie dieses Verhalten erzwingen möchten, setzen Sie das Flag config_handleVolumeKeysInWindowManager
auf true
:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
Bei Lautstärke-Schlüsselereignissen kann derzeit nicht unterschieden werden, für welche Zone sie bestimmt sind. Es wird davon ausgegangen, dass sie alle mit der primären Audiozone verknüpft sind. Wenn ein Ereignis mit einer Lautstärketaste empfangen wird, ermittelt CarAudioService
, welche Lautstärkegruppe angepasst werden soll. Dazu werden die Audiokontexte für die aktiven Player abgerufen und dann die Lautstärkegruppe angepasst, die das Ausgabegerät mit dem Audiokontext mit der höchsten Priorität enthält. Die Priorisierung wird anhand einer festen Reihenfolge bestimmt, die in CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
definiert ist.
Ein- und Ausblenden sowie Ausbalancieren
Beide Versionen der AudioControl HAL enthalten APIs zum Einstellen von Fading und Balance im Fahrzeug. Entsprechende System-APIs für CarAudioManager übergeben Werte an die AudioControl HAL. Für diese APIs ist android.car.permission.CAR_CONTROL_AUDIO_VOLUME
erforderlich. Die AudioControl APIs sind:
Mit
setBalanceTowardRight(float value)
wird die Lautsprecherlautstärke auf die rechte (+) oder linke (-) Seite des Fahrzeugs verschoben.- 0,0 ist zentriert
- +1,0 ist vollständig richtig
- -1,0 bedeutet „vollständig links“.
- Ein Wert außerhalb des Bereichs von -1 bis 1 ist ein Fehler.
setFadeTowardFront(float value)
verschiebt die Lautsprecherlautstärke in Richtung der Vorder- (+) oder Rückseite (-) des Autos.- 0,0 ist zentriert
- +1,0 ist vollständig nach vorne
- -1.0 ist vollständig nach hinten
- Ein Wert außerhalb des Bereichs von -1 bis 1 ist ein Fehler.
Sie legen fest, wie diese Werte angewendet und wie sie Nutzern angezeigt werden sollen. Sie können nur auf Medien oder allgemein auf alle Android-Töne angewendet werden. Mit Android 11 wurde außerdem die Unterstützung für die Anwendung von Audioeffekten auf Ausgabegeräte eingeführt. So ist es möglich, das Ein- und Ausblenden und die Balance stattdessen über Audioeffekte auf den entsprechenden Ausgabegeräten und nicht über diese APIs zu verwalten.
Audio-Ducking
Beim Audio-Ducking wird die Verstärkung für einen Stream reduziert, damit ein anderer Stream, der gleichzeitig wiedergegeben wird, besser zu hören ist. In AAOS wird die Audioducking-Funktion vom HAL implementiert. Android hat keine Kontrolle über Töne, die nicht vom Betriebssystem stammen. In Android 11 sind die wichtigsten Informationen, die der HAL für die Entscheidung zur Stummschaltung zur Verfügung stehen, ob zwei Ausgabegeräte aktive Streams haben oder nicht.
Wann Sie sich ducken sollten
Es liegt im Ermessen des jeweiligen OEM, wie die Stummschaltung von Audioinhalten durch die HAL verarbeitet wird. Wir empfehlen jedoch die folgenden Richtlinien.
Wenn auf Android-Geräten mehrere Streams gleichzeitig wiedergegeben werden, liegt das häufig daran, dass zwei Apps oder Dienste gleichzeitig den Audiofokus haben. Informationen dazu, wann Android den gleichzeitigen Fokus gewähren kann, finden Sie in der Interaktionsmatrix unter Einschränkungstypen. Mit der Einführung des Audio-Plug-ins für Autos hängt dies auch von der AudioFocus-Verwaltung ab.
Streams, die von Android zusammengeführt werden, werden vor der Anwendung von Gewinnen zusammengeführt. Daher sollten alle Streams, die bei gleichzeitiger Wiedergabe leiser gestellt werden sollen, an separate Ausgabegeräte weitergeleitet werden, damit die HAL die Ducking-Funktion vor dem Mischen anwenden kann.
Empfohlenes Verhalten beim Ducking
In den folgenden Fällen wird empfohlen, die Audiowiedergabe bei gleichzeitigen Interaktionen auszublenden.
Interaktion | Aktion |
---|---|
EMERGENCY
| Alles außer SAFETY wird stummgeschaltet oder leiser gestellt
|
SAFETY |
Alle Töne außer EMERGENCY werden stummgeschaltet |
NAVIGATION |
Unterdrückt alles außer SAFETY und EMERGENCY |
CALL |
Unterdrückt alles außer SAFETY , EMERGENCY und NAVIGATION |
VOICE |
Enten CALL_RING |
VEHICLE_SOUNDS |
Sie legen fest, wie wichtig der aktive Ton ist und ob er andere Töne unterdrückt. |
MUSIC und ANNOUNCEMENT |
Er hat alles abgewehrt. Eine Ausnahme bilden Töne für Touch-Interaktionen, die als SYSTEM_SOUND wiedergegeben werden.
|
Hinweise zum Ducking
Einige Apps und Dienste wie Navigation oder ein Assistent verwenden möglicherweise mehrere Player, um Aktionen auszuführen. Vermeiden Sie ein zu schnelles Aufheben der Stummschaltung, wenn ein Datenstream nicht mehr über die Ausgabegeräte übertragen wird. So wird verhindert, dass die Medien wieder auf die volle Lautstärke zurückgesetzt werden, bevor sie vor Beginn der nächsten Wiedergabe über die Navigation oder eine Assistant-App stummgeschaltet werden.
Bei Fahrzeugen mit mehreren Lautsprechern, die ausreichend voneinander isoliert sind, können Sie Audioinhalte an verschiedene Bereiche des Fahrzeugs weiterleiten, anstatt sie auszublenden. So können beispielsweise Navigationsanweisungen an die Lautsprecher in der Kopfstütze des Fahrers geleitet werden, während in der Kabine weiterhin Musik mit normaler Lautstärke abgespielt wird.
Für die Sicherheit wichtige Töne
Mit Android 11 wurden HAL-Audiofokus-APIs eingeführt. Der HAL sorgt dafür, dass sicherheitsrelevante Töne gegenüber anderen Tönen priorisiert werden. Wenn die HAL den Audiofokus für USAGE_EMERGENCY
beibehält, ist nicht garantiert, dass Apps und Dienste von Android keine Töne abspielen. Die HAL bestimmt, welche Streams von Android gemischt oder stummgeschaltet werden sollen, um sicherheitskritische Töne abzuspielen.
Benutzeroberfläche für die Lautstärkeeinstellungen konfigurieren
Bei AAOS ist die Benutzeroberfläche für die Lautstärkeeinstellungen von der Konfiguration der Lautstärkegruppe getrennt. Diese können wie unter Gewinne für die Gruppen von Lautstärken konfigurieren beschrieben überlagert werden. Durch diese Trennung sind keine Änderungen erforderlich, wenn sich die Konfiguration der Volumegruppen ändert.
In der Benutzeroberfläche der Fahrzeugeinstellungen enthält packages/apps/Car/Settings/res/xml/car_volume_items.xml
die UI-Elemente (Titel- und Symbolressourcen), die den einzelnen definierten AudioAttributes.USAGE
zugeordnet sind. Diese Datei ermöglicht ein angemessenes Rendern der definierten VolumeGroups
, indem Ressourcen verwendet werden, die mit der ersten erkannten Verwendung in jedem VolumeGroup
verknüpft sind.
Im folgenden Beispiel wird beispielsweise ein VolumeGroup
als einschließlich voice_communication
und voice_communication_signalling
definiert. Bei der Standardimplementierung der Benutzeroberfläche für die Autoeinstellungen wird VolumeGroup
mit den mit voice_communication
verknüpften Ressourcen gerendert, da dies der erste Match in der Datei ist.
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
<item car:usage="voice_communication"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="voice_communication_signalling"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="media"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="game"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="alarm"
car:title="@*android:string/volume_alarm"
car:icon="@*android:drawable/ic_audio_alarm"/>
<item car:usage="assistance_navigation_guidance"
car:title="@string/navi_volume_title"
car:icon="@drawable/ic_audio_navi"/>
<item car:usage="notification_ringtone"
car:title="@*android:string/volume_ringtone"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistant"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="notification"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_request"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_instant"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_delayed"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_event"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_accessibility"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_sonification"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="unknown"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>
Die in der obigen Konfiguration verwendeten Attribute und Werte werden in packages/apps/Car/Settings/res/values/attrs.xml
deklariert. Für die Benutzeroberfläche der Lautstärkeeinstellungen werden die folgenden VolumeGroup
-basierten CarAudioManager APIs verwendet:
getVolumeGroupCount()
, um zu erfahren, wie viele Steuerelemente gezeichnet werden sollen.getGroupMinVolume()
undgetGroupMaxVolume()
, um untere und obere Grenzwerte zu erhalten.getGroupVolume()
, um die aktuelle Lautstärke abzurufen.registerVolumeChangeObserver()
, um über Lautstärkeänderungen benachrichtigt zu werden.
Ereignis „Autovolumengruppe“
Anwendungsfälle für die Lautstärkeregelung und die Stummschaltung im Auto haben einen kontextbezogenen Hintergrund, der die Aktionen bestimmter Apps wie die Lautstärkeeinstellungen definieren kann. Der Rückruf für die aktuelle Lautstärke und Stummschaltung vom Audiostack des Autos bietet nur begrenzte Kontextinformationen. Um die Anwendungsfälle für die Automobilbranche besser zu unterstützen und die Skalierbarkeit in Zukunft zu verbessern, wurde Android 14 das Ereignis „CarVolumeGroupEvent“ hinzugefügt. Jedes Ereignis enthält drei wichtige Arten von Informationen:
- Liste von
CarVolumeGroupInfo
EventTypes
(Bit-Mapped)- Liste von
ExtraInfos
CarVolumeGroupInfo
Der Empfänger des Ereignis-Callbacks hat direkten Zugriff auf die Liste der betroffenen Informationen zur Fahrzeugvolumengruppe. Das bedeutet, dass die App keine zusätzlichen Aufrufe an das Car Audio Framework ausführen muss, um den aktuellen Status abzurufen. Es kann einfach die empfangene CarVolumeGroupInfos
verwenden, um die Benutzeroberfläche oder internen Status zu aktualisieren. Für Apps werden die Aspekte, die sich in einer Autolautstärkegruppe geändert haben, wie unten erläutert, auch als Teil von EventTypes
bereitgestellt.
EventTypes
Hier wird definiert, welcher Aspekt von CarVolumeGroupInfo
sich geändert hat. Apps können dies nutzen, um Änderungen zu erkennen und die erforderlichen Maßnahmen zu ergreifen. Beispiel: EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
gibt an, dass sich der entsprechende Index für den maximalen Volumengewinn von CarVolumeGroups
geändert hat und über CarVolumeGroupInfo.getMaxVolumeGainIndex()
abgefragt werden kann.
Die folgende Tabelle zeigt die Beziehung zwischen EventType
und CarVolumeGroupInfo
.
EventType | CarVolumeGroupInfo |
---|---|
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED | CarVolumeGroupInfo.getVolumeGainIndex() |
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED | CarVolumeGroupInfo.getMinVolumeGainIndex() |
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED | CarVolumeGroupInfo.getMaxVolumeGainIndex() |
EVENT_TYPE_MUTE_CHANGED | CarVolumeGroupInfo.isMuted() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED | CarVolumeGroupInfo.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED | CarVolumeGroupInfo.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED | CarVolumeGroupInfo.getAudioAttributes() |
ExtraInfos
Hier finden Sie weitere Informationen dazu, warum sich die CarVolumeGroup
geändert hat. Apps können diese Informationen verwenden, um zusätzlichen Kontext bereitzustellen, um den Nutzer zu einer Aktion aufzufordern oder ihn zu benachrichtigen. EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
steht beispielsweise für eine aktive transiente Dämpfung aufgrund einer thermischen Überlastung. Die App kann den Nutzer informieren, wenn er versucht, die Lautstärke zu erhöhen.
Wir erzwingen keinen Prozess für ExtraInfos
. Die Entscheidung, wie Sie vorgehen, liegt in Ihrem Ermessen.ExtraInfos
Wenn die Dämpfung beispielsweise aufgrund von EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
aktiv ist, können Sie die Lautstärkeleiste auch zuerst ausblenden, um zu verhindern, dass der Nutzer die Lautstärke ändert.
Andere können ein Toast-Fenster anzeigen, dass die Stummschaltung aktiv ist, und dem Nutzer die Möglichkeit geben, die Lautstärke zu ändern.
Das Car Audio Framework hängt von der AudioControl HAL IAudioGainCallback
ab, um die vorgeschlagene ExtraInfos
bereitzustellen. Weitere Informationen finden Sie unter Audio Gain Callback.
CarVolumeGroupEvent
kann skaliert werden, um den zukünftigen Anforderungen des Audioframeworks für Autos gerecht zu werden. Neue Funktionen werden nur über CarVolumeGroupEvent
unterstützt. Wir empfehlen App-Entwicklern dringend, CarVolumeGroupEvent
für die Lautstärkeregelung und Stummschaltung von Gruppen zu verwenden.
Rückruf für Ereignis „Autolautstärkegruppe“
Android 14 bietet einen neuen Rückruf für privilegierte und Plattform-Apps, um sich für CarVolumeGroupEvents
zu registrieren und benachrichtigt zu werden.
Verwenden Sie
CarAudioManager#registerCarVolumeGroupEventCallback()
, um sich für den Rückruf zu registrieren.Verwenden Sie
CarAudioManager#unregisterCarVolumeGroupEventCallback()
, um die Registrierung des Callbacks aufzuheben.
Wenn eine App mit der neuen CarVolumeGroupEventCallback
und der alten CarVolumeCallback
registriert ist, wird das Ereignis CarVolumeGroupEventCallbacks
priorisiert.
Der Audiostack des Autos löst CarVolumeCallback
nicht mehr aus. So wird verhindert, dass für dieselbe App und dasselbe Ereignis doppelte Trigger erstellt werden.
Wir empfehlen dringend, CarVolumeGroupEventCallback
zum Verwalten der Lautstärke von Gruppen und zum Stummschalten zu verwenden.
Rückruf für Audioverstärkung
Seit Android 13 kann die AudioControl HAL einen asynchronen Rückruf auslösen, um Aktualisierungen der Lautstärke aufgrund von Änderungen am Audiosystem des Autos zu verwalten.
HAL API
AudioControl @2.0 AIDL
Version 2.0 der AudioControl AIDL HAL fügt die folgende API hinzu:
API | Zweck |
---|---|
IAudioControl#registerGainCallback |
Registriert eine Instanz von IAudioGainCallback bei der AudioControl HAL. |
IAudioGainCallback#onAudioDeviceGainsChanged |
Asynchronous callback to notify changes to audio gain config. |
Der AudioControl HAL-Callback enthält Listen mit Gründen und die jeweilige AudioGainConfigInfo
, die Folgendes enthält:
- Zonen-ID
- Geräteportadresse
- „Volume index > index“ kann entweder ein eingeschränkter Index oder ein Aktualisierungsindex sein.
Die Gründe lassen sich grob in folgende Kategorien unterteilen:
- Gründe für die Einschränkung Vorübergehende Änderung am Verhalten der Lautstärke und des Stummschaltens.
- Gründe für die Aktualisierung Dauerhafte Änderung des Lautstärkeverhaltens.
Arten von Einschränkungen
Seit dem AudioControl
. HAL AIDL
. V3
werden die folgenden Arten von Einschränkungen unterstützt:
- Stummschalten
- Blockierungen
- Einschränkung
- Dämpfung
Aktive Einschränkung | Vom Nutzer ausgelöste Lautstärkeänderung | Ein/Aus-Schaltfläche für die vom Nutzer ausgelöste Stummschaltung |
---|---|---|
Stummschalten | ❌ | ❌ (Stummschaltung aufheben) ✔ (Stummschalten) |
Blockierungen | ❌ | ✔ |
Einschränkung | ❌ (Limit überschritten) ✔ (Limit nicht überschritten) |
✔ |
Dämpfung | ✔ | ✔ |
Die Priorität der Einschränkungen ist „Stummschalten“ > „Blockieren“ > „Einschränkung“ > „Dämpfung“.
Einschränkungen für die Stummschaltung
Einschränkungen für die Stummschaltung:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Das Car Audio Framework verwaltet intern diese beiden Stummschaltungsstatus:
Nutzer stummschalten Wird auf Nutzeranfrage entweder über
CarAudioManager
oder über Schlüsselereignisse aktiviert oder deaktiviert.HAL-Stummschaltung Wird basierend auf Stummschaltungsbeschränkungen aktiviert und deaktiviert, die über den
AudioGain
-Callback empfangen wurden.
Für Zuhörer wie die Einstellungen-App hängt der Status der Stummschaltung der Lautstärkegruppe (CarVolumeGroupInfo.isMuted()
) davon ab, ob eine der oben genannten Stummschaltungen aktiviert ist.
Wenn die HAL-Stummschaltung aktiviert ist, werden alle eingehenden Anfragen zur Lautstärkeänderung und zum Aufheben der Stummschaltung der Gruppe während der Dauer der Einschränkung ignoriert.
Interaktionsfall: Die HAL-Stummschaltung ist aktiv und der Nutzer fordert die Stummschaltung an
Wenn die HAL-Stummschaltung aktiviert und die Nutzerstummschaltung deaktiviert ist:
- Der Stummschaltungsstatus der Lautstärkegruppe wurde in
true
geändert. - Anfragen von Nutzern, die Stummschaltung zu aktivieren, werden bearbeitet.
- Grund: Anfragen von Nutzern zum Stummschalten von Inhalten sollten immer berücksichtigt werden, um die Privatsphäre der Nutzer zu schützen.
Wenn die HAL-Stummschaltung und die Nutzerstummschaltung aktiviert sind:
Der Stummschaltungsstatus der Lautstärkegruppe wurde in
true
geändert.Anfragen von Nutzern, die Stummschaltung aufzuheben, werden
NOT
bearbeitet. Der im Cache gespeicherte Status der Nutzerstummschaltung bleibt aktiviert.Grund: Anträge auf Aufheben der Stummschaltung werden nur genehmigt, wenn keine Einschränkungen aktiv sind.
Grund: Wenn die Stummschaltung für einen Nutzer aufgehoben wird, der zuvor im Cache stummgeschaltet wurde, kann das zu einer unerwarteten Lautstärkeexplosion führen und die Sicherheit der Nutzer gefährden. Dies gilt insbesondere, wenn der Stummschaltungsstatus über mehrere Zündzyklen hinweg aktiviert ist, was die Wahrnehmung der Lautstärke für die Nutzer verringert.
Interaktionsfall: HAL-Stummschaltung aktiviert und deaktiviert, während sich die Nutzerstummschaltung nicht ändert
Wenn Sie die HAL-Stummschaltung umschalten, ändert sich der allgemeine Stummschaltungsstatus der Lautstärkegruppe. Der Stummschaltungsstatus des Nutzers wird dadurch jedoch nicht direkt aktualisiert. Wenn die Stummschaltung durch den Nutzer deaktiviert ist und ein HAL-Stummschaltungs-Callback zum Aktivieren empfangen wird:
- Der Stummschaltungsstatus der Lautstärkegruppe wurde in
true
geändert. Anfragen von Nutzern zum Ändern der Lautstärke werden
NOT
verarbeitet, während die HAL-Stummschaltung aktiviert ist.Grund: Der Nutzer kann keine Töne hören, wenn die Stummschaltung aktiviert ist. Wenn die Lautstärke geändert werden kann, kann das zu einer Lautstärkeexplosion führen und die Sicherheit der Nutzer gefährden.
Grund: Lautstärke-Apps können sich für Rückrufe registrieren und die Stummschaltung automatisch ohne Nutzereingriff aufheben (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)), wenn dies das vom OEM erwartete Verhalten ist.
Wenn die HAL-Stummschaltung deaktiviert ist, während die Nutzerstummschaltung deaktiviert ist:
Der Stummschaltungsstatus der Lautstärkegruppe wird in
false
geändert.Begründung: Wenn der Stummschaltungsstatus dauerhaft festgelegt ist und der Nutzer aufgefordert wird, die Stummschaltung aufzuheben, wird er möglicherweise unnötigerweise unterbrochen, wenn der Stummschaltungsstatus häufig wechselt.
Anfragen von Nutzern zum Ändern der Lautstärke werden wie gewohnt verarbeitet.
Blockierungen
Blockierungsbeschränkungen:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
Wenn Blockierungsbeschränkungen aktiv sind, können Nutzer Folgendes nicht tun:
- Lautstärkeänderungen werden nicht verarbeitet.
- Die Stummschaltung wird aktiviert oder deaktiviert.
Einschränkung
Einschränkungen:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Wenn Einschränkungen aktiv sind, können Nutzer Folgendes nicht tun:
So ändern Sie die Lautstärke:
- Innerhalb des Limits werden verarbeitet
- Über die oben genannten Einschränkungen hinausgehende Daten werden nicht verarbeitet.
Die Stummschaltung wird aktiviert oder deaktiviert.
Dämpfung
Einschränkungen bei der Dämpfung:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Wenn Einschränkungen für die Dämpfung aktiv sind, werden Anfragen von Nutzern zu folgenden Aktionen abgelehnt:
Die Lautstärke wird geändert. Die neue aktuelle Lautstärke wird auf die gedämpfte Lautstärke (anstelle der ursprünglichen Lautstärke) eingestellt. Alle zukünftigen Änderungen der Lautstärke werden auf dieser Ebene vorgenommen.
Die Stummschaltung wird ein-/ausgeschaltet.
Index aktualisieren
Die folgende Aktualisierung des Volume-Index gilt als asynchron:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Aus diesem Grund kann die AudioControl HAL den aktuellen Index der Lautstärkegruppe auf den angegebenen Index aktualisieren. Dieser Wert wird hauptsächlich als Feedback vom Audiosystem für die Lautstärkeänderungsanfrage vom Car Audio Framework verwendet. Die Indexaktualisierung wird auch als CarVolumeGroupEvent
-Callback an Apps gesendet, um den Index zu synchronisieren.
Beispiele
Anwendungsfall: Nutzer aktualisiert den Lautstärkeindex auf 30
Der Nutzer ändert mit der Lautstärke-App den Lautstärkeindex auf 30.
Dieser Index wird in eine Lautstärkeverstärkung umgewandelt und an die Audio HAL gesendet.
Anbieterimplementierungen von
Audio HAL
erhalten die neue Lautstärke und aktualisieren das Audiosystem (z. B. einen externen Verstärker).Das Audiosystem antwortet, dass die Lautstärke nur auf Index 15 aktualisiert wird (aus Gründen, die Android nicht bekannt sind).
Anbieterimplementierungen von
AudioControl HAL
-Triggern:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
Der Autoaudiodienst verwendet den neuen Index aus dem Rückruf, der für die Persistenz und Rückrufe an die Lautstärke-App verwendet wird. Der vom Nutzer angeforderte Index ist 30. Die asynchrone Rückmeldung des Audiosystems aktualisiert den Index jedoch auf 15.
Anwendungsfall: Erste Audiowiedergabe nach dem Beenden des Ruhemodus
Der Volumeindex vor dem Aussetzen ist auf 95 (Bereich: [0–99]) festgelegt.
Android wird in den Ruhemodus versetzt.
Wenn Android vorhanden ist, anhalten (z. B. fortsetzen):
Der Anbieter
Audio HAL/AudioControl HAL
wendet lokal einen sicheren Index von 30 auf das Audiosystem an.Der Anbieter
AudioControl HAL
löst auch den Callback für den Safe Index aus:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
Der Autoaudiodienst verwendet den neuen Index aus dem Rückruf, der für die Persistenz und seine eigenen Rückrufe an die Volume App verwendet wird, um den Index zu synchronisieren. Der Volumeindex vor dem Aussetzen ist 95. Nach der Wiederaufnahme wird dieser Index jedoch vom
AudioControl HAL
-Implementierer auf ein sicheres Lautstärkeniveau von 30 gesetzt.
Dynamische Volumekonfiguration
Für diese Funktion berücksichtigen wir die folgenden primären Anwendungsfälle:
Konfiguration für das Ende des Produktzyklus des Fahrzeugs
Automobilhersteller aktualisieren die Lautstärkekonfigurationen am Ende des Lebenszyklus lieber basierend auf der Konfiguration des Audiosystems des Fahrzeugs. In der Regel handelt es sich dabei um ein Sideload ohne Aktualisierung des Android-SW-Images.
Automobilhersteller müssen die Lautstärkekonfiguration möglicherweise während eines Wartungsplans aktualisieren.
Laufzeitkonfiguration Audiosysteme in Fahrzeugen unterstützen externe Verstärkerkonfigurationen. Diese Steuergeräte können die Konfigurationen für den Lautstärkebereich hosten, die während des Startens abgefragt werden.
On-Demand-Konfiguration Bietet auf der Grundlage der wachsenden Nachfrage nach bedarfsbasierten Audiofunktionen, bei denen Nutzer eine erweiterte Signalverarbeitung für einen bestimmten Zeitraum abonnieren können. Die neuen Konfigurationen für den Speicherplatzbereich gelten für die Dauer eines Abos.
Design
Die dynamische Volumekonfiguration erfolgt in drei Phasen:
Discovery Die AudioControl HAL-Implementierung des Anbieters erkennt neue Aktualisierungen des Lautstärkebereichs über einen benutzerdefinierten IPC-Mechanismus des Anbieters.
Sobald ein Gerät gefunden wurde, wird über
AudioControl::IModuleChangeCallback
ein Callback generiert.Aktualisieren Der Audiostack für Autos aktualisiert die Status der Lautstärkegruppen mit den neuen Lautstärkebereichen.
Wir bemühen uns, nach der Aktualisierung des Lautstärkebereichs die gleiche Lautstärke beizubehalten. Wenn der Index jedoch außerhalb des zulässigen Bereichs liegt, wird der aktuelle Volumenindex auf einen sicheren Wert gesetzt. Beispiel: Die Standardebene, die der Anbieter während des Rückrufs angegeben hat.
Callback
Nach Aktualisierungen des Bereichs der Lautstärkegruppe löst der Auto-Audiostack einen Rückruf an über
CarVolumeGroupEventCallback
registrierte Apps aus.CarVolumeGroupEvent
enthält den aktualisiertenCarVolumeGroupInfo
, den Ereignistyp (was sich geändert hat) und zusätzliche Informationen (warum sich etwas geändert hat).
Abbildung 1. Dynamische Lautstärkekonfiguration
HAL API
AudioControl @ 3.0 AIDL
In Version 3.0 der AudioControl AIDL HAL werden die folgenden APIs eingeführt:
API | |
---|---|
IAudioControl#setModuleChangeCallback | Legt eine Instanz von IModuleChangeCallback mit der AudioControl HAL fest. |
IAudioControl#clearModuleChangeCallback | Die Instanz von IModuleChangeCallback wird gelöscht, die zuvor mit der AudioControl HAL festgelegt wurde. |
IModuleChangeCallback#onAudioPortsChanged | Rückruf zur Benachrichtigung über Änderungen an Audioports |
Sequenz
Das Sequenzdiagramm der dynamischen Volumekonfiguration wird unten angezeigt.
Abbildung 2. Sequenzdiagramm für die dynamische Volumekonfiguration.
Wichtige Aspekte
Beachten Sie Folgendes, um diese Funktion zu optimieren:
Die im Rahmen des Rückrufs bereitgestellten Audioports müssen der Automotive BUS-Definition entsprechen:
- Geräteanschluss
IN_DEVICE
,OUT_DEVICE
- Verbindung.
BUS
- Adresse Wird in der Audio HAL-Definition definiert
- Gain-Modus
JOINT
- Geräteanschluss
Anbieter müssen in der Audio-HAL-Richtlinie eine Supermenge von Definitionen für den Lautstärkebereich definieren und sie mithilfe des Rückrufs für Fahrzeugvarianten anpassen. Weitere Informationen finden Sie in der
IModuleChangeCallbac
-AIDL-Definition.Wenn mehrere Audio-BUSse zur selben Lautstärkegruppe gehören, müssen sie identische Definitionen für den Lautstärkebereich haben. Andernfalls wird die neue Definition des Lautstärkebereichs vom Audio-Framework des Autos abgelehnt.