Konfigurowanie zasad dotyczących dźwięku

W Androidzie 10 wprowadziliśmy znaczące zmiany w menedżerze zasad audio, aby zapewnić większą elastyczność w obsłudze złożonych przypadków użycia w motoryzacji:

  • Strategie routingu specyficzne dla producenta OEM.
  • Możliwość dostosowywania grup głośności w przypadku grup starszych typów strumieni, które korzystają z tych samych krzywych głośności.
  • Strategie routingu są deklarowane przez silnik zasad audio, a nie zakodowane na stałe.
  • Krzywe głośności i grupy zarządzane przez silnik zasad audio.
  • Wewnętrzne refaktoryzacja przygotowująca do przyszłego podziału na kod wspólny i konfigurowalny oraz oferująca bardziej rozbudowane zarządzanie urządzeniami audio. Na przykład w regułach zasad można używać wszystkich właściwości urządzenia, a nie tylko jego typu.

W Androidzie 7.0 wprowadzono format pliku konfiguracji zasad audio (XML) do opisywania topologii audio.

W poprzednich wersjach Androida do deklarowania urządzeń audio obecnych w produkcie trzeba było używać device/<company>/<device>/audio/audio_policy.conf (przykład tego pliku dla sprzętu audio Galaxy Nexus znajdziesz w device/samsung/tuna/audio/audio_policy.conf). Jednak CONF to prosty format zastrzeżony, który jest zbyt ograniczony, aby opisywać złożone topologie w przypadku takich branż jak telewizory i samochody.

W Androidzie 7.0 wycofano audio_policy.conf i dodano obsługę definiowania topologii audio za pomocą pliku XML, który jest bardziej czytelny, ma szeroki zakres narzędzi do edycji i analizowania oraz jest wystarczająco elastyczny, aby opisywać złożone topologie audio. Android 7.0 używa flagi kompilacji USE_XML_AUDIO_POLICY_CONF do wyboru formatu XML plików konfiguracyjnych.

Zalety formatu XML

Podobnie jak w przypadku pliku CONF, plik XML umożliwia określenie liczby i rodzajów profili strumieni wyjściowych i wejściowych, urządzeń, na których można odtwarzać i nagrywać, oraz atrybutów audio. Format XML oferuje też te ulepszenia:

  • W Androidzie 10 można jednocześnie uruchomić więcej niż jedną aktywną aplikację do nagrywania.
    • Rozpoczęcie nagrywania nigdy nie jest odrzucane z powodu sytuacji związanej z jednoczesnością.
    • Funkcja zwrotna registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) powiadamia klientów o zmianach ścieżki przechwytywania.
  • W tych sytuacjach klient otrzymuje próbki dźwięku bez dźwięku:
    • aktywny jest przypadek użycia wymagający ochrony prywatności (np. VOICE_COMMUNICATION);
    • Klient nie ma usługi na pierwszym planie ani interfejsu na pierwszym planie.
    • Zasady rozpoznają role specjalne:
      • Usługa ułatwień dostępu: może nagrywać nawet wtedy, gdy aktywne jest zastosowanie wymagające ochrony prywatności.
      • Asystent: uznawany za wrażliwy pod względem prywatności, jeśli interfejs jest na wierzchu.
  • Profile audio mają strukturę podobną do prostych deskryptorów audio HDMI, co umożliwia stosowanie różnych zestawów częstotliwości próbkowania i masek kanałów dla każdego formatu audio.
  • Istnieją wyraźne definicje wszystkich możliwych połączeń między urządzeniami a strumieniami. Wcześniej niejawna reguła umożliwiała łączenie wszystkich urządzeń podłączonych do tego samego modułu HAL, co uniemożliwiało zasadom audio kontrolowanie połączeń żądanych za pomocą interfejsów API ścieżki audio. W formacie XML opis topologii określa ograniczenia połączeń.
  • Obsługa obejmuje unika powtarzania standardowych definicji A2DP, USB lub przekierowania przesyłania.
  • Krzywe głośności można dostosowywać. Wcześniej tabele głośności były zakodowane na stałe. W formacie XML opisane są tabele objętości, które można dostosowywać.

Szablon na stronieframeworks/av/services/audiopolicy/config/audio_policy_configuration.xml pokazuje wiele z tych funkcji w użyciu.

Format i lokalizacja pliku

Nowy plik konfiguracji zasad dotyczących dźwięku to audio_policy_configuration.xml i znajduje się w lokalizacji /system/etc. Poniższe przykłady pokazują prostą konfigurację zasad dotyczących dźwięku w formacie pliku XML w przypadku Androida 12 i wersji starszych.

Struktura najwyższego poziomu zawiera moduły odpowiadające poszczególnym modułom sprzętowym HAL audio, przy czym każdy moduł ma listę portów miksowania, portów urządzeń i tras:

  • Mix ports opisuje możliwe profile konfiguracji strumieni, które można otworzyć w warstwie HAL audio na potrzeby odtwarzania i nagrywania.
  • Device ports opisuje urządzenia, które można podłączyć, wraz z ich typem (opcjonalnie adresem i właściwościami audio, jeśli ma to znaczenie).
  • Trasy są oddzielone od deskryptora portu miksowania, co umożliwia opis tras z urządzenia na urządzenie lub ze strumienia na urządzenie.

Tabele głośności to proste listy punktów określających krzywą używaną do przeliczania indeksu interfejsu na głośność w dB. Osobny plik dołączany zawiera domyślne krzywe, ale każdą krzywą dla danego zastosowania i kategorii urządzenia można zastąpić.

Włączenie plików

Metoda XML Inclusions (XInclude) może służyć do uwzględniania informacji o konfiguracji zasad dotyczących dźwięku znajdujących się w innych plikach XML. Wszystkie uwzględnione pliki muszą mieć strukturę opisaną powyżej z następującymi ograniczeniami:

  • Pliki mogą zawierać tylko elementy najwyższego poziomu.
  • Pliki nie mogą zawierać elementów XInclude.

Używaj instrukcji include, aby uniknąć kopiowania informacji o konfiguracji standardowego modułu HAL audio w Android Open Source Project (AOSP) do wszystkich plików konfiguracji zasad audio (co jest podatne na błędy). Standardowy plik XML konfiguracji zasad audio jest dostępny w przypadku tych interfejsów HAL audio:

  • A2DP: a2dp_audio_policy_configuration.xml
  • Przekieruj submiksy: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

Organizacja kodu zasad dotyczących dźwięku

AudioPolicyManager.cpp jest podzielony na kilka modułów, co ułatwia jego utrzymanie i konfigurowanie. Organizacja frameworks/av/services/audiopolicy obejmuje te moduły:

Moduł Opis
/managerdefault Obejmuje ogólne interfejsy i implementację zachowań wspólnych dla wszystkich aplikacji. Podobnie jak AudioPolicyManager.cpp z funkcjami silnika i ogólnymi pojęciami.
/common Definiuje klasy bazowe (np. struktury danych dla profili wejściowych i wyjściowych strumieni audio, deskryptory urządzeń audio, ścieżki audio i porty audio). Wcześniej była ona zdefiniowana w AudioPolicyManager.cpp.
/engine

Wdraża reguły określające, które urządzenie i woluminy powinny być używane w danym przypadku użycia. Implementuje standardowy interfejs z częścią ogólną, np. w celu uzyskania odpowiedniego urządzenia do danego przypadku użycia odtwarzania lub przechwytywania albo ustawienia podłączonych urządzeń lub stanu zewnętrznego (czyli stanu połączenia wymuszonego użycia), który może zmienić decyzję o routingu.

Dostępne w 2 wersjach: konfigurowalnejdomyślnej. Informacje o tym, jak wybrać wersję, znajdziesz w artykule Konfigurowanie za pomocą platformy parametrów.

/engineconfigurable Implementacja silnika zasad oparta na platformie parametrów (patrz poniżej). Konfiguracja jest oparta na strukturze parametrów, a zasady są definiowane przez pliki XML.
/enginedefault Implementacja silnika zasad oparta na poprzednich implementacjach Menedżera zasad audio na Androidzie. Jest to ustawienie domyślne, które obejmuje reguły zakodowane na stałe i odpowiadające implementacjom Nexusa i AOSP.
/service Obejmuje interfejsy binder, wątki i implementację blokowania z interfejsem do reszty platformy.

Konfiguracja za pomocą platformy parametrów

Kod zasad dotyczących dźwięku jest uporządkowany w taki sposób, aby był łatwy do zrozumienia i utrzymania, a jednocześnie obsługiwał zasady dotyczące dźwięku zdefiniowane w całości przez pliki konfiguracyjne. Organizacja i projekt zasad dotyczących dźwięku opierają się na platformie parametrów firmy Intel, która jest opartą na wtyczkach i regułach platformą do obsługi parametrów.

Korzystanie z konfigurowalnych zasad dotyczących dźwięku umożliwia producentom OEM:

  • Opisz strukturę systemu i jego parametry w formacie XML.
  • Napisz (w C++) lub ponownie wykorzystaj backend (wtyczkę) do uzyskiwania dostępu do opisanych parametrów.
  • Określ (w XML lub w języku specyficznym dla domeny) warunki lub reguły, zgodnie z którymi dany parametr musi przyjmować określoną wartość.

AOSP zawiera przykładowy plik konfiguracji zasad audio, który korzysta z platformy Parameter w Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml. Szczegółowe informacje znajdziesz w dokumentacji firmy Intel na temat platformy parametrów.

W Androidzie 10 lub starszym konfigurowalna strategia audio jest wybierana za pomocą opcji kompilacji USE_CONFIGURABLE_AUDIO_POLICY. W Androidzie 11 lub nowszym wersja silnika zasad audio jest wybierana w pliku audio_policy_configuration.xml. Aby wybrać konfigurowalny silnik zasad dotyczących dźwięku, ustaw wartość atrybutu engine_libraryelementu globalConfiguration na configurable, jak w tym przykładzie:

<audioPolicyConfiguration>
    <globalConfiguration engine_library="configurable" />
...
</audioPolicyConfiguration>

Interfejsy API routingu zasad audio

W Androidzie 6.0 wprowadziliśmy publiczny interfejs Enumeration and Selection API, który jest oparty na infrastrukturze ścieżek i portów audio. Umożliwia on programistom aplikacji określanie preferencji dotyczących konkretnego wyjścia lub wejścia urządzenia w przypadku podłączonych nagrań lub ścieżek audio.

W Androidzie 7.0 interfejs API wyliczania i wyboru jest weryfikowany przez testy CTS i rozszerzony o routing natywnych strumieni audio C/C++ (OpenSL ES). Kierowanie strumieni natywnych nadal odbywa się w języku Java. Dodaliśmy interfejs AudioRouting, który zastępuje, łączy i wycofuje metody kierowania jawnego, które były specyficzne dla klas AudioTrackAudioRecord.

Szczegółowe informacje o interfejsie Enumeration and Selection API znajdziesz w sekcjach Interfejsy konfiguracji AndroidaOpenSLES_AndroidConfiguration.h. Więcej informacji o routingu audio znajdziesz w artykule AudioRouting.

Pomoc w wielu kanałach

Jeśli sprzęt i sterownik obsługują dźwięk wielokanałowy przez HDMI, możesz przesyłać strumień audio bezpośrednio do sprzętu audio (pomija to mikser AudioFlinger, więc nie jest on miksowany do dwóch kanałów). Warstwa HAL audio musi określać, czy profil strumienia wyjściowego obsługuje funkcje dźwięku wielokanałowego. Jeśli HAL udostępnia swoje możliwości, domyślny menedżer zasad zezwala na odtwarzanie wielokanałowe przez HDMI. Szczegóły wdrażania znajdziesz w sekcji device/samsung/tuna/audio/audio_hw.c.

Aby określić, że produkt zawiera wielokanałowe wyjście audio, zmień plik konfiguracyjny zasad dotyczących dźwięku, aby opisać wielokanałowe wyjście dla produktu. Poniższy przykład z frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml pokazuje dynamiczną maskę kanału, co oznacza, że po połączeniu menedżer zasad audio wysyła zapytanie do odbiornika HDMI o maski kanałów, które obsługuje.

Możesz też określić statyczną maskę kanału, np.AUDIO_CHANNEL_OUT_5POINT1. Mikser AudioFlinger automatycznie miksuje treści do stereo, gdy są one wysyłane do urządzenia audio, które nie obsługuje dźwięku wielokanałowego.

Kodeki multimediów

Upewnij się, że kodeki audio obsługiwane przez sprzęt i sterowniki są prawidłowo zadeklarowane w przypadku Twojego produktu. Więcej informacji znajdziesz w artykule Udostępnianie kodeków w ramach platformy.