Dźwięk HAL

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.

audio_hal

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 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.

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.

audioformat-change

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 .

audio-passing-values

Rysunek 3. Przekazywanie wartości wyliczenia ciągu

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

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