HIDL Audio HAL

W Androidzie 13 i starszych interfejs Audio HAL jest definiowany za pomocą HIDL w plikach HIDL HAL (z rozszerzeniem .hal ) i schematów XSD dla plików konfiguracyjnych, jak pokazano poniżej.

audio_hal

Rysunek 1. Interfejs audio HAL.

Pliki konfiguracyjne

Pliki konfiguracyjne XML dotyczące zasad audio i efektów dźwiękowych są uważane za część interfejsu Audio HIDL HAL. Pliki te muszą być zgodne ze swoimi schematami, a zgodność jest weryfikowana testami VTS.

W ramach implementacji audio HIDL HAL należy utworzyć plik konfiguracyjny zasad audio opisujący topologię audio. Możliwości audio HAL muszą być zadeklarowane w pliku audio_policy_configuration.xml , aby platforma mogła z nich korzystać.

Audio HIDL HAL API

W tej sekcji opisano rdzeń, efekty i wspólne interfejsy API HAL dla języka HIDL.

Rdzeń HAL

Niektóre z kluczowych interfejsów Core HAL, wykorzystujących HIDL, są następujące:

  • 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 i z warstwy HAL poprzez IStream.hal , IStreamOut.hal i IStreamIn.hal .

W poniższej tabeli wymieniono lokalizację przydatnych komponentów Core HAL HIDL:

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
Schemat XSD pliku konfiguracyjnego zasad audio /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd

Domyślna implementacja interfejsu API Core HAL ( /hardware/interfaces/audio/core/all-versions/default/ ) jest opakowaniem implementacji HAL sprzed wersji Treble, wykorzystującej starsze biblioteki współdzielone . Domyślną implementację można również uznać za odniesienie podczas wdrażania nowych wersji warstw Audio HAL, które bezpośrednio współdziałają ze sterownikami jądra.

Efekty HAL

Poniższa tabela przedstawia lokalizację przydatnych komponentów Effects HAL korzystających z języka HIDL:

Wpływa na komponent 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 Effects HAL w /hardware/interfaces/audio/effect/all-versions/default/ oraz w sekcji Efekty audio .

Wspólny HAL

Wspólny interfejs API HAL wykorzystujący HIDL zawiera następujące elementy:

  • Definicje ( /hardware/interfaces/audio/common/6.0/types.hal ) udostępniane przez interfejsy API Core i Effect.
  • Narzędzia ( /hardware/interfaces/audio/common/all-versions ) używane do pomocy w kodowaniu względem interfejsów API HIDL na potrzeby implementacji, klientów i testów.

Aktualizacje do Audio HAL V7

Istnieją znaczące zmiany w wersji 7 Audio HAL w systemie Android 12, jak opisano w tej sekcji. Audio HAL V7 wykonuje następujące czynności:

  • Ujednolica modele danych używane przez platformę i HAL.
  • Minimalizuje powielanie typów danych HIDL (wyliczeń) i schematu XML używanego do konfiguracji zasad audio.

W szczególności zmiany wprowadzono w Audio HAL V7 w następujących obszarach:

Zmiany te zostały omówione bardziej szczegółowo w odpowiednich rozdziałach.

Wyliczenia

Począwszy od wersji Audio HAL V7, wyliczone typy używane w pliku konfiguracyjnym 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 duplikację. Aby tego uniknąć w wersji 7, typy wyliczeniowe zostały zmienione na string , a zamiast tego wszystkie możliwe wartości wyliczeniowe są wymienione w schemacie XSD.

Rysunek 2 porównuje niektóre zmiany typu wyliczeniowego 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 : rozszerzalne przez dostawcę
  • AudioFormat : rozszerzalny przez dostawcę
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

Przekaż wartości wyliczeniowe ciągu

Wartości łańcuchowe służą do przesyłania informacji w postaci wartości wyliczeniowych przez granicę interfejsu HAL. Zarówno framework, jak i opakowanie HAL wykorzystują wartości wyliczeniowe w postaci 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 ciągu.

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

  1. Wartość wyliczeniowa AudioFormat jest konwertowana na wartość ciągu w libaudiohal i przekazywana do warstwy HAL.
  2. Po stronie HAL domyślne opakowanie konwertuje ciąg znaków 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) umożliwia lepszą weryfikację pliku XML konfiguracji polityki audio przez VTS. Wprowadziliśmy zmiany w pliku konfiguracyjnym zasad audio używanym z HAL V7, aby zachować zgodność z XSD.

W wersji 7 standardowy znak (spacja) jest używany do oddzielania 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 rozgraniczenia listy wartości 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 . 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

W wersji 7 na nowo zdefiniowaliśmy niektóre struktury danych, aby zminimalizować duplikaty definicji. Powtarzające się krotki elementów danych są grupowane w struktury wielokrotnego użytku. Te struktury danych korzystają z najnowszych funkcji HIDL, takich jak bezpieczne związki.

Na przykład w wersji V6 i niższych w interfejsach i typach HIDL często używana jest potrójna wartość <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żywany przez AudioConfig , AudioOffloadInfo , AudioPortConfig

  • AudioProfile := <format, {sampling rates}, {channel masks}>

    zastępuje luźne kolekcje w AudioPort/PortConfig

  • AudioPortExtendedInfo := device | mix | session

    zastępuje złączki w AudioPort/PortConfig

Tagi dostawcy

Oprócz typów i formatów urządzeń dostawcy mogą dodawać niestandardowe tagi do metadanych ścieżki audio.

W celu odtwarzania i nagrywania metadanych ś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.

Dodano tagi dostawcy dla metadanych ścieżki odtwarzania, jak pokazano w poniższym przykładzie:

struct PlaybackTrackMetadata {
…
    /** Tags from AudioTrack audio attributes */
    vec<AudioTag> tags;
};

Struktura RecordTrackMetadata jest implementowana w podobny sposób poprzez dodanie tagów specyficznych dla metadanych ścieżki nagrania.

Przestrzeń nazw rozszerzeń dostawców

Począwszy od HAL V7, rozszerzenia dostawców wymagają dodatkowego prefiksu {vendor} , który nie jest wymagany w wersji 6. Aby prefiks {vendor} był prawidłowy, musi zawierać co najmniej trzy znaki alfanumeryczne.

Użyj następującego formatu w wersji 7:

VX_{ vendor }_{ letters/numbers }

Poniżej znajduje się kilka przykładów prawidłowych rozszerzeń dostawców V7:

  • VX_ GOOGLE _VR
  • VX_ QCI _AMBIENT_MIC

Informacje o wersji

W poniższej tabeli wymieniono numery wersji HAL dla każdej wersji Androida:

Wersja na Androida Wersja HIDLHAL
Androida 13 7.1
Androida 12 7,0
Androida 11 6,0
Androida 10 5,0
Androida 9 4,0
Androida 8 2.0