W Androidzie 13 i starszych wersjach interfejs Audio HAL jest
definiowany za pomocą HIDL w plikach HIDL HAL (z
rozszerzeniem .hal) oraz
XSD schematów dla
plików konfiguracji, jak pokazano poniżej.
Rysunek 1. Interfejs Audio HAL.
Pliki konfiguracji
Pliki konfiguracji XML zasad audio i efektów dźwiękowych są uważane za część interfejsu Audio HIDL HAL. Te pliki muszą być zgodne ze swoimi schematami, a zgodność jest weryfikowana przez testy VTS.
W ramach implementacji Audio HIDL HAL musisz utworzyć
plik konfiguracji zasad audio
który opisuje topologię audio. Możliwości Audio HAL muszą być zadeklarowane w pliku audio_policy_configuration.xml, aby platforma mogła z nich korzystać.
Interfejs API Audio HIDL HAL
W tej sekcji opisujemy interfejsy API Core, Effects i Common HAL dla HIDL.
Core HAL
Oto niektóre z kluczowych interfejsów Core HAL używających HIDL:
IDeviceFactory.halto punkt wejścia do interfejsu API.IDevice.haliIPrimaryDevice.halzawierają metody takie jaksetMasterVolumeczyopenInputStream.- 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.haliIStreamIn.hal.
W tabeli poniżej znajdziesz lokalizację przydatnych komponentów Core HAL HIDL:
| Komponent Core 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 audio | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd
|
Domyślna implementacja interfejsu Core HAL API (/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 odniesienie podczas implementowania nowych wersji Audio HAL, które bezpośrednio współpracują ze sterownikami jądra.
Effects HAL
W tabeli poniżej znajdziesz lokalizację przydatnych komponentów Effects HAL używających HIDL:
| Komponent Effects HAL | Lokalizacja |
|---|---|
| Najnowsza wersja interfejsu API | /hardware/interfaces/audio/effect/6.0/
|
| Schemat XSD pliku konfiguracji efektów | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
Więcej informacji znajdziesz w przykładowej implementacji interfejsu
Effects HAL API w /hardware/interfaces/audio/effect/all-versions/default/ oraz w sekcji Efekty dźwiękowe.
Common HAL
Interfejs Common HAL API używający HIDL zawiera:
- Definicje (
/hardware/interfaces/audio/common/6.0/types.hal) współdzielone przez interfejsy Core i Effect API. - Narzędzia (
/hardware/interfaces/audio/common/all-versions) ułatwiające kodowanie w interfejsach HIDL API na potrzeby implementacji, klientów i testów.
Aktualizacje Audio HAL V7
W Androidzie 12 wprowadziliśmy istotne zmiany w wersji 7 Audio HAL, które opisujemy w tej sekcji. Audio HAL V7:
- 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 w Audio HAL V7 dotyczą tych obszarów:
Te zmiany są szczegółowo omówione w odpowiednich sekcjach.
Wyliczenia
Od wersji Audio HAL V7 typy wyliczeniowe używane w pliku konfiguracji zasad audio są definiowane tylko w schemacie XSD, a nie w HIDL.
W Audio HAL V6 wartości typów wyliczeniowych (np. AudioFormat) w types.hal są też zdefiniowane w schemacie XSD pliku konfiguracji zasad audio, co powoduje duplikowanie. Aby tego uniknąć w wersji 7, typy wyliczeniowe są zmieniane na string, a wszystkie możliwe wartości wyliczeniowe są wymienione w schemacie XSD.
Rysunek 2 przedstawia porównanie niektórych zmian w typie wyliczeniowym AudioFormat w wersji 7:
Rysunek 2. Porównanie niektórych zmian w wyliczeniu AudioFormat.
Na liście poniżej znajdziesz typy wyliczeniowe, które zostały przekonwertowane na string:
AudioChannelMaskAudioContentTypeAudioDevice: rozszerzalny przez dostawcęAudioFormat: rozszerzalny przez dostawcęAudioGainModeAudioSourceAudioStreamTypeAudioUsage
Przekazywanie wartości wyliczeniowych typu string
Wartości typu string są używane do przesyłania informacji jako wartości wyliczeniowe przez granicę interfejsu HAL. Zarówno platforma, jak i otoka 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 wyliczeniowych typu string.
Aby na przykład przekazać wartość typu formatu audio z platformy do dostawcy:
- Wartość wyliczeniowa
AudioFormatjest konwertowana na wartość typu string wlibaudiohali przekazywana do HAL. - Po stronie HAL domyślna otoka 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 audio przez VTS. Wprowadziliśmy zmiany w pliku konfiguracji zasad audio używanym z HAL V7, aby był zgodny z XSD.
W wersji 7 do rozdzielania list wartości w atrybutach (takich jak częstotliwości próbkowania, maski kanałów i flagi) używamy standardowego znaku ␣ (spacja) zamiast symboli , (przecinek) i | (pionowa kreska) używanych w wersji 6 i starszych. Jak widać w poniższym przykładzie, spacja jest używana do rozdzielania listy wartości 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 konfiguracji 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 ponownie zdefiniowaliśmy niektóre struktury danych, aby zminimalizować duplikowanie 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 unie.
Na przykład w wersji 6 i starszych w interfejsach i typach HIDL często używana jest trójka <format, sampling rate, channel mask>. Aby usunąć tę redundancję, w wersji 7 typ danych AudioConfigBase i inne typy danych są definiowane w ten sposób:
AudioConfigBase := <format, sampling rate, channel mask>AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>używane przez
AudioConfig,AudioOffloadInfo,AudioPortConfigAudioProfile := <format, {sampling rates}, {channel masks}>zastępuje luźne kolekcje w
AudioPort/PortConfigAudioPortExtendedInfo := device | mix | sessionzastępuje unie w
AudioPort/PortConfig
Tagi dostawców
Oprócz typów i formatów urządzeń dostawcy mogą dodawać niestandardowe tagi metadanych ścieżki audio.
W przypadku metadanych ścieżki odtwarzania i nagrywania dostawcy mogą przekazywać własne tagi, które są używane do dodawania atrybutów do strumieni wejścia/wyjścia audio z aplikacji do HAL.
Tagi dostawców 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 implementowana w podobny sposób przez dodanie tagów specyficznych dla metadanych ścieżki nagrywania.
Przestrzeń nazw rozszerzeń dostawców
Od wersji 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 3 znaki alfanumeryczne.
W wersji 7 użyj tego formatu:
VX_{vendor}_{letters/numbers}
Oto kilka przykładów prawidłowych rozszerzeń dostawców w wersji 7:
VX_GOOGLE_VRVX_QCI_AMBIENT_MIC
Informacje o wersji
W tabeli poniżej znajdziesz 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 |