System operacyjny Android Automotive (AAOS) opiera się na podstawowym stosie audio Androida, obsługują przypadki użycia funkcji systemu multimedialnego w pojeździe. AAOS odpowiada za dźwięki informacyjno-rozrywkowe (tzn. multimedia, nawigację komunikacji), ale nie odpowiada bezpośrednio za sygnały i ostrzeżenia ścisłe wymagania dotyczące dostępności i czasu. Chociaż AAOS dostarcza sygnały Za pomocą mechanizmów ułatwiających zarządzanie dźwiękiem w pojeździe określić, jakie dźwięki powinny być odtwarzane przez kierowcę zadbać o to, aby dźwięki zagrażające bezpieczeństwu oraz dźwięki wymagane przez prawo bez zakłóceń.
Gdy Android zarządza odtwarzaniem multimediów w pojeździe, zewnętrzne źródła multimediów takich jak tuner radiowy, powinny być reprezentowane przez aplikacje, które mogą obsługiwać dźwięk. i kluczowe zdarzenia związane z multimediami.
Android 11 wprowadza te zmiany dotyczące dźwięku związanego z samochodami pomoc:
- Automatyczne wybieranie strefy dźwięku na podstawie powiązanego identyfikatora User ID
- Nowe zastosowania systemu do obsługi dźwięków charakterystycznych dla samochodów
- Obsługa ostrości z dźwiękiem HAL
- Opóźniona aktywność audio w przypadku strumieni trwałych
- Ustawienie użytkownika umożliwiające kontrolowanie interakcji między nawigacją a połączeniami
Dźwięki i strumienie danych z Androida
Samochodowe systemy audio obsługują te dźwięki i strumieniowanie:
Rysunek 1. Schemat architektury ukierunkowanej na strumień
Android zarządza dźwiękami pochodzącymi z aplikacji na Androida, kontrolując te aplikacje i kierować dźwięki na urządzenia wyjściowe w HAL w oparciu o typ dźwięk:
- strumienie logiczne – nazywane źródłami w podstawowej ścieżce audio; są otagowane atrybutami audio.
- strumienie fizyczne, nazywane urządzeniami w podstawowej konfiguracji audio; nie mają informacji kontekstowych po zmieszaniu.
Aby zapewnić niezawodność, dźwięki zewnętrzne (od niezależnych takimi jak sygnały ostrzegawcze o pasie bezpieczeństwa) zarządza się poza Androidem, HAL, a nawet na osobnym sprzęcie. Osoby zajmujące się implementacją systemu muszą zapewnić mikser, który akceptuje co najmniej 1 strumień dźwięku z Androida, a potem łączy te w odpowiedni sposób, z zewnętrznymi źródłami dźwięku wymaganymi pojazdu.
Implementacja HAL i mikser zewnętrzny odpowiadają za zapewnienie są słychać dźwięki z zewnątrz o krytycznym znaczeniu dla bezpieczeństwa, a także miksowanie w urządzeniach z Androidem. strumieniowanie i przekierowywanie ich do odpowiednich głośników.
Dźwięki Androida
Aplikacje mogą mieć co najmniej 1 gracz, który działa na standardowym Androidzie interfejsy API (na przykład AudioManager). w przypadku sterowania ostrością lub funkcji MediaPlayer do strumieniowego przesyłania danych) w celu emitowania co najmniej 1 strumienia logicznego danych audio. Te dane może być jednokanałowy mono lub surround 7.1, ale jest kierowany i traktowany jako z jednego źródła. Strumień aplikacji jest powiązany z atrybutami AudioAttributes. które dają systemowi wskazówki dotyczące tego, jak dźwięk powinien być wyrażany.
Strumienie logiczne są wysyłane przez usługę AudioService i kierowane do tylko jeden) dostępnych fizycznych strumieni wyjściowych, z których każdy miksera w AudioFlinger. Po połączeniu atrybutów audio w postaci fizycznej, nie są już dostępne.
Każdy strumień fizyczny jest następnie dostarczany do HAL Audio, gdzie odbywa się renderowanie i sprzęt. W aplikacjach motoryzacyjnych sprzęt do renderowania może być używany przez lokalne kodeki (podobne do urządzeń mobilnych) lub zdalny procesor na W obu przypadkach zadaniem interfejsu Audio HAL jest dostarczanie i sprawić, że będą słyszalne.
Strumienie zewnętrzne
Strumienie dźwięków, które nie powinny być kierowane przez Androida (w celu uzyskania certyfikatu lub przyczyn błędu) mogą być przesyłane bezpośrednio do miksera zewnętrznego. W Androidzie 11 HAL może teraz poprosić o koncentrację na tych dźwiękach zewnętrznych, aby poinformować Androida aby umożliwić podjęcie odpowiednich działań, takich jak wstrzymywanie multimediów lub skupienie się na innych.
czy strumienie zewnętrzne są źródłami multimediów, które powinny wchodzić w interakcje z dźwiękiem. środowisko generowane przez Androida (np. zatrzymaj odtwarzanie w formacie MP3, gdy jest włączone, zewnętrzne strumienie powinny być reprezentowane przez tag Aplikacja na Androida. Taka aplikacja żądałaby skupienia na dźwięku w imieniu źródła multimediów zamiast HAL i reagują na powiadomienia uruchamianie/zatrzymywanie źródła zewnętrznego zgodnie z potrzebami Androida. . Aplikacja odpowiada również za obsługę kluczowych zdarzeń związanych z multimediami, takich jak: odtwórz/wstrzymaj. Jednym z sugerowanych mechanizmów do sterowania takimi urządzeniami zewnętrznymi jest HwAudioSource.
Urządzenia wyjściowe
Na poziomie HAL Audio typ urządzenia AUDIO_DEVICE_OUT_BUS
to standardowe urządzenie wyjściowe przeznaczone do samochodowych systemów audio. Autobus
urządzenie obsługuje porty adresowane (gdzie każdy port jest punktem końcowym dla
strumienia fizycznego) i powinien być jedynym obsługiwanym typem urządzenia wyjściowego w
pojazdem.
Implementacja systemu może używać 1 portu magistrali dla wszystkich dźwięków Androida
W takim przypadku Android łączy wszystko ze sobą i przesyła treści w ramach jednego strumienia.
HAL może też zapewnić jeden port autobusowy dla każdego CarAudioContext
, aby umożliwić
równoczesne przesyłanie dowolnego typu dźwięku. Dzięki temu zasoby HAL
aby mieszać i wyciszać różne dźwięki zgodnie z potrzebami.
Konteksty audio są przypisywane do urządzeń wyjściowych za pomocą
car_audio_configuration.xml
Wejście mikrofonu
Podczas przechwytywania dźwięku HAL audio otrzymuje openInputStream
zawierające argument AudioSource
wskazujący, jak funkcja
dane wejściowe mikrofonu powinny zostać przetworzone.
Źródło VOICE_RECOGNITION
(zwłaszcza Asystent Google) oczekuje strumienia mikrofonu stereo,
efekt usuwania echa (jeśli jest dostępny), ale nie są do niego stosowane żadne inne metody przetwarzania.
Przewiduje się, że kształtowanie wiązki powinno wykonywać Asystent.
Wielokanałowe wejście mikrofonu
Aby przechwytywać dźwięk z urządzenia, które ma więcej niż 2 kanały (stereo), użyj
maska indeksu kanału zamiast pozycjonalnej maski indeksu (np.
CHANNEL_IN_LEFT
). Przykład:
final AudioFormat audioFormat = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(44100) .setChannelIndexMask(0xf /* 4 channels, 0..3 */) .build(); final AudioRecord audioRecord = new AudioRecord.Builder() .setAudioFormat(audioFormat) .build(); audioRecord.setPreferredDevice(someAudioDeviceInfo);
Gdy zarówno setChannelMask
, jak i setChannelIndexMask
są ustawione, a AudioRecord
używa tylko wartości ustawionej przez
setChannelMask
(maksymalnie dwa kanały).
Jednoczesne przechwytywanie
Od Androida 10 platforma Androida obsługuje
z zastosowaniem danych wejściowych, ale z ograniczeniami mającymi na celu ochronę prywatności użytkownika. W ramach
tych ograniczeń, źródła wirtualne,
AUDIO_SOURCE_FM_TUNER
są ignorowane, a jako takie mogą być
rejestrowanych równolegle ze zwykłym wejściem (takim jak mikrofon).
HwAudioSources
również nie są uznawane za częścią równoczesnych zadań
ograniczeń przechwytywania.
Aplikacje przeznaczone do działania na urządzeniach z AUDIO_DEVICE_IN_BUS
lub
dodatkowe urządzenia AUDIO_DEVICE_IN_FM_TUNER
muszą polegać bezpośrednio na
identyfikowanie tych urządzeń i korzystanie z AudioRecord.setPreferredDevice()
w celu ominięcia domyślnego wyboru źródła w Androidzie.
Zastosowania dźwięku
AAOS używa głównie
AudioAttributes.AttributeUsages
do routingu, regulacji głośności i zarządzania ostrością. Zastosowanie
reprezentacja argumentu „dlaczego” transmisja jest odtwarzana. Dlatego wszystkie strumienie
i żądania skupienia na dźwięku powinny określać sposób użycia
odtwarzania dźwięku. Kiedy
nie zostało wyraźnie określone podczas tworzenia obiektu AudioAttributes, użycie zostanie
domyślna wartość to USAGE_UNKNOWN
. Obecnie jest to traktowane tak samo
jako USAGE_MEDIA
, nie należy polegać na tym działaniu w przypadku mediów
odtwarzania.
Zastosowania systemu
W Androidzie 11 pojawiły się przypadki użycia systemu. Te przypadki użycia działają
podobnie jak wcześniej określone zastosowania, z tym że wymagają systemowych interfejsów API.
oraz android.permission.MODIFY_AUDIO_ROUTING
. Nowy
zastosowania systemu to:
USAGE_EMERGENCY
USAGE_SAFETY
USAGE_VEHICLE_STATUS
USAGE_ANNOUNCEMENT
Aby utworzyć obiekt AudioAttributes
przy użyciu użycia systemu, użyj
AudioAttributes.Builder#setSystemUsage
zamiast setUsage
. Wywoływanie tej metody w przypadku użycia spoza systemu
skutkuje odrzuceniem wyniku IllegalArgumentException
. Ponadto, jeśli
w konstruktorze ustawiono wykorzystanie zarówno systemu, jak i użycia systemu,
IllegalArgumentException
podczas tworzenia.
Sprawdzanie, jakie użycie jest powiązane z kontem AudioAttributes
wywołaj AudioAttributes#getSystemUsage
.
Zwraca powiązane wykorzystanie lub wykorzystanie systemu.
Konteksty dźwiękowe
Aby uprościć konfigurację audio AAOS, pogrupowaliśmy podobne przypadki użycia
na CarAudioContext
. Te konteksty dźwiękowe są używane w całym
CarAudioService
, aby zdefiniować routing, grupy głośności i fokus
i zarządzania nimi.
Konteksty dźwiękowe w Androidzie 11 to:
Samochodowy kontekst audio | Powiązane użycie atrybutów |
---|---|
MUSIC |
UNKNOWN, GAME, MEDIA |
NAVIGATION |
ASSISTANCE_NAVIGATION_GUIDANCE |
VOICE_COMMAND |
ASSISTANT, ASSISTANCE_ACCESSIBILITY |
CALL_RING |
NOTIFICATION_RINGTONE |
CALL |
VOICE_COMMUNICATION, VOICE_COMMUNICATION_SIGNALING |
ALARM |
ALARM |
NOTIFICATION |
NOTIFICATION, NOTIFICATION_* |
SYSTEM_SOUND |
ASSISTANCE_SONIFICATION |
EMERGENCY |
EMERGENCY |
SAFETY |
SAFETY |
VEHICLE_STATUS |
VEHICLE_STATUS |
ANNOUNCEMENT |
ANNOUNCEMENT |
Mapowanie między kontekstami dźwiękowymi a wykorzystaniem. Wyróżnione wiersze dotyczą nowych: zastosowaniach systemu.
Wielostrefowy dźwięk
W branży motoryzacyjnej można znaleźć nowy zestaw przypadków użycia związanych z równoczesnymi użytkownikami które wchodzą w interakcję z platformą i chcą korzystać z osobnych mediów. Dla: Na przykład: kierowca może odtwarzać muzykę w samochodzie, a pasażerowie na tylnym siedzeniu oglądają film w YouTube na tylnym wyświetlaczu. Wielostrefowy dźwięk umożliwia tę funkcję umożliwiając jednoczesne odtwarzanie różnych źródeł dźwięku w różnych obszarach pojazdu.
Wielostrefowy dźwięk w Androidzie 10 umożliwia producentom OEM konfigurowanie dźwięku w osobnych strefach. Każda strefa to zbiór urządzeń w pojeździe z własnymi grupami woluminów, konfiguracją routingu dla kontekstów oraz skupieniem i zarządzania nimi. W ten sposób można ustawić główną kabinę jako jeden plik audio stref, a gniazda słuchawek tylnego wyświetlacza są skonfigurowane jako druga strefa.
Strefy są zdefiniowane w zasadzie car_audio_configuration.xml
.
CarAudioService
odczytuje konfigurację i pomaga usłudze AudioService
kierować strumienie audio na podstawie powiązanej z nimi strefy. Każda strefa nadal określa,
reguły routingu na podstawie kontekstów i identyfikatora UID aplikacji. Gdy gracz jest
utworzony, CarAudioService
określa, w której strefie znajduje się odtwarzacz
a następnie na podstawie użycia, z którym urządzenie AudioFlinger
powinien kierować dźwięk.
Ostrość jest ustawiana niezależnie dla każdej strefy dźwięku. Dzięki temu
w różnych strefach, co pozwala na niezależne generowanie dźwięku,
ingerencję w siebie, a aplikacje wciąż respektują zmiany
w swojej strefie. CarZonesAudioFocus
w
CarAudioService
odpowiada za zarządzanie skupieniem każdego
strefie.
Rysunek 2. Konfigurowanie wielostrefowego dźwięku
HAL audio
Implementacje dźwięku w samochodach bazują na standardowym formacie HAL Androida Audio, który obejmuje:
IDevice.hal
Tworzy strumienie wejściowe i wyjściowe, obsługuje główną głośność i wyciszanie oraz używa:createAudioPatch
Aby tworzyć zewnętrzne poprawki między urządzeniami.IDevice.setAudioPortConfig()
, aby określić głośność dla każdego strumienia fizycznego.
IStream.hal
Oprócz wariantów wejściowych i wyjściowych zarządza strumieniowaniem próbek dźwięku do i z urządzenia.
Motoryzacja – typy urządzeń
W przypadku platform motoryzacyjnych odpowiednie są wymienione poniżej typy urządzeń.
Typ urządzenia | Opis |
---|---|
AUDIO_DEVICE_OUT_BUS |
Podstawowe wyjście z Androida (w ten sposób cały dźwięk z Androida jest dostarczone do pojazdu). Używany jako adres do rozróżniania strumieni dla każdego kontekstu. |
AUDIO_DEVICE_OUT_TELEPHONY_TX |
Służy do przesyłania dźwięku do nadajnika komórkowego. |
AUDIO_DEVICE_IN_BUS |
Służy do wprowadzania danych wejściowych, które nie zostały sklasyfikowane w inny sposób. |
AUDIO_DEVICE_IN_FM_TUNER |
Używany tylko do nadawania sygnału radiowego. |
AUDIO_DEVICE_IN_TV_TUNER |
Używana w przypadku telewizora, jeśli jest dostępny. |
AUDIO_DEVICE_IN_LINE |
Gniazdo wejściowe AUX. |
AUDIO_DEVICE_IN_BLUETOOTH_A2DP |
Muzyka odebrana przez Bluetooth. |
AUDIO_DEVICE_IN_TELEPHONY_RX |
Służy do obsługi dźwięku odbieranego z nadajnika komórkowego powiązanego z telefonem . |
Konfigurowanie urządzeń audio
Urządzenia audio widoczne dla Androida muszą być zdefiniowane w
/audio_policy_configuration.xml
, który obejmuje te komponenty:
- nazwa modułu. Obsługuje tryb „główne” (używane w przypadkach użycia w branży motoryzacyjnej),
„A2DP”, „remote_submix” i „USB”. nazwa modułu i odpowiadająca mu ścieżka dźwiękowa,
sterownik powinien zostać skompilowany do wersji
audio.primary.$(variant).so
. - DevicePorts (Porty urządzenia). Zawiera listę deskryptorów urządzeń dla wszystkich danych wejściowych i wyjściowych urządzeń (w tym urządzeń podłączonych na stałe i urządzeń wymiennych), które można z tego modułu.
- Dla każdego urządzenia wyjściowego możesz zdefiniować kontrolę wzmocnienia, która składa się wartości min./maks./domyślne/kroki w milibelach (1 milibel = 1/100 dB = 1/1000 bel).
- Atrybut adresu w instancji devicePort może być używany do znalezienia
nawet w przypadku kilku urządzeń tego samego typu,
AUDIO_DEVICE_OUT_BUS
- MixPorts. Zawiera listę wszystkich strumieni wyjściowych i wejściowych udostępnianych przez HAL audio. Każdą instancję MixPort można uznać za strumień fizyczny, Android AudioService
- trasy. Definiuje listę możliwych połączeń między danymi wejściowymi i wyjściowymi urządzenia lub przesyłania strumieniowego z urządzenia.
Poniższy przykład definiuje atrybut magistrali urządzenia wyjściowego0_phone_out, w którym wszystkie
Strumienie audio w Androidzie są mieszane przez Mixer_bus0_phone_out. Trasa przebiega przez
strumień wyjściowy danych mixer_bus0_phone_out
do urządzenia
bus0_phone_out
<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>bus0_phone_out</item> <defaultOutputDevice>bus0_phone_out</defaultOutputDevice> <mixPorts> <mixPort name="mixport_bus0_phone_out" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="bus0_phone_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="BUS00_PHONE"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> <gains> <gain name="" mode="AUDIO_GAIN_MODE_JOINT" minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/> </gains> </devicePort> </devicePorts> <routes> <route type="mix" sink="bus0_phone_out" sources="mixport_bus0_phone_out"/> </routes> </module> </modules> </audioPolicyConfiguration>