Warstwa abstrakcji sprzętu audio systemu Android (HAL) łączy interfejsy API wyższego poziomu, specyficzne dla systemu audio 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ć zaimplementowana, aby sprzęt audio działał poprawnie.
Ta strona zawiera przegląd audio warstwy HAL i zawiera szczegółowe informacje o jej interfejsie API i wymaganiach dotyczących implementacji.
Interfejs audio HAL
Interfejs audio HAL jest definiowany za pomocą HIDL w plikach .hal
i schematach XSD dla plików konfiguracyjnych, jak pokazano poniżej.
Rysunek 1. Interfejs audio HAL
Pliki konfiguracyjne
Zasady audio i efekty dźwiękowe Pliki konfiguracyjne XML są uważane za część interfejsu Audio HAL. Pliki te muszą być zgodne z ich schematami, a zgodność jest weryfikowana przez testy VTS.
W ramach implementacji audio HAL należy utworzyć plik konfiguracyjny zasad audio, który opisuje topologię audio. Funkcje audio HAL muszą być zadeklarowane w pliku audio_policy_configuration.xml
, aby platforma mogła z nich korzystać.
Audio HAL API
Audio HAL zawiera następujące interfejsy API:
- Rdzeń HAL
- Efekty HAL
- Wspólna HAL
Każdy z tych interfejsów API został 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 routingiem dźwięku. Oto niektóre z kluczowych interfejsów:
-
IDeviceFactory.hal
jest punktem wejścia do 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.
Główny składnik 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 konfiguracyjny zasad audio Schemat XSD | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd |
Domyślna implementacja interfejsu API Core HAL ( /hardware/interfaces/audio/core/all-versions/default/
) to opakowanie wokół implementacji warstwy HAL sprzed Treble przy użyciu starszych bibliotek współdzielonych . Domyślna implementacja może być również traktowana jako odniesienie podczas implementowania 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 pomocą interfejsu Effects HAL API.
W poniższej tabeli wymieniono lokalizację przydatnych składników warstwy HAL efektów.
Efekty składnik 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 Effects HAL API ( /hardware/interfaces/audio/effect/all-versions/default/
) oraz sekcję Efekty dźwiękowe .
Wspólna HAL
Common HAL to biblioteka typowych typów danych używanych przez interfejsy API warstwy Core i Effects. Nie ma interfejsów ani powiązanych testów VTS, ponieważ definiuje tylko struktury danych. Common HAL API zawiera następujące elementy:
- Definicje (
/hardware/interfaces/audio/common/6.0/types.hal
) współdzielone przez interfejsy API Core i Effect - Narzędzia (
/hardware/interfaces/audio/common/all-versions
) używane do kodowania w interfejsach API HIDL dla wdrożeń, klientów i testów
Wymagania
Oprócz implementacji audio HAL i utworzenia pliku konfiguracyjnego zasad audio, należy przestrzegać następujących wymagań HAL:
- Jeśli przechwytywanie dla Sound Trigger (przechwytywanie z bufora DSP słowa-klucza) 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 Sound Trigger HAL.
- Współbieżność połączenia głosowego TX i przechwytywania z procesora aplikacji, jak opisano na stronie Concurrent Capture .
Aktualizacje Audio HAL V7
Aby rozwiązać problemy ze zgodnością wsteczną, stabilna AIDL jest obowiązkowa dla wszystkich zmian HAL począwszy od Androida T. Aby wesprzeć i ulepszyć adopcję AIDL w Androidzie T i nowszych, Audio HAL V7 wykonuje następujące czynności:
- Ujednolica modele danych używane przez platformę i HAL.
- Minimalizuje powielanie między typami danych HIDL (wyliczeniami) i 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 zostały szczegółowo omówione w odpowiednich sekcjach.
Wyliczenia
Począwszy od Audio HAL 7, typy wyliczane 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 enum (takich jak AudioFormat
) w types.hal
są również zdefiniowane w schemacie XSD pliku konfiguracyjnego zasad audio, tworząc duplikację. Aby tego uniknąć w wersji 7, typy wyliczenia są zmieniane na string
, a wszystkie możliwe wartości wyliczenia są wyświetlane w schemacie XSD.
Zobacz rysunek 2 , aby porównać niektóre zmiany w typie wyliczenia AudioFormat
w V7.
Rysunek 2. Porównanie niektórych zmian w wyliczeniu AudioFormat
Zapoznaj się z poniższą listą typów wyliczenia, które zostały przekonwertowane na String
:
-
AudioChannelMask
-
AudioContentType
-
AudioDevice
: rozszerzalne przez dostawcę -
AudioFormat
: rozszerzalny przez dostawcę -
AudioGainMode
-
AudioSource
-
AudioStreamType
-
AudioUsage
Przekaż wartości wyliczenia ciągów
Wartości ciągu są używane do przesyłania informacji jako wartości wyliczenia przez granicę interfejsu HAL. Zarówno struktura, jak i opakowanie HAL używają wartości wyliczenia liczb całkowitych do implementacji logiki biznesowej i stosują podejście konwersji przedstawione na rysunku 3 .
Rysunek 3. Przekazywanie wartości wyliczenia ciągu
Jako przykład, aby przekazać wartość typu formatu audio z frameworka do dostawcy:
- Wartość wyliczenia
AudioFormat
jest konwertowana na wartość ciągu wlibaudiohal
i przekazywana do warstwy HAL. - Po stronie warstwy HAL domyślne opakowanie konwertuje ciąg na wartość wyliczenia, która jest przekazywana do starszej warstwy HAL.
Zmiany w schemacie XML
Posiadanie pełnych list wartości wyliczenia w definicji schematu XML (XSD) pozwala na lepszą walidację plików XML konfiguracji zasad audio przez VTS. Zmiany są wprowadzane w pliku konfiguracyjnym zasad audio używanym z HAL V7 w celu zapewnienia zgodności z XSD.
W V7 do odgraniczenia list wartości w atrybutach (takich jak częstotliwości próbkowania, maski kanałów i flagi) używany jest standardowy znak ␣
(spacja) zamiast ,
(przecinek) i |
(pionowa kreska) symbole używane w V6 i poniżej. Jak widać w poniższym przykładzie, spacja jest używana do rozgraniczenia listy wartości dla channelMasks
:
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
Aby dokonać zmian w symbolu, użyj skryptu automatycznej konwersji o nazwie update_audio_policy_config.sh
. Zobacz następujące polecenie, aby przekonwertować plik konfiguracyjny zasad audio V6 na wersję V7 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 V7 w celu zminimalizowania duplikatów 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 6 i niższych, w interfejsach i typach HIDL często używana jest trójka <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 tagi dla metadanych ścieżki dźwiękowej.
W przypadku metadanych odtwarzania i nagrywania ścieżek dostawcy mogą przekazywać własne znaczniki, które służą do dodawania atrybutów do strumieni we/wy audio, z aplikacji do warstwy HAL.
Tagi dostawcy dla metadanych ścieżki odtwarzania są dodawane, jak pokazano w poniższym przykładzie:
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
Struktura RecordTrackMetadata
jest zaimplementowana w podobny sposób poprzez dodanie tagów specyficznych dla metadanych ścieżki nagrywania.
Przestrzenie nazw rozszerzeń dostawcy
Począwszy od wersji 7 warstwy HAL 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 V7:
VX_{ vendor }_{ letters/numbers }
Oto kilka przykładów prawidłowych rozszerzeń dostawców V7:
- VX_ GOOGLE _VR
- VX_ QCI _AMBIENT_MIC
Informacje o wersji
Poniższa tabela zawiera numer wersji warstwy HAL dla każdego wydania systemu Android.
Wersja na Androida | Wersja HAL |
---|---|
Android 12 | 7,0 |
Androida 11 | 6,0 |
Androida 10 | 5.0 |
Android 9 | 4.0 |
Android 8 | 2,0 |