HIDL Audio HAL

В Android 13 и более ранних версиях интерфейс Audio HAL определяется с помощью HIDL в файлах HIDL HAL (с расширением .hal) и схем XSD для файлов конфигурации, как показано ниже.

audio_hal

Рисунок 1. Интерфейс HAL аудио.

Файлы конфигурации

XML-файлы конфигурации аудиоправил и аудиоэффектов считаются частью интерфейса Audio HIDL HAL. Эти файлы должны соответствовать своим схемам, и это соответствие проверяется тестами VTS.

При реализации аудиоинтерфейса HIDL HAL необходимо создать файл конфигурации аудиоправил, в котором описывается аудиотопология. Чтобы фреймворк мог использовать возможности HAL аудио, их необходимо указать в файле audio_policy_configuration.xml.

Audio HIDL HAL API

В этом разделе описаны основные, общие и HAL-интерфейсы эффектов для HIDL.

Основной уровень HAL

Некоторые из ключевых интерфейсов Core HAL, использующих HIDL, следующие:

  • IDeviceFactory.hal – точка входа в API.
  • IDevice.hal и IPrimaryDevice.hal содержат методы, например setMasterVolume или openInputStream.
  • Потоки однонаправленные. AudioFlinger использует их для отправки и получения аудиоданных в HAL и из него через IStream.hal, IStreamOut.hal и IStreamIn.hal.

В таблице ниже указано расположение полезных компонентов HIDL Core HAL:

Основной компонент HAL Местоположение
Последняя версия API /hardware/interfaces/audio/6.0
Типы, относящиеся к последней версии Core HAL API /hardware/interfaces/audio/6.0/types.hal
Схема XSD файла конфигурации правил для аудио /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd

Реализация Core HAL API по умолчанию (/hardware/interfaces/audio/core/all-versions/default/) – это оболочка для реализации HAL, которая использовалась до появления Project Treble, с устаревшими общими библиотеками. Реализация по умолчанию также может использоваться в качестве справочной при реализации новых версий Audio HAL, которые взаимодействуют с драйверами ядра напрямую.

HAL эффектов

В таблице ниже указано расположение полезных компонентов Effects HAL, использующих HIDL.

Компонент HAL эффектов Местоположение
Последняя версия API /hardware/interfaces/audio/effect/6.0/
Схема XSD файла конфигурации эффекта /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd

Дополнительную информацию можно найти в разделе Аудиоэффекты и в примере реализации API HAL эффектов на странице /hardware/interfaces/audio/effect/all-versions/default/.

Общий HAL

Common HAL API с использованием HIDL содержит следующие элементы:

  • Определения (/hardware/interfaces/audio/common/6.0/types.hal), общие для Core API и Effect API.
  • Утилиты (/hardware/interfaces/audio/common/all-versions), которые помогают писать код для HIDL API для реализаций, клиентов и тестов.

Обновления Audio HAL V7

В Android 12 в версию 7 Audio HAL были внесены значительные изменения, описанные в этом разделе. Audio HAL V7 выполняет следующие действия:

  • Объединяет модели данных, используемые фреймворком и HAL.
  • Минимизирует дублирование между типами данных HIDL (перечислениями) и XML-схемой, используемой для конфигурации правил аудио.

В частности, изменения внесены в следующие области Audio HAL V7:

Подробная информация об этих изменениях приведена в соответствующих разделах.

Перечисления

Начиная с Audio HAL V7, перечисляемые типы, используемые в файле конфигурации аудиополитики, определяются только в схеме XSD, а не в HIDL.

В Audio HAL V6 значения типов enum (например, AudioFormat) в types.hal также определены в схеме XSD файла конфигурации аудиополитики, что приводит к дублированию. Чтобы избежать этого в версии 7, типы перечислений были изменены на string, а все возможные перечисляемые значения перечислены в схеме XSD.

На рисунке 2 показаны некоторые изменения, внесенные в перечисление AudioFormat в версии 7:

audioformat-change

Рисунок 2. Сравнение некоторых изменений в перечислении AudioFormat.

Ниже приведен список типов перечислений, которые были преобразованы в string:

  • AudioChannelMask
  • AudioContentType
  • AudioDevice: расширяемый поставщиком
  • AudioFormat: расширяемый поставщиком
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

Передача значений перечисления строк

Строковые значения используются для передачи информации в виде перечисляемых значений через границу интерфейса HAL. И фреймворк, и оболочка HAL используют целочисленные значения перечислений для реализации бизнес-логики и применяют подход к преобразованию, показанный на рисунке 3:

передача значений аудио

Рисунок 3. Передача строковых значений enum.

Например, чтобы передать значение типа аудиоформата из фреймворка поставщику, выполните следующие действия:

  1. Значение перечисления AudioFormat преобразуется в строковое значение в libaudiohal и передается в HAL.
  2. На стороне HAL оболочка по умолчанию преобразует строку в значение перечисления, которое передается в устаревший HAL.

Изменения в XML-схеме

Наличие полных списков значений перечислений в определении XML-схемы (XSD) позволяет VTS лучше проверять XML-файлы конфигурации аудиополитики. Мы внесли изменения в файл конфигурации правил обработки аудио, используемый с HAL V7, чтобы обеспечить соответствие XSD.

В V7 для разделения списков значений в атрибутах (например, частоты дискретизации, маски каналов и флаги) используется стандартный символ ␣ (пробел) вместо символов , (запятая) и | (вертикальная черта), используемых в V6 и более ранних версиях. Как показано в примере ниже, для разделения значений в списке для параметра channelMasks используется пробел:

<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />

Чтобы изменить символы, используйте скрипт автоматического преобразования update_audio_policy_config.sh. Ниже показана команда для преобразования файла конфигурации правил аудио версии 6 в версию 7 для устройства Pixel 5 (Redfin).

hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0

Типы данных

Мы переопределили некоторые структуры данных в V7, чтобы минимизировать дублирование определений. Повторяющиеся кортежи элементов данных группируются в структуры, которые можно использовать повторно. В этих структурах данных используются новейшие функции HIDL, такие как безопасные объединения.

Например, в версии 6 и более ранних тройка <format, sampling rate, channel mask> часто используется в интерфейсах и типах HIDL. Чтобы устранить эту избыточность, в версии 7 тип данных AudioConfigBase и другие типы данных определяются следующим образом:

  • AudioConfigBase := <format, sampling rate, channel mask>

  • AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>

    используется в AudioConfig, AudioOffloadInfo, AudioPortConfig

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

    заменяет отдельные коллекции в AudioPort/PortConfig;

  • AudioPortExtendedInfo := device | mix | session

    заменяет объединения в AudioPort/PortConfig

Теги поставщиков

Помимо типов устройств и форматов, поставщики могут добавлять специальные теги для метаданных аудиодорожек.

Для метаданных дорожек воспроизведения и записи поставщики могут передавать собственные теги, которые используются для добавления атрибутов к аудиопотокам ввода-вывода из приложений в HAL.

Теги поставщиков для метаданных трека воспроизведения добавляются, как показано в следующем примере:

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

Структура RecordTrackMetadata реализуется аналогичным образом путем добавления тегов, относящихся к метаданным трека.

Пространство имен для расширений поставщиков

Начиная с HAL версии 7, для расширений поставщика требуется дополнительный префикс {vendor}, который не нужен в версии 6. Чтобы префикс {vendor} был действительным, он должен состоять из трех или более букв и цифр.

В версии 7 используйте следующий формат:

VX_{vendor}_{letters/numbers}

Ниже приведены примеры допустимых расширений поставщика версии 7.

  • VX_GOOGLE_VR
  • VX_QCI_AMBIENT_MIC

Информация о версии.

В таблице ниже указаны номера версий HAL для каждой версии Android.

Версию Android. Версия 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