HIDL Аудио 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 , чтобы платформа могла их использовать.

Аудио HIDL HAL API

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

Базовый HAL

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

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

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

Основной компонент 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 до Treble с использованием устаревших общих библиотек . Реализация по умолчанию также может рассматриваться как образец при реализации новых версий Audio HAL, которые напрямую взаимодействуют с драйверами ядра.

Эффекты ХАЛ

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

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

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

Общий HAL

Общий API HAL, использующий HIDL, содержит следующее:

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

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

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

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

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

Эти изменения более подробно обсуждаются в соответствующих разделах.

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

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

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

На рис. 2 сравниваются некоторые изменения в перечислимом типе AudioFormat в V7:

audioformat-change

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

В следующем списке перечислены типы, преобразованные в string :

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

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

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

audio-passing-values

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

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

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

Изменения схемы XML

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

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

<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />

Чтобы изменить символ, используйте сценарий автоматического преобразования под названием update_audio_policy_config.sh . Используйте следующую команду, чтобы преобразовать файл конфигурации аудиополитики V6 в версию V7 для устройства 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, такие как безопасные объединения.

Например, в V6 и ниже тройка <format, sampling rate, channel mask> часто используется в интерфейсах и типах HIDL. Чтобы устранить эту избыточность, в V7 тип данных 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 V7, для расширений поставщиков требуется дополнительный префикс {vendor} , который не требуется в V6. Чтобы префикс {vendor} был действительным, он должен состоять из трех или более буквенно-цифровых символов.

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

VX_{ vendor }_{ letters/numbers }

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

  • VX_ GOOGLE _VR
  • VX_ QCI _AMBIENT_MIC

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

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

Android-версия HIDL-версия HAL
Андроид 13 7.1
Андроид 12 7.0
Андроид 11 6.0
Андроид 10 5.0
Андроид 9 4.0
Андроид 8 2.0