Kierowanie dźwięku

W Androidzie 10 car_audio_configuration.xml zastępuje car_volumes_groups.xml i IAudioControl.getBusForContext. W nowym pliku konfiguracji zdefiniowano listę stref. W każdej strefie obowiązuje co najmniej 1 grup głośności z powiązanymi urządzeniami, a każde urządzenie ma kontekst, powinien być kierowany w obrębie tej strefy. Musisz uwzględnić wszystkie konteksty w każdej strefie.

Konfigurowanie kierowania dźwięku

Pliki zasad audio, które zwykle znajdują się na partycji dostawcy, reprezentują konfiguracji sprzętowej płytki. Wszystkie urządzenia wymienione w Pole car_audio_configuration.xml musi być zdefiniowane w tagu audio_policy_configuration.xml

Włączam routing AAOS

Aby używać routingu w oparciu o AAOS, musisz ustawić Flaga audioUseDynamicRouting do użytkownika true:

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

Gdy false, routing i znaczna część obszaru CarAudioService zostaną wyłączone i system operacyjny wróci do domyślnego działania z AudioService.

Główna strefa

Domyślnie cały dźwięk będzie kierowany do strefy głównej. Można tam znaleźć tylko być jedną strefą główną wskazaną w konfiguracji przez atrybut isPrimary="true"

Przykładowa konfiguracja

Na przykład pojazd może mieć 2 strefy: główną i tylną. system multimedialny. Dzięki temu możliwe car_audio_configuration.xml została zdefiniowana w ten sposób:

<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>

W tym przypadku strefa główna oddzielyła konteksty na różne urządzenia. Dzięki temu HAL, aby stosować różne efekty końcowe i miksować na poszczególnych urządzeniach wyjściowych za pomocą elementów wyposażenia pojazdu. Urządzenia są podzielone na 4 grupy głośności: multimedia, nawigacja, połączenia i alarmy. Jeśli system jest skonfigurowany do useFixedVolume, zostaną przekazane poziomy głośności każdej grupy na interfejs HAL, aby zastosować go do danych wyjściowych tych urządzeń.

W strefie dodatkowej oczekiwane dane wyjściowe pochodzą z jednego urządzenia wyjściowego. W tym przykładzie wszystkie przypadki użycia są kierowane do jednego urządzenia i grupy woluminów Uprość wszystko.

Konfiguracja dźwięku w strefie osób

W Androidzie 11 system car_audio_configuration.xml został dodatkowo rozszerzony do wprowadź dwa nowe pola: audioZoneId i occupantZoneId. Pierwszych, audioZoneId, można używać do lepszego zarządzania strefami. Z kolei środowisko occupantZoneId może służyć do konfigurowania identyfikatora użytkownika na podstawie identyfikatora użytkownika, .

Aby można było korzystać z tych nowych pól, wersja 2 car_audio_configuration.xml jest Wracam do powyższej konfiguracji audio, ale korzystam z nowego pola identyfikator strefy użytkownika i mapowanie identyfikatora strefy audio, nowa konfiguracja bez głośności. definicje grup można skonfigurować w ten sposób:

<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>

Powyższa konfiguracja definiuje mapowanie strefy głównej na strefę 0 użytkowników. audioZoneId 1 do occupantZoneId 1. Ogólnie każde mapowanie można skonfigurować między strefą użytkownika i dźwiękiem, ale mapowanie musi odbywać się w trybie „jeden do jednego”. Oto reguły, które zdefiniowały te 2 nowe pola:

  • audioZoneId strefy głównej zawsze wynosi 0
  • Numery audioZoneId i occupantZoneId nie mogą się powtarzać
  • Mapowanie audioZoneId i occupantZoneId może mieć tylko mapowanie 1 do 1

Routing przez identyfikator UID aplikacji

W 10 aplikacjach CarAudioManager wprowadzono szereg ukrytych interfejsów API, aby umożliwić aplikacjom zapytania, ustawianie stref audio i skupienie się na nich.

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

Powyższe interfejsy API zezwalały własnym aplikacjom do zarządzania routingiem audio na podstawie w UID aplikacji. Oznacza to, że zarówno identyfikator strefy audio, jak i UID aplikacji są które są potrzebne. Mając te informacje, można ustawić routing dźwięku za pomocą Interfejs API CarAudioManager#setZoneIdForUid.

Zmienianie stref w przypadku aplikacji

Domyślnie wszystkie trasy audio do strefy głównej. Aby zaktualizować aplikację tak, aby była kierowany do innej strefy, użyj 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");
}

Płn. Uwaga: strumienie i fokus nie mogą dynamicznie przełączać się stref. Dlatego odtwarzanie musi zostać zatrzymane i trzeba ponownie ustawić ostrość, aby zmienić strefę.

Routing z wykorzystaniem identyfikatora użytkownika

Z kolei routing na podstawie identyfikatora UID aplikacji zapewnia precyzyjną kontrolę routingu audio, wymaga również zdefiniowania takiego kierowania dla każdej aplikacji do aplikacji, która rzeczywiście prosi o zaznaczenie dźwięku i je odtwarza. Aby temu zaradzić i ułatwiać aplikacjom innych firm odtwarzanie dźwięku bez modyfikacji, CarAudioService używa mapowania strefy pasażera i strefy audio, aby określić routingu na podstawie identyfikatora użytkownika. Dzięki temu, gdy użytkownik zaloguje się w strefie pasażera, usługa została powiadomiona. W przypadku tego sygnału zarządzanie skupieniem dźwięku i przekierowanie są automatycznie skonfigurowana we wszystkich strefach audio.

Możesz nadal używać routingu w oparciu o identyfikator UID aplikacji, ale musisz to robić niezależnie identyfikatora użytkownika. Oznacza to, że jeśli mapowanie stref pasażerów na strefy audio w samochodzie jest to kierowanie ruchem oparte na UID jest wyłączone i próba wywołania CarAudioManager#setZoneidForUid zgłosi błąd.

Uprościliśmy kierowanie dźwięku i zarządzanie ostrością dzięki funkcji Strefy obecności użytkownik musi być przypisany do strefy gości. Może to zrobić: za pomocą funkcji CarOccupantZoneManager#assignProfileUserToOccupantZone. Ten Interfejs API wymaga uprawnień do zarządzania użytkownikami. Obecne wymagania wobec dostawców OEM w zakresie zarządzania przypisanie użytkownika do strefy za pomocą interfejsu użytkownika systemu. Po wykonaniu tych czynności zgłoszenie uruchamianie, routing audio i zarządzanie ostrością zostaną automatycznie skonfigurowane dla użytkownika.

Routing z ustawieniem setPreferredDevice

Oprócz powyższych zmian Android 11 ma również nowy interfejs API do wysyłania zapytań dotyczących urządzeń wyjściowych powiązane z poszczególnymi strefami, CarAudioManager#getOutputDeviceForUsage(intzoneId, int use).

Interfejs API może służyć do wysyłania zapytań do urządzenia wyjściowego dotyczących określonej strefy i atrybutu audio. i ich wykorzystaniu. Dzięki temu własne aplikacje mogą kierować dźwięk do różnych stref, za pomocą interfejsu API odtwarzacza setPreferredDevice. Wymagania interfejsu API: getOutputDeviceForUsage PERMISSION_CAR_CONTROL_AUDIO_SETTINGS to systemowy interfejs API. Poniżej znajdziesz przykład znajdowania urządzenia multimedialnego w konkretnej strefie i kierowania na nie urządzenia za pomocą interfejsu API setPreferredDevice.

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