Dźwięk HAL

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

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.

audio_hal

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 i IPrimaryDevice.hal zawierają metody, takie jak setMasterVolume lub openInputStream .
  • 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 i IStreamIn.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.

audioformat-change

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 .

audio-passing-values

Rysunek 3. Przekazywanie wartości wyliczeniowych łańcuchów

Na przykład, aby przekazać wartość typu formatu audio z platformy do dostawcy:

  1. Wartość wyliczeniowa AudioFormat jest konwertowana na wartość ciągu w libaudiohal i przekazywana do HAL.
  2. 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