Audiorouting

In Android 10 ersetzt car_audio_configuration.xml car_volumes_groups.xml und IAudioControl.getBusForContext. In der neuen Konfigurationsdatei ist eine Liste von Zonen definiert. Jede Zone hat eine oder mehrere und jedes Gerät hat die Kontexte, innerhalb dieser Zone verlegt werden. Alle Kontexte müssen repräsentiert sein in jeder Zone.

Audiorouting konfigurieren

Die Audiorichtliniendateien, die sich in der Regel in der Anbieterpartition befinden, der Audiohardwarekonfiguration des Boards. Alle Geräte, auf die verwiesen wird in car_audio_configuration.xml muss im audio_policy_configuration.xml.

AAOS-Routing aktivieren

Um AAOS-basiertes Routing zu verwenden, müssen Sie den Parameter Flag audioUseDynamicRouting in true:

<resources>
    <bool name="audioUseDynamicRouting">true</bool>
</resources>

Wenn false, werden Routing und ein Großteil von CarAudioService deaktiviert und Das Betriebssystem greift auf das Standardverhalten von AudioService zurück.

Primäre Zone

Standardmäßig werden alle Audiodaten an die primäre Zone geleitet. Es können nur eine primäre Zone sein, die in der Konfiguration durch das Attribut isPrimary="true"

Beispielkonfiguration

Zum Beispiel könnte ein Fahrzeug zwei Zonen haben: eine primäre Zone und einen Rücksitz. Unterhaltungssystem. Damit könnte ein car_audio_configuration.xml wie folgt definiert:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

Hier hat die primäre Zone verschiedene Kontexte für verschiedene Geräte getrennt. Dies ermöglicht den HAL, um verschiedene Nachbearbeitungseffekte und Mischen auf die einzelnen Geräteausgaben anzuwenden. mit der Hardware des Fahrzeugs. Die Geräte sind in vier Volumengruppen unterteilt: Medien, Navigation, Anrufe und Wecker. Wenn das System so konfiguriert ist, useFixedVolume, dann werden die Lautstärkepegel für jede Gruppe übergeben. auf den HAL, der auf die Ausgabe dieser Geräte angewendet wird.

Für die sekundäre Zone wird die Ausgabe über ein einzelnes Ausgabegerät erwartet. In diesem Beispiel werden alle Nutzungen an das einzelne Gerät und die und die Dinge einfach halten.

Audiokonfiguration der Insassenzone

In Android 11 wurde car_audio_configuration.xml weiter auf werden zwei neue Felder eingeführt: audioZoneId und occupantZoneId. Die erste, audioZoneId, kann zur besseren Steuerung der Zonenverwaltung verwendet werden. Mit occupantZoneId kann dagegen die User-ID-basierte Konfiguration Routenplanung.

Um diese neuen Felder zu verwenden, ist V2 von car_audio_configuration.xml erforderlich. Wir gehen noch einmal auf die Audiokonfiguration oben zurück, verwenden aber das neue Feld für ID der Insassenzone und Zuordnung der Audiozone, die neue Konfiguration ohne Lautstärke Gruppendefinitionen können folgendermaßen eingerichtet werden:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

Die obige Konfiguration definiert eine Zuordnung der primären Zone zur Insassenzone 0. audioZoneId 1 bis occupantZoneId 1. Im Allgemeinen Insassenbereich und Audiobereich können konfiguriert werden, die Zuordnung muss jedoch 1:1 erfolgen. Dies sind die Regeln, anhand derer die beiden neuen Felder definiert wurden:

  • audioZoneId für die primäre Zone ist immer null
  • audioZoneId- und occupantZoneId-Nummern dürfen nicht wiederholt werden
  • audioZoneId und occupantZoneId können nur eine 1:1-Zuordnung haben

Routing über eine Anwendungs-UID

In 10 wurden in CarAudioManager eine Reihe verborgener APIs eingeführt, um Apps zu ermöglichen. um Audiozonen und den Fokus festzulegen.

int[] getAudioZoneIds();
int getZoneIdForUid(int uid);
boolean setZoneIdForUid(int zoneId, int uid);
boolean clearZoneIdForUid(int uid);

Mit den oben genannten APIs kann eine Erstanbieteranwendung Audiorouting-basierte auf der UID einer Anwendung. Daher ist sowohl die Audiozonen-ID als auch die UID der Anwendung auch erforderlich. Anhand dieser Informationen kann das Audio-Routing mit dem CarAudioManager#setZoneIdForUid-API.

Zonen für eine App ändern

Standardmäßig werden alle Audio-Routen zur primären Zone geleitet. Um eine Anwendung auf An eine andere Zone weitergeleitet, verwenden Sie CarAudioManager#setZoneIdForUid:

// Find zone to play
int zoneId = ...

// Find application's uid
Int uid = mContext.getPackageManager()
        .getApplicationInfo(mContext.getPackageName(), 0)
        .uid;

if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) {
    Log.d(TAG, "Zone successfully updated");
} else {
    Log.d(TAG, "Failed to change zone");
}

N Hinweis:Bei Streams und Fokus kann der Bereich nicht dynamisch gewechselt werden. Dementsprechend wird muss die Wiedergabe angehalten und der Fokus neu auf das Wechseln der Zonen angefordert werden.

Routing mit Nutzer-ID

Während das UID-basierte Routing einer Anwendung die Feinsteuerung der Audiorouting ist es außerdem erforderlich, dass das Audiorouting für jede Anwendung vorab definiert wird an die Anwendung anfordert, die den Audiofokus anfordert und Audio wiedergibt. Um dies zu vermeiden Drittanbieter-Apps die Ausgabe von Audioinhalten ohne Modifizierung zu ermöglichen und diese zu ermöglichen, CarAudioService verwendet die Zuordnung von Insassenbereichen und Audiozonen, um zu definieren, das auf Nutzer-IDs basierende Routing. Wenn sich ein Nutzer dann im Insassenbereich anmeldet, wird das Audio des Autos wenn der Dienst benachrichtigt wird. Mit diesem Signal werden Audiofokusverwaltung und Routing automatisch die für alle Audiozonen konfiguriert sind.

UID-basiertes Routing von Anwendungen kann weiterhin verwendet werden, muss jedoch unabhängig von Nutzer-ID-Routing. Wenn also die Zuordnung der Insassenzone zum Audiobereich des Autos wird das UID-basierte Routing deaktiviert und es wird versucht, CarAudioManager#setZoneidForUid gibt einen Fehler aus.

Audiorouting und Fokusverwaltung wurden zwar mit Insassenbereichen vereinfacht muss der Nutzer trotzdem einer Insassenzone zugewiesen sein. Dies kann durch mit CarOccupantZoneManager#assignProfileUserToOccupantZone. Dieses Die API benötigt die Berechtigung zum Verwalten von Nutzern. Derzeit wird davon ausgegangen, dass OEMs Zuweisung von Insassenbereichen über eine Art System-UI. Sobald das erledigt ist, Starten, Audiorouting und Fokusverwaltung werden automatisch für den Nutzer konfiguriert.

Routing mit setPreferredDevice

Neben den oben genannten Änderungen bietet Android 11 auch eine neue API zur Abfrage von Ausgabegeräten CarAudioManager#getOutputDeviceForUsage(int zoneId, int usage) ein.

Mit der API kann ein Ausgabegerät für eine bestimmte Zone und ein Audioattribut abgefragt werden Nutzung. Auf diese Weise können Erstanbieter-Apps mithilfe der setPreferredDevice API des Players. Die getOutputDeviceForUsage API erfordert PERMISSION_CAR_CONTROL_AUDIO_SETTINGS und ist eine System-API. Unten sehen Sie eine Beispiel für die Suche nach dem Mediengerät für eine bestimmte Zone und das Routing zu diesem Gerät mit der setPreferredDevice API.

audioZoneId = ... ;
mediaDeviceInfo = mCarAudioManager
            .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA);
…
mPlayer.setPreferredDevice(mediaDeviceInfo);