Usługa audio w samochodzie korzysta z dynamicznych zasad audio Core Audio, aby ułatwić korzystanie z niej w samochodach.
Oddzielne odtwarzanie dźwięku dla każdego pasażera, zwane dźwiękiem wielostrefowym, w którym każda strefa umożliwia jednoczesne odtwarzanie dźwięku.
konfiguracja dynamicznej strefy audio,
Transmisja audio w głównej strefie pasażera.
Kopia lustrzana dźwięku pasażera.
W każdym przypadku użycia usługa audio w samochodzie korzysta z dynamicznych zasad audio, aby automatycznie kierować dźwięk do wyznaczonego urządzenia wyjściowego.
Dźwięk wielostrefowy
Dźwięk w wielu strefach umożliwia jednoczesne korzystanie z AAOS przez kilku użytkowników. Z każdą strefą jest powiązany zestaw urządzeń wyjściowych, a każda strefa utrzymuje fokus audio i poziom głośności. Pasażerowie mogą słuchać dźwięku, a kierowca – innego źródła w strefie głównej (zazwyczaj w głównej kabinie).
Architektura dźwięku wielostrefowego
Rysunek 1. Architektura usługi audio w samochodzie.
Strefy audio w samochodzie to abstrakcja wyjść audio, ostrości dźwięku i innych ustawień audio, którymi można zarządzać niezależnie. Na potrzeby routingu każda strefa jest definiowana jako zestaw urządzeń magistrali wyjściowej audio, zgodnie z konfiguracją zasad audio. Urządzenia różnią się w zależności od definicji strefy audio. Na rysunku 1 urządzenia magistrali od 1 do 5 należą do strefy 0, urządzenia magistrali od 6 do 8 należą do strefy 1, a urządzenia magistrali od 9 do 11 należą do strefy 2.
Konfiguracja samochodowego systemu audio
Zwykle urządzenia wyjściowe są przypisywane do jednej strefy audio. Każda strefa audio jest zdefiniowana w car_audio_configuration.xml
. Poniższy fragment kodu pokazuje konfigurację dźwięku w samochodzie na potrzeby rysunku 1:
<carAudioConfiguration version="3">
<zones>
<zone name="Zone0" audioZneId="0" occupantZoneId="0">
<zoneConfigs>
<zoneConfig name="config0" isDefault="true">
<volumeGoups>
<group>
<device address="bus_1">
<context context="music"/>
</device>
</group>
<group>
<device address="bus_2">
<context context="navigation"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
<zone name="Zone1" audioZoneId="1" occupantZoneId="1">
<zoneConfigs>
<zoneConfig name="config0" isDefault="true">
<volumeGroups>
<group>
<device address="bus_6">
<context context="music"/>
</device>
</group>
<group>
<device address="bus_7">
<context context="navigation"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
...
...
</zones>
</carAudioConfiguration>
occupantZoneId
to definicja usługi samochodowej zarządzana przez CarOccupantZoneManager
. Jest używany w samochodach do określania mapowania użytkownika w samochodzie na konkretne miejsce. CarOccupantZoneService
określa też mapowanie strefy użytkownika na wyświetlacze, inne urządzenia peryferyjne i użytkownika po zalogowaniu się na wyświetlaczu. Strefa audio ma:
Identyfikator strefy audio i identyfikator strefy użytkownika.
- Mapowanie strefy audio na strefę użytkownika (siedzenie, wyświetlacze i inne urządzenia peryferyjne)
- Mapowanie identyfikatora użytkownika przypisanego do strefy audio po zalogowaniu się
Lista konfiguracji dźwięku. Każda konfiguracja dźwięku ma zestaw grup głośności. Każda grupa głośności ma zestaw urządzeń magistrali audio.
Gdy zmienisz głośność, wszystkie urządzenia audio w grupie będą sterowane w ten sam sposób.
Każdemu urządzeniu audio przypisana jest lista atrybutów audio. Te informacje są wykorzystywane do tworzenia miksów zasad audio z różnie przypisanymi atrybutami audio.
Taka konfiguracja umożliwia kierowanie różnych zastosowań atrybutów audio do różnych urządzeń wyjściowych w każdej strefie. W zależności od przypadku użycia różne dźwięki mogą być odtwarzane jednocześnie. Możesz na przykład skonfigurować główną kabinę (strefę podstawową) tak, aby dźwięki multimediów były odtwarzane na wszystkich głośnikach, a dźwięki nawigacji tylko na głośnikach najbliżej kierowcy. Dzięki jednoczesnemu odtwarzaniu dźwięku pasażerowie w głównej części kabiny mogą nadal słuchać multimediów, a kierowca otrzymuje wskazówki nawigacyjne.
Proces logowania pasażera w przypadku dźwięku wielostrefowego
Diagram sekwencji poniżej przedstawia proces włączania routingu dźwięku, gdy pasażer loguje się na swoim wyświetlaczu:
Rysunek 2.
W tej sekwencji logowanie użytkownika jest propagowane do usługi audio w samochodzie za pomocą usługi strefy pasażera.
Usługa audio w samochodzie (dla określonej strefy audio) używa interfejsu
AudioPolicy#removeUserIdDeviceAffinity
API do usuwania powiązań z urządzeniem użytkownika. Ten interfejs API przyjmuje identyfikator użytkownika. W tym przypadku jest to użytkownik z poprzedniej strefy.Interfejs
AudioPolicy#setUserIdDeviceAffinity
API przypisuje nowego użytkownika do strefy, która przyjmuje identyfikator użytkownika i wszystkie urządzenia dla określonej konfiguracji strefy.
Konfiguracje stref dynamicznych
W Androidzie 14 wprowadzono dynamiczne konfiguracje stref, które umożliwiają producentom OEM konfigurowanie różnych zestawów urządzeń dla pasażerów. Ten przypadek użycia umożliwia pasażerom na tylnym siedzeniu przełączanie się między głośnikiem w zagłówku tylnego siedzenia a słuchawkami na tylnym siedzeniu.
W takim przypadku wymagane są 2 konfiguracje. Po 1 na zagłówek tylnego siedzenia i słuchawki. Dźwięk dla konkretnego użytkownika jest kierowany tylko do jednej konfiguracji naraz.
Rysunek 3. Proces konfiguracji strefy dynamicznej.
Ilustracja 3 przedstawia architekturę przepływu pracy konfiguracji strefy dynamicznej. Strefa audio 1 ma 2 konfiguracje: Config 0
i Config 1
, które są powiązane odpowiednio z głośnikiem urządzenia wyjściowego i zagłówkiem.
Po zalogowaniu użytkownikowi automatycznie przypisywana jest konfiguracja domyślna. Gdy użytkownik zdecyduje się zmienić konfigurację, zwykle za pomocą interfejsu systemu, usługa audio w samochodzie przełącza się między tymi dwoma konfiguracjami. W ten sposób urządzenie wyjściowe jest przełączane między głośnikiem Z1 a zagłówkiem Z1.
Fragment kodu poniżej pokazuje konfigurację tej strefy dynamicznej.
<carAudioConfiguration version="3">
<zones>
<zone name="Zone1" audioZoneId="1" occupantZoneId="1">
<zoneConfigs>
<zoneConfig name="Zone 1 Config 0" isDefault="true">
<volumeGroups>
<group>
<device address="bus_100">
<context context="music"/>
***
</device>
</group>
</volumeGroups>
</zoneConfig>
<zoneConfig name="Zone 1 Config 1">
<volumeGroups>
<group>
<device address="bus_101">
<context context="music"/>
***
</device>
</group>
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
</zones>
Aby ułatwić zarządzanie konfiguracjami dźwięku, menedżer dźwięku w samochodzie udostępnia interfejsy API do zarządzania konfiguracjami:
- Konfiguracje zapytań dostępne w strefie.
- Sprawdź bieżącą konfigurację strefy.
- Przełącz się na inną konfigurację.
Aplikacja lub usługa interfejsu systemu może używać tych interfejsów API do zarządzania konfiguracją strefy audio, jak pokazano na rysunku 4. Interfejs API zapytań udostępnia te 2 wartości pasażerowi. Użytkownik może wybrać inną konfigurację, klikając polecenie dla wybranej konfiguracji.
Rysunek 4. Proces konfiguracji strefy dynamicznej.
Przesyłanie dźwięku dla pasażera w strefie głównej
Główne strefowe przesyłanie dźwięku dla pasażerów to funkcja wprowadzona w Androidzie 14, która umożliwia pasażerom przesyłanie dźwięku z multimediów w głównej strefie. W ten sposób dźwięk z multimediów pasażera może być przesyłany do głównej kabiny, a kierowca zachowuje pełną kontrolę.
Poniższy rysunek przedstawia uproszczoną wersję architektury transmisji dźwięku z multimediów dla pasażerów w strefie głównej.
Rysunek 5. Proces konfiguracji strefy dynamicznej.
Obraz pokazuje, że urządzenie wyjściowe multimediów kierowcy jest udostępniane pasażerowi. Dzieje się tak tylko wtedy, gdy pasażer jest w trybie przesyłania do strefy głównej. Zasady dynamicznego dźwięku służą też do zarządzania routingiem dźwięku w przypadku kierowcy, ale nie są stosowane żadne zmiany w powiązaniach urządzenia z kierowcą. W przypadku pasażera lista urządzeń wyjściowych zmieni się w ten sposób:
- Urządzenie wyjściowe multimediów dla pasażera zostało usunięte z listy urządzeń
- Urządzenie wyjściowe multimediów dla kierowcy zostało dodane do listy urządzeń.
- Pozostałe urządzenia wyjściowe w strefach audio pasażera pozostają na liście urządzeń
Ta nowa lista urządzeń jest przypisywana do pasażera przez interfejs API.AudioPolicy#setUserIdDeviceAffinity
Parametry przekazywane do interfejsu API to lista urządzeń i identyfikator użytkownika pasażera. Gdy usługa zasad audio systemu audio zapyta, która mieszanka audio ma zostać wybrana dla ścieżki multimedialnej powiązanej z pasażerem, zostanie wybrana mieszanka audio powiązana ze strefą główną.
Kluczowym wymaganiem dotyczącym przesyłania dźwięku do głównej strefy jest to, aby urządzenie wyjściowe multimediów w głównej strefie było odizolowane od innych zastosowań atrybutów dźwięku. W przeciwnym razie podczas tworzenia miksów audio do miksu dodawane są inne atrybuty audio. Gdy wybór miksu jest dokonywany przez system audio, wszystkie dźwięki dołączone do miksu są wybierane do odtwarzania w głównej kabinie.
Kopia lustrzana dźwięku w strefie pasażera
Funkcja dublowania dźwięku umożliwia pasażerom udostępnianie dźwięku. Funkcja dublowania powiela dane audio w każdej strefie dźwięku, dzięki czemu wszyscy pasażerowie mogą słuchać tego samego dźwięku. W tym przypadku dźwięk jest udostępniany pasażerom, którzy korzystają z funkcji dublowania dźwięku.
Kierowanie dźwięku w trybie kopii lustrzanej
Aby włączyć dublowanie dźwięku, musisz dodać co najmniej 2 pasażerów. W rezultacie konfiguracja audio z tylko 2 strefami audio dla pasażerów wymagałaby 1 urządzenia wyjściowego z funkcją dublowania. Zgodnie z powyższą definicją można rozpocząć 2 jednoczesne sesje dublowania.
Na poniższym uproszczonym schemacie przedstawiono dublowanie dźwięku w wielu strefach między 2 pasażerami. Dźwięk od obu pasażerów jest kierowany do urządzenia bus_1000
. Warstwa HAL audio duplikuje sygnał do stref źródłowych.
Rysunek 6. Proces konfiguracji strefy dynamicznej.
To przekierowywanie jest włączone tylko wtedy, gdy pasażerowie są w trybie dublowania. W przeciwnym razie pasażerom zostaną przypisane odpowiednie urządzenia w strefie audio.
Gdy funkcja dublowania zostanie po raz pierwszy włączona dla pasażera, interfejs APIAudioPolicy#setUserIdDeviceAffinity
zmodyfikuje routing:
- Urządzenie wyjściowe multimediów dla pasażera zostanie usunięte z listy urządzeń.
- Urządzenie wyjściowe do dublowania zostało dodane do listy urządzeń.
- Pozostałe urządzenia wyjściowe w strefie audio pasażera pozostaną na liście urządzeń.
W przypadku listy urządzeń wywoływany jest interfejs API z aktualną listą urządzeń i identyfikatorem użytkownika pasażera. Obraz poniżej przedstawia diagram sekwencji przepływu pracy dublowania dźwięku.
Rysunek 7. Proces tworzenia kopii lustrzanej dźwięku.
Na rysunku 7 interfejsy API menedżera dźwięku w samochodzie do zarządzania dublowaniem dźwięku są wywoływane z usługi systemu multimedialnego. W szczególności interfejs API do włączania dublowania dźwięku dla użytkownika 1 i użytkownika 2, CarAudioManager#enableMirrorForAudioZones
.
Usługa audio w samochodzie konfiguruje routing audio dla pasażerów zgodnie z opisem powyżej. Usługa audio w samochodzie wysyła też sygnał do warstwy HAL audio, aby skonfigurować i zduplikować dźwięk z urządzenia Mirror do odpowiednich stref.
Na powyższym obrazie usługa audio w samochodzie wysyła mirroring_src=bus_1000;mirroring_dest=bus_10,bus_20
gdzie
bus_1000
to magistrala źródłowa, a bus_10
i bus_20
to magistrale docelowe.
Na diagramie sekwencji nie widać sygnału wysyłanego przez interfejs AudioManager#setParameters
API, który dociera do HAL przez usługę audio.
Po wyłączeniu dublowania dźwięku wysyłany jest ten sygnał:mirroring_src=bus_1000;mirroring=off
. Ten sygnał może być używany przez HAL do wyłączania duplikowania dźwięku, gdy nie jest włączone dublowanie dźwięku. Aby zdefiniować urządzenia do dublowania dźwięku, plik konfiguracji audio w samochodzie zawiera sekcję o nazwie mirroringDevices
, jak pokazano we fragmencie poniżej.
W tym fragmencie zdefiniowano 2 urządzenia do dublowania, bus_1000
i bus_2000
, dzięki czemu 4 pasażerów może korzystać z dublowania dźwięku.
<carAudioConfiguration version="3">
<mirroringDevices>
<mirroringDevice address="bus_1000"/>
<mirroringDevice address="bus_2000"/>
</mirroringDevices>
<zones>
....
</zones>
</carAudioConfiguration>