AAOS hat eine eigene Volume-Verwaltung innerhalb von CarAudioService
. Es verwendet feste Lautstärken, da davon ausgegangen wird, dass die Lautstärke unterhalb der HAL durch einen Hardwareverstärker und nicht in der Software angewendet werden sollte. Außerdem werden Ausgabegeräte in Lautstärkegruppen organisiert, um dieselben Verstärkungen auf alle mit der Lautstärkegruppe verknüpften Geräte anzuwenden.
Feste Volumes verwenden
Bei AAOS-Implementierungen sollte die Lautstärke über einen Hardwareverstärker statt über einen Software-Mixer gesteuert werden. Setzen Sie das Flag config_useFixedVolume
auf „true“, um Nebenwirkungen zu vermeiden (Overlay bei Bedarf):
<resources> <!-- Car uses hardware amplifier for volume. --> <bool name="config_useFixedVolume">true</bool> </resources>
Wenn das Flag config_useFixedVolume
nicht gesetzt ist (oder auf „false“ gesetzt ist), können Anwendungen AudioManager.setStreamVolume()
aufrufen und die Lautstärke nach Streamtyp im Software-Mixer ändern. Dies kann aufgrund der potenziellen Auswirkungen auf andere Anwendungen und der Tatsache, dass die Lautstärkedämpfung im Software-Mixer zu weniger signifikanten Bits im Signal führt, wenn es am Hardwareverstärker empfangen wird, unerwünscht sein.
Volumegruppen
Mit Lautstärkegruppen wird die Lautstärke für eine Gruppe von Geräten in einer Audiozone verwaltet. Für jede Lautstärkegruppe kann die Lautstärke unabhängig geregelt werden. Die resultierenden Verstärkungen werden auf den zugehörigen Geräten so konfiguriert, dass sie vom Verstärker des Fahrzeugs angewendet 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>
Beispielimplementierung von car_audio_configuration.xml
Jede Volumegruppe sollte ein oder mehrere Ausgabegeräte mit zugehörigen Adressen enthalten.
Diese Adressen sollten den in audio_policy_configuration.xml
definierten Ausgabegeräten entsprechen.
Gewinne für Volumegruppen konfigurieren
Jede Lautstärkegruppe hat einen Mindest-, Maximal- und Standard-Verstärkungswert sowie eine Schrittweite. Sie werden anhand der in audio_policy_configuration.xml
für die mit der Volumegruppe verknüpften Geräte konfigurierten Werte bestimmt.
<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.
- Minimaler Gewinn Niedrigster Mindestgewinn unter den Geräten in der Gruppe
- Maximaler Gewinn Höchster maximaler 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 Volumegruppe außerhalb des Bereichs liegen, der für ein Gerät unterstützt wird, das mit der Volumegruppe verknüpft ist. In diesem Fall wird für das Gerät der Verstärkungswert 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 anhand ihrer Definition in der XML-Datei identifiziert.
IDs reichen in einer Audiozone von 0 bis N-1, wobei N die Anzahl der Gruppen in dieser Zone ist. Daher sind Volumegruppen-IDs nicht in allen Zonen eindeutig. Diese IDs 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 Gruppen mit Lautstärkeregelung haben. Jede Lautstärkeregelungsgruppe ist nur einer Audiozone zugeordnet. Diese Beziehung wird als Teil von car_audio_configuration.xml
definiert. Sehen Sie sich das Beispiel unter Volumegruppen definieren oben an.
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
und KEYCODE_VOLUME_MUTE
. Standardmäßig leitet Android die Ereignisse der Lautstärketasten an Anwendungen weiter. Bei Implementierungen für die Automobilbranche sollten diese Schlüsselereignisse auf CarAudioService
erzwungen werden, von wo aus dann setGroupVolume
oder setMasterMute
aufgerufen werden kann.
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ärketasten-Ereignissen kann derzeit nicht unterschieden werden, für welche Zone sie bestimmt sind. Daher wird davon ausgegangen, dass sie alle mit der primären Audiozone verknüpft sind.
Wenn ein Ereignis für die Lautstärketaste empfangen wird, ermittelt CarAudioService
, welche Lautstärkegruppe angepasst werden soll. Dazu werden die Audiokontexte für die aktiven Wiedergabegeräte 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 Ausblendung und Balance im Fahrzeug. Es gibt entsprechende System-APIs für CarAudioManager, die Werte an die AudioControl HAL weitergeben. Für diese APIs ist android.car.permission.CAR_CONTROL_AUDIO_VOLUME
erforderlich.
Die AudioControl APIs sind:
setBalanceTowardRight(float value)
: Verschiebt die Lautsprecherlautstärke zur rechten (+) oder linken (-) Seite des Fahrzeugs. 0,0 ist zentriert, +1,0 ist ganz rechts, -1,0 ist ganz links und ein Wert außerhalb des Bereichs -1 bis 1 ist ein Fehler.setFadeTowardFront(float value)
: Hiermit können Sie die Lautsprecherlautstärke in Richtung Fahrzeugvorderseite (+) oder - (hinten) ändern. 0,0 bedeutet „zentriert“, +1,0 bedeutet „voll nach vorne“ und -1,0 bedeutet „voll nach hinten“. Ein Wert außerhalb des Bereichs -1 bis 1 ist ein Fehler.
OEMs müssen entscheiden, wie diese Werte angewendet und Nutzern angezeigt werden. Sie können nur auf Medien oder allgemein auf alle Android-Töne angewendet werden.
Mit Android 11 können Audioeffekte auch auf Ausgabegeräte angewendet werden. So ist es möglich, das Ausblenden und die Balance alternativ über Audioeffekte auf den entsprechenden Ausgabegeräten statt über diese APIs zu verwalten.
Audio-Ducking
Audio-Ducking tritt auf, wenn das Fahrzeug die Verstärkung für einen Stream reduziert, damit ein gleichzeitig wiedergegebener Stream besser zu hören ist. In AAOS wird die Audioducking-Funktion der HAL überlassen, da es potenziell viele Töne außerhalb von Android gibt, über die das Betriebssystem keine Kontrolle hat. 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.
Wann Sie sich ducken sollten
Es liegt zwar in der Verantwortung des jeweiligen OEM, festzulegen, wie die Stummschaltung von Audioinhalten durch die HAL verarbeitet wird, wir empfehlen jedoch einige allgemeine Richtlinien. Wenn in Android mehrere Streams gleichzeitig wiedergegeben werden, liegt das in der Regel daran, dass zwei Apps/Dienste gleichzeitig den Audiofokus haben. In der Interaktionsmatrix erfahren Sie, wann Android den gleichzeitigen Fokus gewähren kann und wann es daher möglich ist, dass zwei unterschiedliche Streams gleichzeitig wiedergegeben werden.
Beachte, dass von Android zusammengeführte Streams vor der Anwendung von Gewinnen zusammengeführt werden. Daher sollten alle Streams, die bei gleichzeitiger Wiedergabe leiser gestellt werden sollen, an separate Ausgabegeräte weitergeleitet werden, damit die HAL die Stummschaltung anwenden kann, bevor sie zusammengeführt werden.
Empfohlenes Verhalten beim Ducking
Bei den folgenden potenziellen gleichzeitigen Interaktionen empfehlen wir, die Funktion „Ducking“ anzuwenden:
EMERGENCY
: Alles außerSAFETY
leiser stellen oder stummschalten, damit der Fahrer den Ton hörtSAFETY
. Dämpfe alle Töne außerEMERGENCY
, damit der Fahrer den Ton hört.NAVIGATION
: Alles außerSAFETY
undEMERGENCY
ausblendenCALL
: Alles außerSAFETY
,EMERGENCY
undNAVIGATION
ausblendenVOICE
. EnteCALL_RING
- Es liegt in der Verantwortung der OEMs, die Wichtigkeit der aktiven
VEHICLE_SOUNDS
festzulegen und zu entscheiden, ob andere Töne gedimmt werden sollten, damit der Fahrer sie gut hört. MUSIC
undANNOUNCEMENT
sollten von allen Elementen ausgeblendet werden. Die Hauptausnahme bilden Töne für Touch-Interaktionen, die derzeit alsSYSTEM_SOUND
wiedergegeben werden.
Weitere Hinweise zum Ducking
Einige Apps/Dienste wie Navigation oder Assistent verwenden möglicherweise mehrere Spieler, um ihre Aktionen auszuführen. OEMs sollten vermeiden, die Stummschaltung zu aggressiv aufzuheben, wenn die Streamdaten nicht mehr über diese Ausgabegeräte übertragen werden. So wird verhindert, dass die Medien kurzzeitig wieder auf volle Lautstärke zurückgesetzt werden, bevor sie wieder stummgeschaltet werden, wenn die nächste Wiedergabe über die Navigations- oder Assistant-App beginnt.
Bei Fahrzeugen mit mehreren Lautsprechern mit ausreichender Isolierung besteht auch die Möglichkeit, den Audiostream an verschiedene Bereiche des Fahrzeugs weiterzuleiten, anstatt ihn auszublenden. So können Navigationsanweisungen beispielsweise an die Lautsprecher in der Kopfstütze des Fahrers geleitet werden, während die Musik in der Kabine mit normaler Lautstärke weiter abgespielt wird.
Für die Sicherheit wichtige Töne
In Android 11 wurden HAL-Audio-Konzentrations-APIs eingeführt. Es liegt jedoch weiterhin in der Verantwortung der HAL, dafür zu sorgen, dass sicherheitskritische Töne gegenüber anderen priorisiert werden. Auch wenn die HAL den Audiofokus für USAGE_EMERGENCY
hält, ist nicht garantiert, dass Apps und Dienste unter Android keine Töne abspielen. Es liegt an der HAL, zu bestimmen, welche Streams von Android gemischt oder stummgeschaltet werden sollen, wenn sicherheitskritische Töne abgespielt werden.
Benutzeroberfläche für die Lautstärkeeinstellungen konfigurieren
In AAOS ist die Benutzeroberfläche für die Volume-Einstellungen von der Volume-Gruppenkonfiguration getrennt, die wie unter „Volume-Gruppen konfigurieren“ beschrieben überlagert werden kann. Durch diese Trennung sind keine Änderungen erforderlich, wenn sich die Konfiguration der Volumegruppen in Zukunft ändert.
In der Benutzeroberfläche der Autoeinstellungen enthält die packages/apps/Car/Settings/res/xml/car_volume_items.xml
-Datei UI-Elemente (Titel- und Symbolressourcen), die mit jeder definierten AudioAttributes.USAGE
verknüpft sind. Diese Datei ermöglicht eine angemessene Darstellung der definierten VolumeGroups
, indem Ressourcen verwendet werden, die mit der ersten erkannten Verwendung in jeder VolumeGroup verknüpft sind.
Im folgenden Beispiel wird beispielsweise eine VolumeGroup so definiert, dass sie sowohl voice_communication
als auch voice_communication_signalling
enthält. Bei der Standardimplementierung der Benutzeroberfläche für die Autoeinstellungen wird die VolumeGroup mit den Ressourcen gerendert, die mit voice_communication
verknüpft sind, da dies die erste in der Datei ist.
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto"> <item car:usage="voice_communication" car:title="@*android:string/volume_call" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="voice_communication_signalling" car:title="@*android:string/volume_call" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="media" car:title="@*android:string/volume_music" car:icon="@*android:drawable/ic_audio_media"/> <item car:usage="game" car:title="@*android:string/volume_music" car:icon="@*android:drawable/ic_audio_media"/> <item car:usage="alarm" car:title="@*android:string/volume_alarm" car:icon="@*android:drawable/ic_audio_alarm"/> <item car:usage="assistance_navigation_guidance" car:title="@string/navi_volume_title" car:icon="@drawable/ic_audio_navi"/> <item car:usage="notification_ringtone" car:title="@*android:string/volume_ringtone" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistant" car:title="@*android:string/volume_unknown" car:icon="@*android:drawable/ic_audio_vol"/> <item car:usage="notification" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_communication_request" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_communication_instant" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_communication_delayed" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_event" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistance_accessibility" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistance_sonification" car:title="@*android:string/volume_unknown" car:icon="@*android:drawable/ic_audio_vol"/> <item car:usage="unknown" car:title="@*android:string/volume_unknown" car:icon="@*android:drawable/ic_audio_vol"/> </carVolumeItems>
Die in der obigen Konfiguration verwendeten Attribute und Werte werden in packages/apps/Car/Settings/res/values/attrs.xml
deklariert. Die Benutzeroberfläche für die Lautstärkeeinstellungen verwendet die folgenden VolumeGroup-basierten CarAudioManager APIs:
getVolumeGroupCount()
, um zu wissen, 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.