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

Рисунок 1. Аудиоинтерфейс HAL.
Файлы конфигурации
XML-файлы конфигурации аудиополитики и аудиоэффектов являются частью интерфейса Audio HIDL HAL. Эти файлы должны соответствовать своим схемам, и это соответствие проверяется тестами VTS.
 В рамках реализации аудиоинтерфейса HIDL HAL необходимо создать файл конфигурации аудиополитики , описывающий топологию звука. Возможности аудиоинтерфейса HAL должны быть объявлены в файле audio_policy_configuration.xml , чтобы фреймворк мог их использовать.
Аудио HIDL HAL API
В этом разделе описываются основные 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 | 
| Типы, специфичные для новейшего API Core HAL |  /hardware/interfaces/audio/6.0/types.hal | 
| Схема XSD файла конфигурации аудиополитики |  /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd | 
 Реализация API Core HAL по умолчанию ( /hardware/interfaces/audio/core/all-versions/default/ ) представляет собой оболочку для реализации HAL до 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
Общий HAL API, использующий HIDL, содержит следующее:
-  Определения ( 
/hardware/interfaces/audio/common/6.0/types.hal), общие для API ядра и эффектов. -  Утилиты ( 
/hardware/interfaces/audio/common/all-versions), используемые для облегчения кодирования с использованием API HIDL для реализаций, клиентов и тестов. 
Обновления Audio HAL V7
В этом разделе описаны существенные изменения в Audio HAL версии 7 в 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: 

Рисунок 2. Сравнение некоторых изменений в перечислении AudioFormat.
 В следующем списке приведены типы перечисления, преобразованные в string :
-  
AudioChannelMask -  
AudioContentType -  
AudioDevice: расширяемый поставщиком -  
AudioFormat: расширяемый поставщиком -  
AudioGainMode -  
AudioSource -  
AudioStreamType -  
AudioUsage 
Передача строковых значений перечисления
Строковые значения используются для передачи информации в виде значений перечисления через границу интерфейса HAL. Как фреймворк, так и оболочка HAL используют целочисленные значения перечисления для реализации бизнес-логики и используют подход преобразования, показанный на рисунке 3 :

Рисунок 3. Передача значений строкового перечисления.
Например, чтобы передать значение типа аудиоформата из фреймворка поставщику:
-  Значение перечисления 
AudioFormatпреобразуется в строковое значение вlibaudiohalи передается в HAL. - На стороне HAL оболочка по умолчанию преобразует строку в значение перечисления, которое передается в устаревший HAL.
 
Изменения XML-схемы
Наличие полных списков значений enum в определении 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
Типы данных
Мы переопределили некоторые структуры данных в версии 7, чтобы минимизировать дублирование определений. Повторяющиеся кортежи элементов данных группируются в повторно используемые структуры. Эти структуры данных используют новейшие функции HIDL, такие как безопасные объединения.
 Например, в версии V6 и ниже в интерфейсах и типах HIDL часто используется тройка <format, sampling rate, channel mask> . Чтобы устранить эту избыточность, в версии V7 тип данных AudioConfigBase и другие типы данных определяются следующим образом:
AudioConfigBase := <format, sampling rate, channel mask>AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>используется
AudioConfig,AudioOffloadInfo,AudioPortConfigAudioProfile := <format, {sampling rates}, {channel masks}>заменяет свободные коллекции в
AudioPort/PortConfigAudioPortExtendedInfo := 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 |