Audio Hardware Abstraction Layer (HAL) systemu Android łączy interfejsy API struktury audio wyższego poziomu w android.media
z podstawowymi sterownikami audio i sprzętem. Audio HAL definiuje standardowy interfejs, do którego odwołują się usługi audio. Musi być zaimplementowany, aby sprzęt audio działał poprawnie.
Ta strona zawiera przegląd audio HAL oraz szczegółowe informacje na temat jego interfejsu API i wymagań dotyczących implementacji.
Interfejs audio HAL
Interfejs audio HAL jest zdefiniowany przy użyciu HIDL w plikach .hal
i schematów XSD dla plików konfiguracyjnych, jak pokazano poniżej.
Rysunek 1. Interfejs audio HAL
Pliki konfiguracyjne
Zasady audio i pliki konfiguracyjne XML efektów dźwiękowych są uważane za część interfejsu Audio HAL. Pliki te muszą być zgodne ze swoimi schematami, a zgodność jest weryfikowana przez testy VTS.
W ramach implementacji audio HAL należy utworzyć plik konfiguracyjny strategii audio opisujący topologię audio. Możliwości audio HAL muszą być zadeklarowane w pliku audio_policy_configuration.xml
, aby struktura mogła z nich korzystać.
Audio API HAL
Dźwiękowa warstwa HAL zawiera następujące interfejsy API:
- Rdzeń HAL
- Efekty HAL
- Wspólny HAL
Każdy z tych interfejsów API jest opisany w poniższych sekcjach.
Rdzeń HAL
Core HAL to główny interfejs API używany przez AudioFlinger do odtwarzania dźwięku i sterowania trasowaniem dźwięku. Oto niektóre z kluczowych interfejsów:
-
IDeviceFactory.hal
to punkt wejścia do interfejsu API. -
IDevice.hal
iIPrimaryDevice.hal
zawierają metody, takie jaksetMasterVolume
lubopenInputStream
. - Strumienie są jednokierunkowe i są używane przez AudioFlinger do wysyłania lub odbierania dźwięku do iz warstwy HAL za pośrednictwem
IStream.hal
,IStreamOut.hal
iIStreamIn.hal
.
W poniższej tabeli wymieniono lokalizację przydatnych komponentów Core HAL.
Podstawowy komponent HAL | Lokalizacja |
---|---|
Najnowsza wersja API | /hardware/interfaces/audio/6.0 |
Typy specyficzne dla najnowszego interfejsu API Core HAL | /hardware/interfaces/audio/6.0/types.hal |
Plik konfiguracji zasady audio Schemat XSD | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd |
Domyślna implementacja interfejsu Core HAL API ( /hardware/interfaces/audio/core/all-versions/default/
) jest opakowaniem implementacji wcześniejszej wersji Treble HAL przy użyciu starszych bibliotek współdzielonych . Implementację domyślną można również traktować jako odniesienie przy wdrażaniu nowych wersji audio HAL, które bezpośrednio współdziałają ze sterownikami jądra.
Efekty HAL
Interfejs API Effects HAL jest używany przez platformę efektów do sterowania efektami dźwiękowymi. Możesz także skonfigurować efekty przetwarzania wstępnego, takie jak automatyczna kontrola wzmocnienia i tłumienie szumów, za pośrednictwem interfejsu API Effects HAL.
Poniższa tabela zawiera listę lokalizacji przydatnych komponentów Effects HAL.
Efekty komponentu HAL | Lokalizacja |
---|---|
Najnowsza wersja API | /hardware/interfaces/audio/effect/6.0/ |
Plik konfiguracyjny efektu Schemat XSD | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd |
Aby uzyskać więcej informacji, zobacz przykładową implementację interfejsu API HAL efektów ( /hardware/interfaces/audio/effect/all-versions/default/
) i sekcję Efekty dźwiękowe .
Wspólny HAL
Wspólna warstwa HAL to biblioteka typowych typów danych używanych przez interfejsy API Core i Effects HAL. Nie ma interfejsów ani powiązanych testów VTS, ponieważ definiuje tylko struktury danych. Wspólny interfejs API HAL zawiera następujące elementy:
- Definicje (
/hardware/interfaces/audio/common/6.0/types.hal
) współdzielone przez API Core i Effect - Narzędzia (
/hardware/interfaces/audio/common/all-versions
) używane do kodowania w stosunku do interfejsów API HIDL na potrzeby wdrożeń, klientów i testów
Wymagania
Oprócz wdrożenia audio HAL i utworzenia pliku konfiguracyjnego zasad audio, należy przestrzegać następujących wymagań HAL:
- Jeśli przechwytywanie dla wyzwalacza dźwiękiem (przechwytywanie z bufora słowa kluczowego DSP) jest obsługiwane przez jeden profil wejściowy, implementacja musi obsługiwać liczbę aktywnych strumieni w tym profilu odpowiadającą liczbie jednoczesnych sesji obsługiwanych przez warstwę wyzwalania dźwiękiem HAL.
- Współbieżność połączenia głosowego TX i przechwytywania z procesora aplikacji zgodnie z opisem na stronie przechwytywania współbieżnego .
Aktualizacje audio HAL V7
Aby rozwiązać problemy ze zgodnością wsteczną, stabilny AIDL jest obowiązkowy dla wszystkich zmian HAL począwszy od Androida 13. Aby wspierać i ulepszać adopcję AIDL w Androidzie 13 i nowszych, Audio HAL V7 wykonuje następujące czynności:
- Ujednolica modele danych używane przez platformę i warstwę HAL.
- Minimalizuje duplikację między typami danych HIDL (wyliczeniami) a schematem XML używanym do konfiguracji zasad audio.
W szczególności zmiany są wprowadzane w następujących obszarach w audio HAL V7:
Zmiany te omówiono bardziej szczegółowo w odpowiednich sekcjach.
wyliczenia
Począwszy od Audio HAL V7, wyliczone typy używane w pliku konfiguracji zasad audio są zdefiniowane tylko w schemacie XSD, a nie w HIDL.
W audio HAL V6 wartości typów wyliczeniowych (takich jak AudioFormat
) w types.hal
są również zdefiniowane w schemacie XSD pliku konfiguracyjnego zasad audio, tworząc duplikat. Aby tego uniknąć w wersji 7, typy wyliczeniowe są zmieniane na string
, a zamiast tego wszystkie możliwe wartości wyliczeniowe są wyświetlane w schemacie XSD.
Zobacz rysunek 2, aby zobaczyć porównanie niektórych zmian w typie wyliczeniowym AudioFormat
w wersji 7.
Rysunek 2. Porównanie niektórych zmian w wyliczeniu AudioFormat
Zapoznaj się z poniższą listą typów wyliczeniowych, które zostały przekonwertowane na String
:
-
AudioChannelMask
-
AudioContentType
-
AudioDevice
: rozszerzalny przez dostawcę -
AudioFormat
: rozszerzalny przez dostawcę -
AudioGainMode
-
AudioSource
-
AudioStreamType
-
AudioUsage
Przekaż wartości wyliczeniowe ciągów
Wartości łańcuchowe są używane do przesyłania informacji jako wartości wyliczeniowych przez granicę interfejsu HAL. Zarówno struktura, jak i opakowanie HAL używają liczb całkowitych do implementacji logiki biznesowej i wykorzystują podejście konwersji przedstawione na rysunku 3 .
Rysunek 3. Przekazywanie wartości wyliczeniowych łańcuchów
Na przykład, aby przekazać wartość typu formatu audio z platformy do dostawcy:
- Wartość wyliczeniowa
AudioFormat
jest konwertowana na wartość ciągu wlibaudiohal
i przekazywana do HAL. - Po stronie HAL domyślne opakowanie konwertuje łańcuch na wartość wyliczeniową, która jest przekazywana do starszej warstwy HAL.
Zmiany schematu XML
Posiadanie pełnych list wartości wyliczeniowych w definicji schematu XML (XSD) pozwala na lepszą weryfikację pliku XML konfiguracji polityki audio przez VTS. Wprowadzono zmiany w pliku konfiguracyjnym zasad audio używanym z HAL V7 w celu zapewnienia zgodności z XSD.
W V7 standardowy znak ␣
(spacja) jest używany do rozdzielania list wartości w atrybutach (takich jak częstotliwości próbkowania, maski kanałów i flagi), zamiast ,
(przecinek) i |
(pionowa kreska) symbole używane w wersji V6 i niższych. Jak widać w poniższym przykładzie, do odgraniczenia listy wartości dla channelMasks
użyto spacji :
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
Aby dokonać zmian symboli, użyj skryptu automatycznej konwersji o nazwie update_audio_policy_config.sh
. Zapoznaj się z poniższym poleceniem, aby przekonwertować plik konfiguracyjny zasad audio w wersji 6 na wersję w wersji 7 dla urządzenia Pixel 5 (Redfin):
hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0
Typy danych
Niektóre struktury danych zostały przedefiniowane w wersji 7, aby zminimalizować powielanie definicji. Powtarzające się krotki elementów danych są grupowane w struktury wielokrotnego użytku. Te struktury danych wykorzystują najnowsze funkcje HIDL, takie jak bezpieczne związki.
Na przykład w wersji V6 i starszych w interfejsach i typach HIDL często używana jest potrójna <format, sampling rate, channel mask>
. Aby usunąć tę nadmiarowość, w wersji 7 typ danych AudioConfigBase
i inne typy danych są zdefiniowane w następujący sposób:
AudioConfigBase := <format, sampling rate, channel mask>
AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>
używane przez
AudioConfig
,AudioOffloadInfo
,AudioPortConfig
AudioProfile := <format, {sampling rates}, {channel masks}>
zastępuje luźne kolekcje w
AudioPort/PortConfig
AudioPortExtendedInfo := device | mix | session
zastępuje związki w
AudioPort/PortConfig
Tagi dostawcy
Oprócz typów i formatów urządzeń dostawcy mogą dodawać niestandardowe znaczniki dla metadanych ścieżek audio.
Do odtwarzania i nagrywania metadanych ścieżek dostawcy mogą przekazywać własne znaczniki, które służą do dodawania atrybutów do strumieni audio I/O z aplikacji do warstwy HAL.
Tagi dostawcy dla metadanych odtwarzanej ścieżki są dodawane, jak pokazano w poniższym przykładzie:
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
Struktura RecordTrackMetadata
jest realizowana w podobny sposób poprzez dodanie tagów specyficznych dla metadanych ścieżki nagrywania.
Przestrzeń nazw rozszerzeń dostawców
Począwszy od wersji HAL V7, rozszerzenia dostawcy wymagają dodatkowego prefiksu {vendor}
, który nie jest wymagany w wersji 6. Aby prefiks {vendor}
był prawidłowy, musi składać się z co najmniej trzech znaków alfanumerycznych.
Użyj następującego formatu w wersji 7:
VX_{ vendor }_{ letters/numbers }
Poniżej przedstawiono kilka przykładów prawidłowych rozszerzeń dostawców w wersji 7:
- VX_ GOOGLE _VR
- VX_ QCI _AMBIENT_MIC
Informacje o wersji
W poniższej tabeli wymieniono numery wersji HAL dla każdej wersji systemu Android.
Wersja Androida | Wersja HAL |
---|---|
Androida 13 | 7.1 |
Androida 12 | 7.0 |
Androida 11 | 6.0 |
Androida 10 | 5.0 |
Androida 9 | 4.0 |
Androida 8 | 2.0 |