W Androidzie 13 i starszych interfejs Audio HAL jest definiowany za pomocą HIDL w plikach HIDL HAL (z rozszerzeniem .hal
) oraz schematów XSD w plikach konfiguracyjnych, jak pokazano poniżej.
Rysunek 1. Interfejs HAL audio.
Pliki konfiguracji
Pliki konfiguracji XML zasad audio i efektów audio są uważane za część interfejsu Audio HIDL HAL. Pliki te muszą być zgodne ze schematami, a zgodność jest weryfikowana za pomocą testów VTS.
W ramach implementacji interfejsu HAL HIDL audio musisz utworzyć plik konfiguracji zasad audio, który opisuje topologię audio. Aby framework mógł korzystać z możliwości interfejsu HAL audio, muszą one być zadeklarowane w pliku audio_policy_configuration.xml
.
Audio HIDL HAL API
W tej sekcji opisujemy interfejsy API HAL Core, Effects i Common dla HIDL.
Podstawowa warstwa HAL
Oto niektóre z najważniejszych interfejsów HAL podstawowego, które korzystają z HIDL:
IDeviceFactory.hal
to punkt wejściowy interfejsu API.IDevice.hal
iIPrimaryDevice.hal
zawierają metody takie jaksetMasterVolume
lubopenInputStream
.- Strumienie są jednokierunkowe i są używane przez AudioFlinger do wysyłania i odbierania dźwięku do i z HAL za pomocą
IStream.hal
,IStreamOut.hal
iIStreamIn.hal
.
W tabeli poniżej znajdziesz lokalizacje przydatnych komponentów HIDL podstawowej warstwy HAL:
Podstawowy komponent HAL | Lokalizacja |
---|---|
Najnowsza wersja interfejsu API | /hardware/interfaces/audio/6.0
|
Typy specyficzne dla najnowszego interfejsu Core HAL API | /hardware/interfaces/audio/6.0/types.hal
|
Schemat XSD pliku konfiguracji zasad dotyczących dźwięku | /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 otoka wokół implementacji HAL sprzed Treble, która korzysta z starszych bibliotek współdzielonych.
Domyślną implementację można też traktować jako punkt odniesienia podczas implementowania nowych wersji interfejsów HAL audio, które bezpośrednio współpracują ze sterownikami jądra.
Warstwa HAL efektów
W tabeli poniżej znajdziesz lokalizacje przydatnych komponentów HAL efektów korzystających z HIDL:
Komponent HAL efektów | Lokalizacja |
---|---|
Najnowsza wersja interfejsu API | /hardware/interfaces/audio/effect/6.0/
|
Schemat XSD pliku konfiguracji efektu | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
Więcej informacji znajdziesz w przykładowej implementacji interfejsu HAL API efektów w /hardware/interfaces/audio/effect/all-versions/default/
oraz w sekcji Efekty audio.
Common HAL
Interfejs Common HAL API korzystający z HIDL zawiera te elementy:
- Definicje (
/hardware/interfaces/audio/common/6.0/types.hal
) udostępniane przez interfejsy Core API i Effect API. - Narzędzia (
/hardware/interfaces/audio/common/all-versions
) ułatwiające pisanie kodu w interfejsach HIDL API na potrzeby implementacji, klientów i testów.
Zmiany w warstwie HAL audio w wersji 7
W Androidzie 12 wprowadzono istotne zmiany w wersji 7 interfejsu HAL audio, które opisujemy w tej sekcji. Warstwa HAL audio w wersji 7 wykonuje te czynności:
- Ujednolica modele danych używane przez platformę i HAL.
- Minimalizuje duplikowanie między typami danych HIDL (wyliczeniami) a schematem XML używanym do konfiguracji zasad audio.
W szczególności zmiany zostały wprowadzone w tych obszarach w przypadku Audio HAL w wersji 7:
Te zmiany są szczegółowo omówione w odpowiednich sekcjach.
Wyliczenia
Od wersji 7 HAL dźwięku typy wyliczeniowe używane w pliku konfiguracji zasad dźwięku są definiowane tylko w schemacie XSD, a nie w HIDL.
W przypadku Audio HAL w wersji 6 wartości typów wyliczeniowych (np. AudioFormat
) w types.hal
są też zdefiniowane w schemacie XSD pliku konfiguracji zasad audio, co powoduje duplikację. Aby tego uniknąć w wersji 7, typy wyliczeniowe zostały zmienione na string
, a wszystkie możliwe wartości wyliczeniowe są wymienione w schemacie XSD.
Na rysunku 2 porównano niektóre zmiany w typie wyliczeniowym AudioFormat
w wersji 7:
Rysunek 2. Porównanie niektórych zmian w wyliczeniu AudioFormat.
Na poniższej liście znajdziesz typy wyliczeniowe, które zostały przekonwertowane na string
:
AudioChannelMask
AudioContentType
AudioDevice
: Rozszerzalne przez dostawcęAudioFormat
: rozszerzalne przez dostawcęAudioGainMode
AudioSource
AudioStreamType
AudioUsage
Przekazywanie wartości typu wyliczeniowego w postaci ciągu znaków
Wartości ciągów znaków są używane do przesyłania informacji jako wartości wyliczeniowe przez granicę interfejsu HAL. Zarówno framework, jak i otoczka HAL używają wartości wyliczeniowych typu integer do implementowania logiki biznesowej i stosują podejście do konwersji przedstawione na rysunku 3:
Rysunek 3. Przekazywanie wartości typu wyliczeniowego w postaci ciągu znaków.
Na przykład, aby przekazać wartość typu formatu audio z platformy do dostawcy:
- Wartość wyliczeniowa
AudioFormat
jest konwertowana na wartość ciągu znaków wlibaudiohal
i przekazywana do HAL. - Po stronie HAL domyślny moduł opakowujący konwertuje ciąg znaków na wartość wyliczeniową, która jest przekazywana do starszej wersji HAL.
Zmiany schematu XML
Pełne listy wartości wyliczeniowych w definicji schematu XML (XSD) umożliwiają lepszą weryfikację pliku XML konfiguracji zasad dotyczących dźwięku przez VTS. Wprowadziliśmy zmiany w pliku konfiguracyjnym zasad audio używanym z HAL w wersji 7, aby był zgodny z XSD.
W wersji 7 do oddzielania list wartości w atrybutach (takich jak częstotliwości próbkowania, maski kanałów i flagi) używany jest standardowy znak ␣
(spacja), a nie symbole ,
(przecinek) i |
(pionowa kreska) używane w wersji 6 i starszych. Jak widać w poniższym przykładzie, spacja służy do rozdzielania listy wartości w przypadku parametru channelMasks
:
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
Aby wprowadzić zmiany symboli, użyj automatycznego skryptu konwersji o nazwie
update_audio_policy_config.sh
. Aby przekonwertować plik konfiguracyjny zasad audio w wersji 6 na wersję 7 na urządzeniu Pixel 5 (Redfin), użyj tego polecenia:
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 zmieniliśmy definicje niektórych struktur danych, aby zminimalizować duplikaty. 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 unie.
Na przykład w wersji 6 i starszych w interfejsach i typach HIDL często używa się trójki <format, sampling rate, channel mask>
. Aby usunąć tę nadmiarowość, w wersji 7 typ danych AudioConfigBase
i inne typy danych są zdefiniowane w ten 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 sumy w
AudioPort/PortConfig
Tagi dostawcy
Oprócz typów urządzeń i formatów dostawcy mogą dodawać niestandardowe tagi do metadanych ścieżki audio.
W przypadku metadanych ścieżki odtwarzania i nagrywania dostawcy mogą przekazywać własne tagi, które służą do dodawania atrybutów do strumieni wejścia/wyjścia audio z aplikacji do HAL.
Tagi dostawcy dotyczące metadanych ścieżki odtwarzania są dodawane w sposób pokazany w tym przykładzie:
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
Struktura RecordTrackMetadata
jest wdrażana w podobny sposób przez dodanie tagów specyficznych dla metadanych ścieżki nagrania.
Przestrzenie nazw rozszerzeń dostawców
Od wersji HAL 7 rozszerzenia dostawcy wymagają dodatkowego prefiksu {vendor}
, który nie jest wymagany w wersji 6. Aby prefiks {vendor}
był prawidłowy, musi zawierać co najmniej 3 znaki alfanumeryczne.
W wersji 7 użyj tego formatu:
VX_{vendor}_{letters/numbers}
Oto kilka przykładów prawidłowych rozszerzeń dostawcy w wersji 7:
VX_GOOGLE_VR
VX_QCI_AMBIENT_MIC
Informacje o wersji
W tabeli poniżej podano numer wersji HAL dla każdej wersji Androida:
Wersja Androida | Wersja HIDL HAL |
---|---|
Android 13 | 7.1 |
Android 12 | 7,0 |
Android 11 | 6.0 |
Android 10 | 5,0 |
Android 9 | 4.0 |
Android 8 | 2,0 |