В 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 для 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:
Рисунок 2. Сравнение некоторых изменений в перечислении AudioFormat.
В следующем списке перечислены типы, преобразованные в string
:
-
AudioChannelMask
-
AudioContentType
-
AudioDevice
: расширяемый поставщиком -
AudioFormat
: расширяемый поставщиком -
AudioGainMode
-
AudioSource
-
AudioStreamType
-
AudioUsage
Передача строковых значений перечисления
Строковые значения используются для передачи информации в виде значений перечисления через границу интерфейса HAL. И платформа, и оболочка HAL используют целочисленные значения перечисления для реализации бизнес-логики и применяют подход преобразования, показанный на рисунке 3 :
Рисунок 3. Передача строковых значений перечисления.
Например, чтобы передать значение типа аудиоформата из платформы поставщику:
- Значение перечисления
AudioFormat
преобразуется в строковое значение вlibaudiohal
и передается в 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
Типы данных
Мы переопределили некоторые структуры данных в 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 |