В 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 HAL, API эффектов и общие API HAL для HIDL.
Core 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 Effects HAL по адресу /hardware/interfaces/audio/effect/all-versions/default/ и раздел «Аудиоэффекты» .
Common HAL
API Common HAL, использующий HIDL, содержит следующее:
- Определения (
/hardware/interfaces/audio/common/6.0/types.hal), используемые совместно API ядра и эффектов. - Утилиты (
/hardware/interfaces/audio/common/all-versions) используются для упрощения написания кода с использованием HIDL API для реализаций, клиентов и тестов.
Обновления для 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:

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

Рисунок 3. Передача строковых значений перечисления.
Например, для передачи значения типа аудиоформата из фреймворка поставщику:
- В
libaudiohalзначение перечисленияAudioFormatпреобразуется в строковое значение и передается в HAL. - На стороне 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
Типы данных
В версии 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 |
|---|---|
| Android 13 | 7.1 |
| Android 12 | 7.0 |
| Android 11 | 6.0 |
| Android 10 | 5.0 |
| Android 9 | 4.0 |
| Android 8 | 2.0 |