AAOS verfügt über eine eigene Volume-Verwaltung in CarAudioService
. Sie verwendet korrigierte
Volumes mit der Erwartung, dass Volumes unterhalb des HAL von einer Hardware angewendet werden sollen
als Verstärker statt in der Software. Außerdem werden Ausgabegeräte in Volume-Gruppen unterteilt.
, um dieselben Verbesserungen auf alle Geräte anzuwenden, die mit der Volume-Gruppe verknüpft sind.
Feste Volumes verwenden
Bei AAOS-Implementierungen sollte die Lautstärke mit einem Hardwareverstärker anstelle eines
Softwaremixer. Legen Sie das Flag config_useFixedVolume
fest, um Nebenwirkungen zu vermeiden
auf true (Overlay bei Bedarf):
<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,
Anwendungen können AudioManager.setStreamVolume()
aufrufen und die
Lautstärke nach Streamtyp im Softwaremixer. Dies kann aus folgenden Gründen unerwünscht sein:
die möglichen Auswirkungen auf andere Anwendungen
und die Tatsache, dass die Lautstärkeverringerung
führt der Softwaremixer dazu, dass weniger signifikante Bits im Signal verfügbar sind, wenn
am Hardwareverstärker empfangen.
Volume-Gruppen
Mithilfe von Volume-Gruppen werden die Volumes für eine Sammlung von Geräten in einer Audiozone verwaltet. Für jede Lautstärkegruppe kann die Lautstärke einzeln gesteuert werden. Verstärkungen werden auf den zugehörigen Geräten konfiguriert und vom Verstärker des Fahrzeugs übernommen. Die Lautstärkeeinstellungen bleiben für den Nutzer bestehen und werden 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>
Beispiel für die Implementierung von car_audio_configuration.xml
.
Jede Volume-Gruppe sollte ein oder mehrere Ausgabegeräte mit zugehörigen Adressen enthalten.
Diese Adressen sollten den in den folgenden Adressen definierten Ausgabegeräten entsprechen:
audio_policy_configuration.xml
Verbesserungen für Volume-Gruppen konfigurieren
Jede Volume-Gruppe hat einen Mindest-, Höchst- und Standardwert für die Verstärkung sowie
einer Schrittgröße. Diese werden anhand der Werte ermittelt, die in den
audio_policy_configuration.xml
für die verknüpften Geräte
mit der Volume-Gruppe.
<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 überprüft die Volume-Gruppe die Verstärkungswerte der zugehörigen Geräte und konfigurieren die Gruppe wie folgt:
- 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 unter den 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 Eine Lautstärkegruppe, die außerhalb des Bereichs liegt, 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 Mindest- oder Höchstwert des Geräts festgelegt. Je nachdem, ob der Wert der Volumengruppe über oder unter dem Bereich liegt, wird der Wert erhöht.
Volume-Gruppen-IDs
Volume-Gruppen werden zur Laufzeit anhand ihrer Definition in der XML-Datei identifiziert.
IDs reichen von 0 bis N-1 innerhalb eines Audiobereichs, wobei N die Anzahl der Lautstärkegruppen in
in diesem Bereich. So sind die IDs der Volume-Gruppen nicht zonenübergreifend eindeutig. Diese Kennungen
werden für CarAudioManager
APIs verwendet, die mit Volume-Gruppen verknüpft sind. Alle APIs
die einen groupId
ohne zoneId
verwendet, wird standardmäßig
primäre Audiozone.
Volume-Verwaltung in mehreren Zonen
Jeder Audiobereich muss mindestens eine Lautstärkegruppe haben.
nur einer einzelnen Audiozone zugeordnet ist. Diese Beziehung ist definiert als Teil
car_audio_configuration.xml
Siehe Beispiel in
Volume-Gruppen definieren oben.
Die aktuellen Lautstärkepegel für jede Zone werden für den Benutzer, der mit in diesem Bereich. Diese Einstellungen sind zonenspezifisch, das heißt, wenn sich ein Nutzer auf einem Display anmeldet. die der primären Zone zugeordnet ist, und melden sich später in einer Zone an, einer sekundären Audiozone wird die Lautstärke für den ersten Bereich unterscheiden sich von denen für die sekundäre Zone.
Volumen-Schlüsselereignisse verarbeiten
Android definiert mehrere Keycodes zur Lautstärkeregelung, darunter:
KEYCODE_VOLUME_UP
, KEYCODE_VOLUME_DOWN
und
KEYCODE_VOLUME_MUTE
Standardmäßig leitet Android die Lautstärketaste weiter
bis hin zu Anwendungen. Implementierungen in der Automobilbranche sollten dazu führen,
CarAudioService
, die dann setGroupVolume
aufrufen können oder
setMasterMute
.
Um dieses Verhalten zu erzwingen, legen Sie den config_handleVolumeKeysInWindowManager
fest.
Flag zu true
:
<resources> <bool name="config_handleVolumeKeysInWindowManager">true</bool> </resources>
Bei Volumen-Schlüsselereignissen kann derzeit nicht unterschieden werden, in welcher Zone sie sich befinden
Es wird davon ausgegangen, dass alle mit der primären Audiozone verknüpft sind.
Wenn ein Lautstärke-Schlüsselereignis eingeht, legt CarAudioService
die Lautstärke fest
Gruppe zum Anpassen, indem Sie die Audiokontexte für die aktiven Player abrufen und dann anpassen
Die Volume-Gruppe mit dem Ausgabegerät mit der höchsten Priorität
Audiokontext. Die Priorisierung wird anhand einer festen Reihenfolge bestimmt, die in
CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
Überblenden und ausbalancieren
Beide Versionen des AudioControl HAL enthalten APIs zum Ein- und Ausblenden von Ein- und Ausblendungen
des Fahrzeugs. Es gibt entsprechende System-APIs für CarAudioManager, die Werte übergeben.
zum HAL von AudioControl. Diese APIs erfordern
android.car.permission.CAR_CONTROL_AUDIO_VOLUME
Die AudioControl-APIs sind:
setBalanceTowardRight(float value)
Verändert die Lautstärke des Lautsprechers in Richtung rechte (+) oder linke (-) Seite des Autos an. 0,0 ist zentriert, +1,0 bedeutet, -1, 0 steht ganz links und ein Wert außerhalb des Bereichs -1 bis 1 gilt als Fehler.setFadeTowardFront(float value)
: Verändert die Lautstärke des Lautsprechers in Richtung vorne (+) oder hinten (-) am Fahrzeug. 0,0 ist zentriert, +1,0 bedeutet vollständige Vorwärtsbewegung, -1, 0 bedeutet vollständig rückwärts und ein Wert außerhalb des Bereichs -1 bis 1 ist ein Fehler.
Die OEMs entscheiden selbst, wie diese Werte angewendet werden die den Nutzern angezeigt werden. Sie könnten ausschließlich auf Medien oder Android-Sounds zu verwenden.
Mit Android 11 wird auch die Anwendung von Audioeffekten auf Ausgabegeräte unterstützt. So könnt ihr das Aus- und Gleichgewicht auch über Audioeffekte steuern. nicht über diese APIs, sondern auf den entsprechenden Ausgabegeräten.
Audio-Ducking
Audio-Ducking tritt auf, wenn das Fahrzeug die Verstärkung für einen Stream reduziert. So sind andere Streams, die zur selben Zeit laufen, besser zu hören. In AAOS Audio-Ducking muss über den HAL implementiert werden, da möglicherweise viele Töne außerhalb von Android, auf die das Betriebssystem keine Kontrolle hat. In Android 11 sind die wichtigsten Informationen HAL für Ducking-Entscheidungen zur Verfügung steht, ist, ob zwei Ausgabegeräte aktive Streams.
Wann du dich verstecken solltest
Es ist zwar Aufgabe des jeweiligen OEMs, festzulegen, wie der Ducking von seinem HAL gehandhabt wird, empfehlen wir Ihnen ein paar allgemeine Richtlinien. Wenn mehrere Streams unter Android abgespielt werden, am häufigsten tritt auf, wenn zwei Apps/Dienste den Audiofokus gleichzeitig halten. Vor diesem Hintergrund Siehe Interaktionsmatrix um zu erfahren, wann Android einen gleichzeitigen Fokus gewähren kann. mehrere Streams gleichzeitig abzuspielen.
Denken Sie daran, dass alle von Android gemischten Streams vor allen Vorteilen verfügbar sein werden. angewendet werden. Daher werden Streams, die gleichzeitig mit einem Duck-Player wiedergegeben werden, sollte an separate Ausgabegeräte weitergeleitet werden, damit der HAL ein Ducking anwenden kann, wenn Sie sie kombinieren.
Empfohlenes Ducking-Verhalten
Für die folgenden potenziellen gleichzeitigen Interaktionen empfehlen wir, Ducking zu nutzen. angewendet werden:
EMERGENCY
Sie können alle Elemente außerSAFETY
ausblenden oder stummschalten, dafür sorgen, dass der Fahrer den Ton hörtSAFETY
Entferne alles außerEMERGENCY
, um sicherzustellen, der Fahrer das Geräusch hörtNAVIGATION
Entferne alles außerSAFETY
undEMERGENCY
CALL
Entferne alles außerSAFETY
,EMERGENCY
undNAVIGATION
VOICE
EnteCALL_RING
- Die OEMs müssen selbst entscheiden, wie wichtig die aktiven
VEHICLE_SOUNDS
sind. und ob andere Geräusche herausgefiltert werden sollen, damit der Fahrer sie hört. MUSIC
undANNOUNCEMENT
sollten von allem entdeckt werden. Die größte Ausnahme sind Töne für die Touchbedienung, die derzeit alsSYSTEM_SOUND
Weitere Überlegungen beim Ducking
Einige Apps/Dienste wie Navigation oder Assistant verwenden möglicherweise mehrere Player, um den Vorgang abzuschließen. ihre Handlungen. OEMs sollten das Entfernen zu aggressiv vermeiden, je nachdem, wann die Streamdaten beendet werden. die über diese Ausgabegeräte kommen, um sicherzustellen, dass der Nutzer volle Lautstärke ein, bevor sie bei der nächsten Wiedergabe aus der Navigation oder Assistant-App beginnt.
Bei Fahrzeugen mit mehreren Geräuschphasen mit ausreichender Abgrenzung können Sie auch um den Ton an verschiedene Stellen im Auto weiterzuleiten. Zum Beispiel die Navigation Anweisungen können an die Kopfstützenlautsprecher des Fahrers geleitet werden, während die Musik weiter abgespielt wird. im gesamten Innenraum mit normaler Lautstärke abgespielt werden.
Sicherheitskritische Geräusche
Während der Einführung von Android 11
HAL Audio Focus APIs
Es ist immer noch im HAL, um sicherzustellen, dass sicherheitsrelevante Geräusche priorisiert werden.
andere. Selbst wenn der HAL den Audiofokus für USAGE_EMERGENCY
enthält,
dass Apps und Dienste unter Android keine Töne wiedergeben. Es liegt an der HAL,
Bestimmen, welche Streams von Android gemischt oder stummgeschaltet werden sollen, da sicherheitsrelevante Geräusche
gespielt haben.
UI für Volume-Einstellungen konfigurieren
AAOS entkoppelt die Benutzeroberfläche für Volume-Einstellungen von der Konfiguration der Volume-Gruppe (die wie unter „Volume-Gruppen konfigurieren“ beschrieben eingeblendet). Durch diese Trennung wird sichergestellt, Änderungen sind erforderlich, wenn sich die Konfiguration der Volume-Gruppen in Zukunft ändert.
In der Benutzeroberfläche der Autoeinstellungen enthält die packages/apps/Car/Settings/res/xml/car_volume_items.xml
Datei enthält UI-Elemente (Titel- und Symbolressourcen), die den einzelnen definierten
AudioAttributes.USAGE
. Diese Datei ermöglicht ein angemessenes Rendering
Den definierten VolumeGroups
, indem Ressourcen verwendet werden, die mit der ersten
die in jeder VolumeGroup enthalten ist.
Im folgenden Beispiel wird eine VolumeGroup so definiert, dass sie beides enthält:
voice_communication
und voice_communication_signalling
. Standardeinstellung
Implementierung der Benutzeroberfläche für Autoeinstellungen rendert die VolumeGroup mithilfe der Ressourcen, die dem
voice_communication
ist das erste Zeichen in der Datei.
<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 deklariert.
packages/apps/Car/Settings/res/values/attrs.xml
Lautstärkeeinstellungen
In der Benutzeroberfläche werden die folgenden VolumeGroup-basierten CarAudioManager APIs verwendet:
getVolumeGroupCount()
, um festzulegen, wie viele Steuerelemente gezeichnet werden sollen.getGroupMinVolume()
undgetGroupMaxVolume()
, um die Unter- und Obergrenze zu erhalten.getGroupVolume()
, um die aktuelle Lautstärke abzurufen.registerVolumeChangeObserver()
, um bei Lautstärkeänderungen benachrichtigt zu werden.