Die Lautstärkeregelung ist in CarAudioService
enthalten. Dort werden feste Lautstärken verwendet, da davon ausgegangen wird, dass die Lautstärken unterhalb der HAL von einem Hardwareverstärker und nicht in der Software angewendet werden. Mit CarAudioService
werden Ausgabegeräte in Lautstärkegruppen organisiert, um dieselben Verstärkungen auf alle Geräte anzuwenden, die mit einer Lautstärkegruppe verknüpft sind.
Feste Volumes
AAOS-Implementierungen verwenden einen Hardwareverstärker zur Lautstärkeregelung anstelle eines Software-Mixers. Um Nebenwirkungen zu vermeiden, setzen Sie das Flag config_useFixedVolume
auf true
(bei Bedarf überlagern):
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
Wenn das Flag config_useFixedVolume
nicht festgelegt ist (oder auf false
gesetzt ist), können Apps AudioManager.setStreamVolume()
aufrufen, um die Lautstärke nach Streamtyp im Softwaremixer zu ändern. Dies ist möglicherweise nicht immer wünschenswert, da es sich auf andere Apps auswirken kann und die Lautstärkeabschwächung im Softwaremixer dazu führen kann, dass weniger signifikante Bits im Signal verfügbar sind, wenn es vom Hardwareverstärker empfangen wird.
Volume-Gruppen
Mit Lautstärkegruppen werden die Lautstärken für eine Sammlung von Geräten in einer Audiozone verwaltet. Die Lautstärke kann für jede Lautstärkegruppe unabhängig voneinander geregelt werden. Die resultierenden Verstärkungen werden auf den zugehörigen Geräten konfiguriert, damit sie vom Verstärker des Fahrzeugs angewendet werden können. Die Lautstärkeeinstellungen werden für den Nutzer beibehalten und geladen, wenn er sich anmeldet.
Volumegruppen definieren
CarAudioService verwendet Lautstärkegruppen, die in car_audio_configuration.xml
definiert sind:
<audioZoneConfiguration version="4">
</deviceConfigurations>
<activationVolumeConfigs>
<activationVolumeConfig name="activation_volume_on_boot_config">
<activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
invocationType="onBoot" />
</activationVolumeConfig>
...
</activationVolumeConfigs>
<zones>
<zone name="primary zone" isPrimary="true">
<zoneConfigs>
<zoneConfig name="primary zone config 0" isDefault="true">
<volumeGroups>
<group activationConfig="activation_volume_on_boot_config">
<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>
</zoneConfig>
...
</zoneConfigs>
</zone>
</zones>
</audioZoneConfiguration>
Jede Lautstärkegruppe sollte ein oder mehrere Ausgabegeräte mit zugehörigen Adressen enthalten. Die Adressen sollten den in audio_policy_configuration.xml
definierten Ausgabegeräten entsprechen.
Steigerungen für Volume-Gruppen konfigurieren
Jede Lautstärkegruppe hat Mindest-, Höchst- und Standardwerte für die Verstärkung sowie eine Schrittgröße, die auf den in audio_policy_configuration.xml
konfigurierten Werten für die Geräte basiert, die der Lautstärkegruppe zugeordnet 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 prüft die Lautstärkegruppe 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.
- Mindeststeigerung: Der kleinste Mindestgewinn unter den Geräten in der Gruppe.
- Maximaler Gewinn: Der höchste maximale Gain unter den Geräten in der Gruppe.
- Standardverstärkung: Höchste Standardverstärkung unter den Geräten in der Gruppe.
Aufgrund der Art und Weise, wie diese Werte konfiguriert werden, ist es möglich, die Verstärkung einer Lautstärkegruppe außerhalb des für ein Gerät, das mit der Lautstärkegruppe verknüpft ist, unterstützten Bereichs festzulegen. 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 unter oder über dem Bereich liegt.
Volume-Gruppen-IDs
Volumegruppen werden zur Laufzeit in der Reihenfolge identifiziert, die in der XML-Datei definiert ist.
Die IDs reichen in einer Audiozone von 0
bis N-1
, wobei N
die Anzahl der Lautstärkegruppen in dieser Zone ist. Auf diese Weise sind Lautstärkegruppen-IDs nicht zonenübergreifend eindeutig. Diese Kennungen werden für CarAudioManager
-APIs verwendet, die Volumegruppen zugeordnet sind. Bei jeder API, die groupId
ohne zoneId
verwendet, wird standardmäßig die primäre Audiozone verwendet.
Lautstärkeregelung in mehreren Zonen
Jeder Audiozone ist mindestens eine Lautstärkegruppe zugeordnet und jede Lautstärkegruppe ist nur einer Audiozone zugeordnet. Diese Beziehung wird als Teil von car_audio_configuration.xml
definiert. Weitere Informationen finden Sie im Beispiel oben unter Volumengruppen 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 zonenspezifisch. Wenn sich ein Nutzer also 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.
Mindest- und Höchstaktivierungsvolumen
In Android 15 können Lautstärkegruppenindexe gesteuert werden, um die Sicherheit und den Nutzerkomfort in Car-Audio-Systemen zu verbessern. Dies wird durch die Verwendung von Mindest- und Höchstaktivierungsvolumes erreicht, die in der Car Audio-Konfiguration konfiguriert werden (siehe Lautstärkegruppen definieren). Sie können diese Funktion aktivieren, indem Sie in den RROs für den Autoservice audioUseMinMaxActivationVolume
auf true
setzen.
Sie können in activationVolumeConfigs
mehrere activationVolumeConfig
-Einträge definieren, die jeweils eine andere Konfiguration für die Mindest- und Maximalaktivierung darstellen. Jede activationVolumeConfig
:
- Muss in der Konfigurationsdatei für die Audioanlage im Auto ein eindeutiges
name
enthalten, damit später in der Lautstärkegruppe (group
) darauf verwiesen werden kann. - Darf nur ein
activationVolumeConfigEntry
enthalten.
Jedes activationVolumeConfig
enthält die folgenden Attribute:
minActivationVolumePercentage
(Ganzzahl, 0–100, optional, Standardwert: 0): Gibt das Mindestaktivierungsvolumen als Prozentsatz an.maxActivationVolumePercentage
(Ganzzahl, 0–100, optional, Standardwert: 100): Gibt das maximale Aktivierungsvolumen in Prozent an.invocationType
(String, optional, Standard:onPlaybackChanged
): Definiert die Bedingungen, unter denen das Mindest- und Höchstvolumen für die Aktivierung angewendet wird:onBoot
: Wird nur auf die erste neu aktive Wiedergabe in einer Lautsprechergruppe nach dem Booten angewendet.onSourceChanged
: Wird nur auf eine neu aktive Wiedergabe mit einer geänderten App- oder UID-Quelle in einer Lautstärkegruppe angewendet.onPlaybackChanged
: Wird auf jede neu aktivierte Wiedergabe in einer Volumengruppe angewendet.
CarAudioService
verwaltet die minimale und maximale Aktivierung durch Überwachung der folgenden derzeit aktiven Audio-Unterkomponenten:
- Aktuell aktive Wiedergabetracks
- Aktueller Anrufstatus
- Aktuelle Audiofokus-Anfrage von der Audio Control HAL, bei der die Audiofokus-Anfrage von der Audio Control HAL signalisiert, dass eine aktive Audiowiedergabe außerhalb von Android stattfindet.
Das folgende Bild zeigt einen allgemeinen Überblick über die Verwaltung des Mindest- und Höchstaktivierungsvolumens:
Abbildung 1: Verwaltung des minimalen und maximalen Aktivierungsvolumens für aktive Audio-Datenpfade.
Mit den angegebenen Werten für minActivationVolumePercentage
, maxActivationVolumePercentage
, den Mindest- und Höchstindex für die Steigerung des Volumens können Sie den Mindest- und Höchstindex für die Steigerung des Aktivierungsvolumens für jede Volumengruppe berechnen. CarAudioService
überwacht jede neu aktivierte Wiedergabe und wendet das minimale und maximale Aktivierungsvolumen unter den folgenden Bedingungen an:
- Aufruftyp stimmt überein: Der Aktivierungstyp der Wiedergabe (abgeleitet vom Audio Manager, Audio Control HAL oder Telephony Manager) muss mit dem
invocationType
übereinstimmen, das imactivationVolumeConfigEntry
angegeben ist, das mit der Lautstärkegruppe verknüpft ist. Lautstärkeindex außerhalb des zulässigen Bereichs: Der aktuelle Lautstärkeindex der Lautstärkegruppe muss außerhalb des definierten Aktivierungslautstärkeindexbereichs liegen. Das bedeutet, dass einer der folgenden Punkte zutrifft:
Der Index ist niedriger als der berechnete Index für die Mindeststeigerung des Aktivierungsvolumens.
ODER
Der Index ist höher als der berechnete Index für den maximalen Anstieg des Aktivierungsvolumens.
Bei einer Aktivierungsübereinstimmung wird der Index für die Volumensteigerung der Volumengruppe auf einen der folgenden Werte angepasst:
Der Index für den Mindestanstieg des Aktivierungsvolumens ist niedriger als der Index für den Mindestanstieg des Aktivierungsvolumens.
ODER
Maximaler Index für die Steigerung des Aktivierungsvolumens, wenn er höher als der maximale Index für die Steigerung des Aktivierungsvolumens ist
Außerdem wird ein Ereignis für die Lautstärkegruppe des Autos mit dem Ereignistyp
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED
an alle registrierten Rückrufe für Lautstärkegruppenereignisse gesendet.
Lautstärketasten-Ereignisse verarbeiten
In Android sind mehrere Keycodes für die Lautstärkeregelung definiert, darunter:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
Standardmäßig leitet Android die Lautstärketastenereignisse an Apps weiter. Bei Automotive-Implementierungen sollten diese Schlüsselereignisse zur Verarbeitung durch CarAudioService
gezwungen 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 vorgesehen sind. Es wird davon ausgegangen, dass sie alle der primären Audiozone zugeordnet sind. Wenn ein Lautstärketastenevent 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 enthält, das dem Audiokontext mit der höchsten Priorität zugeordnet ist. Die Priorisierung basiert auf einer festen Reihenfolge, die in CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
definiert ist.
Überblenden und Balance
Beide Versionen des AudioControl HAL enthalten APIs zum Festlegen von Fade und Balance im Fahrzeug. Entsprechende 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 Lautsprecherlautstärke nach rechts (+) oder links (-) im Auto.- 0,0 ist zentriert
- +1,0 ist vollständig richtig
- -1,0 ist ganz links.
- Ein Wert außerhalb des Bereichs von -1 bis 1 ist ein Fehler.
setFadeTowardFront(float value)
verschiebt die Lautsprecherlautstärke nach vorn (+) oder hinten (–) im Auto.- 0,0 ist zentriert
- +1,0 ist vollständig vorwärts
- -1.0 ist ganz hinten.
- Ein Wert außerhalb des Bereichs von -1 bis 1 ist ein Fehler.
Sie entscheiden, wie diese Werte angewendet und den Nutzern angezeigt werden sollen. Sie können entweder nur auf Medien oder auf alle Android-Sounds angewendet werden. Mit Android 11 wurde auch die Unterstützung für das Anwenden von Audioeffekten auf Ausgabegeräte eingeführt. So ist es möglich, Fading und Balance alternativ über Audioeffekte auf den entsprechenden Ausgabegeräten anstatt über diese APIs zu verwalten.
Audio-Ducking
Beim Audio-Ducking wird die Verstärkung für einen Stream verringert, damit ein anderer Stream, der gleichzeitig wiedergegeben wird, besser zu hören ist. In AAOS wird die Audio-Ducking-Funktion von der HAL implementiert. Android hat keine Kontrolle über Sounds, die nicht vom Betriebssystem stammen. In Android 11 ist die wichtigste Information, die dem HAL zur Verfügung steht, um Entscheidungen zum Ducking zu treffen, ob auf zwei Ausgabegeräten aktive Streams vorhanden sind.
Wann du dich ducken solltest
Es liegt im Ermessen des jeweiligen OEM, wie das Ducking von der HAL gehandhabt wird. Wir empfehlen jedoch die folgenden Richtlinien.
Mehrere Streams, die auf Android-Geräten wiedergegeben werden, treten häufig auf, wenn 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 Car Audio-Plug-ins hängt dies auch von der Verwaltung des AudioFocus ab.
Alle Streams, die von Android gemischt werden, werden vor der Anwendung von Verstärkungen gemischt. Daher sollte jeder Stream, der bei gleichzeitiger Wiedergabe mit einem anderen Stream geduckt werden soll, an separate Ausgabegeräte weitergeleitet werden, damit das HAL Ducking anwenden kann, bevor die Streams gemischt werden.
Empfohlenes Ducking-Verhalten
Im Folgenden finden Sie Beispiele für mögliche gleichzeitige Interaktionen, bei denen Ducking empfohlen wird.
Interaktion | Aktion |
---|---|
EMERGENCY
| Ducks oder stummschaltet alles außer SAFETY
|
SAFETY |
Ducks alles außer EMERGENCY |
NAVIGATION |
Weicht allem aus, außer SAFETY und EMERGENCY |
CALL |
Schließt alles außer SAFETY , EMERGENCY und NAVIGATION aus. |
VOICE |
Enten CALL_RING |
VEHICLE_SOUNDS |
Sie legen fest, wie wichtig der aktive Sound ist und ob andere Sounds dadurch gedämpft werden sollen. |
MUSIC und ANNOUNCEMENT |
Von allem abgelenkt. Ausnahmen sind Töne für die Touch-Interaktion, die als SYSTEM_SOUND wiedergegeben werden.
|
Wichtige Aspekte beim Ducking
Einige Apps und Dienste, z. B. Navigations- oder Assistenten-Apps, verwenden möglicherweise mehrere Player, um Aktionen auszuführen. Vermeide aggressives Absenken der Lautstärke, wenn kein Datenstrom mehr über Ausgabegeräte übertragen wird, damit die Lautstärke nicht wieder auf das volle Niveau zurückkehrt, bevor sie vor der nächsten Wiedergabe durch die Navigations- oder eine Assistenten-App abgesenkt wird.
Bei Fahrzeugen mit mehreren Soundstages mit ausreichender Isolation können Sie Audioinhalte an verschiedene Bereiche des Autos weiterleiten, anstatt sie zu unterbrechen. So können beispielsweise Navigationsanweisungen an die Lautsprecher der Kopfstütze des Fahrers weitergeleitet werden, während weiterhin Musik in der gesamten Kabine mit normaler Lautstärke abgespielt wird.
Sicherheitskritische Geräusche
Mit Android 11 wurden HAL-Audiofokus-APIs eingeführt. Das HAL sorgt dafür, dass sicherheitskritische Töne gegenüber anderen Tönen priorisiert werden. Wenn das HAL den Audiofokus für USAGE_EMERGENCY
beibehält, kann nicht garantiert werden, dass Apps und Dienste von Android keine Töne abspielen. Das HAL bestimmt, welche Streams von Android gemischt oder stummgeschaltet werden sollen, um sicherheitskritische Töne abzuspielen.
UI für Lautstärkeeinstellungen konfigurieren
In AAOS wird die Benutzeroberfläche für die Lautstärkeeinstellungen von der Lautstärkegruppenkonfiguration entkoppelt. Sie können wie unter Lautstärkeanpassungen für Lautstärkegruppen konfigurieren beschrieben überlagert werden. Durch diese Trennung sind keine Änderungen erforderlich, wenn sich die Konfiguration von Volumegruppen ändert.
In der Benutzeroberfläche für die Fahrzeugeinstellungen enthält packages/apps/Car/Settings/res/xml/car_volume_items.xml
die UI-Elemente (Titel- und Symbolressourcen), die mit jedem definierten AudioAttributes.USAGE
verknüpft sind. Diese Datei sorgt für eine angemessene Darstellung der definierten VolumeGroups
, indem Ressourcen verwendet werden, die mit der ersten erkannten Nutzung in jedem VolumeGroup
verknüpft sind.
Im folgenden Beispiel wird beispielsweise definiert, dass VolumeGroup
voice_communication
und voice_communication_signalling
umfasst. Bei der Standardimplementierung der Benutzeroberfläche für die Fahrzeugeinstellungen wird VolumeGroup
mit den Ressourcen gerendert, 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. In der Benutzeroberfläche für die Lautstärkeeinstellungen werden die folgenden VolumeGroup
-basierten CarAudioManager-APIs verwendet:
getVolumeGroupCount()
– hier erfahren Sie, wie viele Kontrollvariablen gezogen werden sollten.getGroupMinVolume()
undgetGroupMaxVolume()
, um die untere und obere Grenze zu erhalten.getGroupVolume()
, um die aktuelle Lautstärke abzurufen.registerVolumeChangeObserver()
über Änderungen des Volumens benachrichtigt werden.
Ereignis für die Gruppe „Autovolumen“
Die Anwendungsfälle für die Lautstärkeanpassung und die Stummschaltung im Automobilbereich haben kontextbezogene Grundlagen, die die Aktionen bestimmter Apps definieren können, z. B. die Lautstärkeeinstellungen. Der aktuelle Volume- und Stummschaltungs-Callback aus dem Car-Audio-Stack bietet nur begrenzte Kontextinformationen. Um Automotive-Anwendungsfälle und die zukünftige Skalierbarkeit besser zu unterstützen, wird CarVolumeGroupEvent in Android 14 hinzugefügt. Jedes Ereignis enthält drei wichtige Arten von Informationen:
CarVolumeGroupInfo
ListenEventTypes
(bitmapped)ExtraInfos
Listen
CarVolumeGroupInfo
Der Empfänger des Ereignis-Callbacks hat direkten Zugriff auf die Liste der Informationen zur betroffenen Lautstärkegruppe für das Auto. Das bedeutet, dass die App keine zusätzlichen Aufrufe an das Car Audio Framework senden muss, um den aktuellen Status abzurufen. Sie kann einfach die empfangene CarVolumeGroupInfos
verwenden, um die Benutzeroberfläche oder interne Status zu aktualisieren. Um die Integration zu vereinfachen, werden die Aspekte, die sich in einer Gruppe mit Autolautstärke geändert haben, auch als Teil von EventTypes
bereitgestellt, wie unten beschrieben.
EventTypes
Gibt an, welcher Aspekt von CarVolumeGroupInfo
sich geändert hat. Apps können diese Informationen verwenden, um Änderungen zu erkennen und die erforderlichen Maßnahmen zu ergreifen. Beispiel: EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
gibt an, dass sich der entsprechende CarVolumeGroups
-Index für die maximale Volumenzunahme 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
Bietet zusätzliche Informationen dazu, warum sich CarVolumeGroup
geändert hat. Apps können diese Informationen verwenden, um dem Nutzer zusätzlichen Kontext zu liefern, damit er reagieren oder sich benachrichtigen lassen kann. Beispiel: EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
weist auf eine aktive vorübergehende Dämpfung aufgrund einer thermischen Überlastung hin. Die App kann den Nutzer informieren, wenn er versucht, die Lautstärke zu erhöhen.
Wir schreiben keinen bestimmten Prozess für ExtraInfos
vor. Es liegt in Ihrem Ermessen, den Prozess auf Grundlage von ExtraInfos
festzulegen. Wenn die Dämpfung beispielsweise aufgrund von EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
aktiv ist, können Sie die Lautstärkeregelung anfangs ausblenden, um zu verhindern, dass der Nutzer die Lautstärke ändert.
Andere können einen Hinweis einblenden, dass die Lautstärkeabsenkung aktiv ist, und dem Nutzer die Möglichkeit geben, die Lautstärke zu ändern.
Das Car Audio-Framework ist vom AudioControl HAL IAudioGainCallback
abhängig, um die vorgeschlagene ExtraInfos
bereitzustellen. Weitere Informationen finden Sie unter Audio Gain Callback.
CarVolumeGroupEvent
lässt sich an zukünftige Anforderungen des Car Audio Framework anpassen. Wir beabsichtigen, neue Funktionen nur über CarVolumeGroupEvent
zu unterstützen. Wir empfehlen App-Entwicklern dringend, CarVolumeGroupEvent
zu verwenden, um Änderungen an der Gruppenlautstärke und Stummschaltung zu verarbeiten.
Callback für Ereignisse der Gruppe „Car volume“
Android 14 bietet einen neuen Callback für privilegierte Apps und Plattform-Apps, mit dem sie sich für CarVolumeGroupEvents
registrieren und darüber benachrichtigt werden können.
Verwenden Sie
CarAudioManager#registerCarVolumeGroupEventCallback()
, um sich für den Callback zu registrieren.Verwenden Sie
CarAudioManager#unregisterCarVolumeGroupEventCallback()
, um die Registrierung des Callbacks aufzuheben.
Wenn eine App mit dem neuen CarVolumeGroupEventCallback
und dem alten CarVolumeCallback
registriert wird, wird dem Ereignis CarVolumeGroupEventCallbacks
Priorität eingeräumt.
Der Car Audio-Stack löst CarVolumeCallback
nicht mehr aus. Dadurch werden doppelte Trigger für dieselbe App für dasselbe Ereignis verhindert.
Wir empfehlen dringend, CarVolumeGroupEventCallback
zu verwenden, um Änderungen an der Gruppenlautstärke und Stummschaltung zu verwalten.
Audio-Gain-Callback
Seit Android 13 kann AudioControl HAL einen asynchronen Callback auslösen, um Lautstärkepegel-Updates aufgrund von Änderungen am Car-Audiosystem 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 |
Asynchroner Callback, um über Änderungen an der Audioverstärkungskonfiguration zu informieren. |
Der AudioControl HAL-Callback enthält Listen mit Gründen und den entsprechenden AudioGainConfigInfo
, die Folgendes umfassen:
- Zonen-ID
- Geräteportadresse
- Der Volumenindex > Index kann entweder ein eingeschränkter Index oder ein Aktualisierungsindex sein.
Die Gründe lassen sich in folgende Kategorien einteilen:
- Gründe für Einschränkungen. Vorübergehende Änderung des Verhaltens bei Lautstärke und Stummschaltung.
- Gründe für die Aktualisierung Dauerhafte Änderung des Lautstärkeverhaltens.
Einschränkungstypen
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 | Vom Nutzer ausgelöste Ein/Aus-Schaltfläche für die Stummschaltung |
---|---|---|
Stummschalten | ❌ | ❌ (Ton einschalten) ✔ (Ton ausschalten) |
Blockierungen | ❌ | ✔ |
Einschränkung | ❌ (über dem Limit) ✔ (unter dem Limit) |
✔ |
Dämpfung | ✔ | ✔ |
Die Priorität zwischen Einschränkungen ist „Stummschalten“ > „Blockieren“ > „Einschränkung“ > „Abschwächung“.
Einschränkungen beim Ausblenden
Folgende Einschränkungen gelten für das Stummschalten:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Das Car Audio-Framework verwaltet intern die folgenden beiden Stummschaltungsstatus:
Nutzer stummschalten: Wird auf Anfrage des Nutzers über
CarAudioManager
oder Schlüsselereignisse aktiviert.HAL-Stummschaltung: Wird basierend auf den über den
AudioGain
-Callback empfangenen Stummschaltungsbeschränkungen umgeschaltet.
Für Listener wie die Einstellungen App basiert der Gesamtzustand der Stummschaltung der Lautstärkegruppe (CarVolumeGroupInfo.isMuted()
) darauf, ob eine der oben genannten Stummschaltungen aktiviert ist.
Wenn die HAL-Stummschaltung aktiviert ist, werden alle eingehenden Lautstärkeänderungs- und Gruppenentstummungsanfragen für die Dauer der Einschränkung ignoriert.
Interaktionsfall: HAL-Stummschaltung ist aktiv und Nutzer fordert das Umschalten der Stummschaltung an
Wenn die HAL-Stummschaltung aktiviert und die Nutzer-Stummschaltung deaktiviert ist:
- Der allgemeine Stummschaltungsstatus der Lautstärkegruppe wurde in
true
geändert. - Anfragen von Nutzern zum Aktivieren der Stummschaltung werden verarbeitet.
- Grund: Anfragen von Nutzern zum Stummschalten müssen jederzeit berücksichtigt werden, um den Datenschutz der Nutzer zu wahren.
Wenn das Stummschalten über HAL und das Stummschalten über den Nutzer aktiviert sind:
Der allgemeine Stummschaltungsstatus der Lautstärkegruppe wurde in
true
geändert.Anfragen von Nutzern zum Deaktivieren der Stummschaltung werden
NOT
bearbeitet. Der zwischengespeicherte Stummschaltungsstatus des Nutzers bleibt aktiviert.Grund: Anfragen zum Aufheben der Stummschaltung von Nutzern werden nur berücksichtigt, wenn keine aktiven Einschränkungen vorliegen.
Grund: Wenn die Stummschaltung eines Nutzers im Cache aufgehoben wird, kann dies zu einer unbeabsichtigten Lautstärkeerhöhung führen und die Sicherheit des Nutzers gefährden. Dies gilt insbesondere, wenn der Stummschaltungsstatus über Zündzyklen hinweg aktiviert ist, was die Wahrnehmung des Schallpegels durch die Nutzer verringert.
Interaktionsfall: HAL-Stummschaltung aktiviert und deaktiviert, während die Nutzerstummschaltung unverändert bleibt
Durch das Umschalten der HAL-Stummschaltung wird der allgemeine Stummschaltungsstatus der Lautstärkegruppe geändert. Der Stummschaltungsstatus des Nutzers wird jedoch nicht direkt aktualisiert. Wenn die Stummschaltung des Nutzers deaktiviert ist und ein HAL-Stummschaltungs-Callback zum Aktivieren empfangen wird:
- Der allgemeine Stummschaltungsstatus der Lautstärkegruppe wurde in
true
geändert. Anfragen vom Nutzer zum Ändern der Lautstärke werden
NOT
verarbeitet, während HAL-Stummschaltung aktiviert ist.Grund: Der Nutzer kann keine Geräusche wahrnehmen, wenn die Stummschaltung aktiviert ist. Wenn die Lautstärke geändert werden kann, kann es zu einer plötzlichen Lautstärkeerhöhung kommen, die die Sicherheit der Nutzer gefährdet.
Grund: Volumen-Apps können sich für Rückrufe registrieren und das Stummschalten automatisch aufheben (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)), ohne dass der Nutzer eingreifen muss, 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 wurde in
false
geändert.Grund: Wenn der Stummschaltungsstatus beibehalten wird und der Nutzer aufgefordert wird, die Stummschaltung aufzuheben, kann dies den Nutzer unnötig unterbrechen, wenn der Stummschaltungsstatus häufig geändert wird.
Anfragen von Nutzern zum Ändern der Lautstärke werden normal verarbeitet.
Blockierungen
Sperrbeschränkungen:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
Wenn Blockierungsbeschränkungen aktiv sind, werden Anfragen von Nutzern,
- Änderungen des Volumens werden nicht verarbeitet.
- Die Stummschaltung wird aktiviert oder deaktiviert.
Einschränkung
Einschränkungen für Limits:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Wenn Einschränkungen aktiv sind, können Nutzer Folgendes nicht mehr anfordern:
Lautstärke ändern:
- Innerhalb der Einschränkung verarbeitet
- Die oben genannten Einschränkungen werden nicht berücksichtigt.
Die Stummschaltung wird aktiviert oder deaktiviert.
Dämpfung
Einschränkungen bei der Dämpfung:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Wenn die Einschränkungen für die Dämpfung aktiv sind, werden Anfragen von Nutzern für Folgendes:
Änderungen des Volumens werden verarbeitet. Die neue aktuelle Lautstärke wird auf die gedämpfte Lautstärke (statt auf die bisherige Lautstärke) eingestellt. Zukünftige Lautstärkeänderungen werden ab diesem Pegel vorgenommen.
Die Stummschaltung wird ein- oder ausgeschaltet.
Index aktualisieren
Das Folgende gilt als asynchrone Aktualisierung des Volume-Index:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Aus diesem Grund kann die AudioControl HAL den aktuellen Index der Lautstärkegruppe auf den angegebenen Index aktualisieren. Dies wird hauptsächlich als Feedback vom Audiosystem für die Anfrage zur Lautstärkeänderung vom Car Audio Framework verwendet. Die Indexaktualisierung wird auch über einen CarVolumeGroupEvent
-Callback an Apps gesendet, um den Index zu synchronisieren.
Beispiele
Anwendungsfall: Nutzer aktualisiert den Volume-Index auf 30
Der Nutzer ändert den Lautstärkeindex in der Lautstärke-App auf 30.
Dieser Index wird in eine Lautstärkeerhöhung umgewandelt und an Audio HAL gesendet.
Anbieterimplementierungen von
Audio HAL
erhalten die neue Lautstärkeanhebung und aktualisieren das Audiosystem (z. B. einen externen Verstärker).Das Audiosystem antwortet, dass der Lautstärkepegel 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 Car Audio-Dienst verwendet den neuen Index aus dem Callback, der für die Persistenz und die Rückrufe an die Lautstärke-App verwendet wird. Der vom Nutzer angeforderte Index ist 30. Durch das asynchrone Feedback des Audiosystems wird der Index jedoch auf 15 aktualisiert.
Anwendungsfall: Erste Audiowiedergabe nach dem Beenden des Stand-by-Modus
Der Volumenindex vor der Sperrung ist auf einem hohen Niveau von 95 festgelegt (Bereich: [0–99]).
Android wechselt in den inaktiven Modus.
Wenn Android vorhanden ist, halten Sie es an (z. B. durch 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 sicheren Index aus:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
Der Car Audio-Dienst verwendet den neuen Index aus dem Callback, der für die Persistenz verwendet wird, und eigene Callbacks für die Lautstärke-App, um den Index zu synchronisieren. Der Volumenindex vor der Sperrung beträgt 95. Nach dem Fortsetzen wird dieser Index jedoch vom
AudioControl HAL
-Implementierer auf eine sichere Lautstärke von 30 gesetzt.
Dynamische Volume-Konfiguration
Für diese Funktion werden die folgenden primären Anwendungsfälle berücksichtigt:
Konfiguration des Fahrzeugs am Ende der Fertigungslinie (EOL):
Automobilhersteller aktualisieren Lautstärke-Konfigurationen lieber am EOL basierend auf der Einrichtung des Audio-Systems des Fahrzeugs. In der Regel handelt es sich dabei um ein Sideloading ohne Aktualisierung des Android-Software-Images.
Automobilhersteller müssen die Lautstärke-Konfiguration möglicherweise während eines Service-Termins aktualisieren.
Laufzeitkonfiguration: Automotive-Audiosysteme unterstützen Konfigurationen mit externen Verstärkern. Auf diesen Steuergeräten können die Konfigurationen für den Lautstärkebereich gespeichert sein, die beim Booten abgefragt werden.
On-Demand-Konfiguration: Diese Funktion wurde eingeführt, um dem wachsenden Bedarf an bedarfsbasierten Audiofunktionen gerecht zu werden, bei denen Nutzer für einen bestimmten Zeitraum ein Abo für eine verbesserte Signalverarbeitung abschließen. Die neuen Konfigurationen für den Lautstärkebereich gelten für die gesamte Laufzeit eines Abos.
Design
Die dynamische Volume-Konfiguration erfolgt in drei Phasen:
Auffindbarkeit: Die AudioControl HAL-Implementierung des Anbieters erkennt neue Lautstärkeänderungen über einen benutzerdefinierten IPC-Mechanismus, der dem Anbieter gehört.
Wenn ein Problem erkannt wird, wird über
AudioControl::IModuleChangeCallback
ein Callback generiert.Aktualisieren: Der Car Audio-Stack aktualisiert die Status der Lautstärkegruppe mit den neuen Lautstärkebereichen.
Wir bemühen uns, das Lautstärkeniveau nach der Aktualisierung des Lautstärkebereichs beizubehalten. Wenn der Index jedoch außerhalb des zulässigen Bereichs liegt, wird der aktuelle Lautstärkeindex auf einen sicheren Wert gesetzt. Beispiel: Die Standardebene, die vom Anbieter während des Rückrufs bereitgestellt wird.
Rückruf:
Nach Aktualisierungen des Lautstärkegruppenbereichs löst der Car Audio-Stack einen Callback für Apps aus, die über
CarVolumeGroupEventCallback
registriert sind.CarVolumeGroupEvent
enthält die aktualisiertenCarVolumeGroupInfo
, den Ereignistyp (was sich geändert hat) und zusätzliche Informationen (warum sich etwas geändert hat).
Abbildung 2: Dynamische Volume-Konfiguration
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 AudioControl HAL fest. |
IAudioControl#clearModuleChangeCallback | Löscht die Instanz von IModuleChangeCallback, die zuvor mit der AudioControl HAL festgelegt wurde. |
IModuleChangeCallback#onAudioPortsChanged | Callback zum Benachrichtigen über Änderungen an AudioPorts |
Sequenz
Das Sequenzdiagramm der dynamischen Volume-Konfiguration wird unten angezeigt.
Abbildung 3: Sequenzdiagramm für die dynamische Volume-Konfiguration.
Wichtige Aspekte
Beachten Sie Folgendes, um diese Funktion zu optimieren.
AudioPorts, die als Teil des Callbacks bereitgestellt werden, müssen der Automotive-BUS-Definition entsprechen:
- Geräteanschluss:
IN_DEVICE
,OUT_DEVICE
- Verbindung
BUS
- Adresse In der Audio-HAL-Definition definiert
- Verstärkungsmodus:
JOINT
- Geräteanschluss:
Anbieter müssen eine Obermenge von Lautstärkebereichsdefinitionen in der Audio HAL-Richtlinie definieren und den Callback verwenden, um sie für Fahrzeugvarianten anzupassen. Weitere Informationen finden Sie in der
IModuleChangeCallbac
-AHDL-Definition.Wenn mehrere Audio-BUSSE zur selben Lautstärkegruppe gehören, muss für jeden von ihnen derselbe Lautstärkebereich definiert sein. Andernfalls wird die neue Definition des Lautstärkebereichs vom Car Audio Framework abgelehnt.