Volume-Verwaltung

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ßer SAFETY ausblenden oder stummschalten, dafür sorgen, dass der Fahrer den Ton hört
  • SAFETY Entferne alles außer EMERGENCY, um sicherzustellen, der Fahrer das Geräusch hört
  • NAVIGATION Entferne alles außer SAFETY und EMERGENCY
  • CALL Entferne alles außer SAFETY, EMERGENCY und NAVIGATION
  • VOICE Ente CALL_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 und ANNOUNCEMENT sollten von allem entdeckt werden. Die größte Ausnahme sind Töne für die Touchbedienung, die derzeit als SYSTEM_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() und getGroupMaxVolume(), um die Unter- und Obergrenze zu erhalten.
  • getGroupVolume(), um die aktuelle Lautstärke abzurufen.
  • registerVolumeChangeObserver(), um bei Lautstärkeänderungen benachrichtigt zu werden.