Dźwięk samochodowy

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:

Dźwięki i strumienie danych z Androida

Samochodowe systemy audio obsługują te dźwięki i strumieniowanie:

Schemat architektury ukierunkowanej na strumień

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.

Konfigurowanie wielostrefowego dźwięku

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>