HAL HIDL Audio

Na urządzeniach z Androidem 13 i starszym interfejsem HAL Audio zdefiniowane za pomocą HIDL w plikach HIDL HAL (z parametrem rozszerzenie .hal) i Schematy XSD dla w plikach konfiguracji, jak pokazano poniżej.

dźwięk_hal

Rysunek 1. Interfejs audio HAL.

Pliki konfiguracji

Pliki konfiguracji XML zasad dotyczących dźwięku i efektów audio są uważane za część interfejsu Audio HIDL HAL. Pliki te muszą być zgodne ze schematami. zgodność jest weryfikowana w ramach testów VTS.

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

Interfejs Audio HIDL HAL API

W tej sekcji opisano Core, Effects i Common HAL API dla HIDL.

Podstawowa HAL

Oto niektóre z najważniejszych interfejsów Core HAL, które korzystają z HIDL:

  • 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 wykorzystywane przez AudioFlinger do wysyłania i odbierania dźwięk do i z HAL przez IStream.hal, IStreamOut.hal oraz IStreamIn.hal

W poniższej tabeli znajdują się lokalizacje przydatnych komponentów Core HAL HIDL:

Podstawowy komponent HAL Lokalizacja
Najnowsza wersja interfejsu API /hardware/interfaces/audio/6.0
Typy związane z najnowszą wersją interfejsu Core HAL API /hardware/interfaces/audio/6.0/types.hal
Schemat XSD pliku konfiguracji zasady 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 otokę obejmującą implementację HAL sprzed Treble, wykorzystując starszych bibliotek udostępnionych. Implementację domyślną można też traktować jako wskazówkę, gdy: wdrożenie nowych wersji HAL audio, które współdziałają ze sterownikami jądra systemu operacyjnego. bezpośrednio.

HAL efektów

W poniższej tabeli znajdziesz lokalizację przydatnych komponentów HAL efektów, które wykorzystują 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 Efekty HAL API na stronie /hardware/interfaces/audio/effect/all-versions/default/ i w sekcji Efekty audio.

Wspólna wartość HAL

Oto elementy interfejsu Common HAL API korzystającego z HIDL:

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

Aktualizacje audio HAL V7

W wersji 7 wprowadziliśmy istotne zmiany Android 12 zgodnie z opisem w tej sekcji. HAL V7 obsługuje te funkcje:

  • Ujednolica modele danych używane przez platformę i HAL.
  • Minimalizuje duplikowanie typów danych HIDL (wyliczenia) i schematu XML używany do konfiguracji zasad audio.

Wprowadzamy zmiany w następujących obszarach w interfejsie Audio HAL 7:

Szczegółowo omawiamy te zmiany w poszczególnych sekcjach.

Wyliczenia

Począwszy od Audio HAL w wersji 7, typy wymienione w konfiguracji zasad audio są zdefiniowane tylko w schemacie XSD, a nie w HIDL.

W audio HAL V6 wartości typów wyliczeniowych (np. AudioFormat) w types.hal to: zdefiniowane również w schemacie XSD pliku konfiguracji zasad audio, tworząc i powielaniu. Aby tego uniknąć w wersji 7, typy wyliczenia zostały zmienione na string oraz wszystkie możliwe wartości wyliczenia są zamiast tego wymienione w schemacie XSD.

Rysunek 2 porównuje niektóre zmiany z typem wyliczenia AudioFormat w wersji 7:

zmiana formatu dźwięku

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:

  • AudioChannelMask
  • AudioContentType
  • AudioDevice: możliwość rozszerzania dostawcy
  • AudioFormat: możliwość rozszerzania dostawcy
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

Przekazywanie wartości wyliczeniowych w ciągu znaków

Wartości ciągów znaków służą do przenoszenia informacji jako wartości wyliczeniowych między do granicy interfejsu HAL. Zarówno platforma, jak i narzędzie Kod HAL używa wartości wyliczeniowych całkowitych do implementacji logiki biznesowej podejście do konwersji przedstawione na Rys. 3:

wartości-przekazywane audio

Rysunek 3. Przekazywanie wartości wyliczeniowych w postaci ciągów tekstowych.

Aby na przykład przekazać wartość typu formatu audio z platformy do dostawca:

  1. Wartość wyliczenia AudioFormat jest konwertowana na wartość ciągu znaków w libaudiohal i jest przekazywany do HAL.
  2. Po stronie HAL domyślny kod konwertuje ciąg znaków na wyliczenie która jest przekazywana do starszej wersji HAL.
.

Zmiany schematu XML

Posiadanie pełnych list wartości wyliczeniowych w definicji schematu XML (XSD) umożliwia w celu uzyskania lepszej weryfikacji pliku XML konfiguracji zasad audio przez VTS. Stworzyliśmy zmian w pliku konfiguracji zasad audio używanym w kodzie HAL V7, aby zapewnić zgodność XSD.

W wersji 7 do oddzielania list wartości w (takie jak częstotliwość próbkowania, maski kanału czy flagi) zamiast atrybutu , (przecinek) oraz | (pionowa kreska) używane w wersji 6 i starszych. Zgodnie z tabelą W poniższym przykładzie spacja służy do ograniczania listy wartości argumentu channelMasks:

<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />

Aby zmienić symbol, użyj skryptu automatycznej konwersji o nazwie update_audio_policy_config.sh Aby przekonwertować wersję 6, skorzystaj z następującego polecenia pliku konfiguracji zasad audio do wersji V7 na urządzeniu 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

Na nowo zdefiniowaliśmy niektóre struktury danych w wersji 7, aby zminimalizować liczbę duplikatów definicji. Powtarzające się krotki elementów danych są grupowane jako wielokrotnego użytku w różnych strukturach. Te struktury danych wykorzystują najnowsze funkcje HIDL, takie jak bezpieczne związki.

Na przykład w wersji 6 i starszych to potrójna wartość <format, sampling rate, channel mask>. jest często używany w interfejsach i typach HIDL. Aby usunąć tę nadmiarowość, w polu W wersji 7 AudioConfigBasetypy danych i inne typy danych są zdefiniowane tak:

  • 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 regionie AudioPort/PortConfig

Tagi dostawcy

Oprócz typów i formatów urządzeń dostawcy mogą dodawać niestandardowe tagi audio metadanych utworu.

W przypadku metadanych odtwarzania i nagrywania ścieżek dostawcy mogą przekazać własne tagi, które służą do dodawania atrybutów do strumieni I/O audio, od aplikacji po HAL.

Tagi dostawców metadanych ścieżki odtwarzania są dodawane w następujący sposób: przykład:

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

Struktura RecordTrackMetadata jest implementowana w podobny sposób przez dodając tagi przeznaczone specjalnie dla metadanych utworu nagranego na żywo.

Tempo nazw rozszerzeń dostawców

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

W wersji 7 użyj następującego formatu:

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

W tabeli poniżej znajdziesz numery wersji HAL poszczególnych wersji Androida:

Wersja Androida Wersja HAL HIDL
Android 13 7.1
Android 12 7,0
Android 11 6.0
Android 10 5,0
Android 9 4.0
Android 8 2,0