В Android 13 и более ранних версиях интерфейс Audio HAL определяется с помощью HIDL в файлах HIDL HAL (с расширением .hal) и схем XSD для файлов конфигурации, как показано ниже.
Рисунок 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:
Рисунок 2. Сравнение некоторых изменений в перечислении AudioFormat.
Ниже приведен список типов перечислений, которые были преобразованы в string:
AudioChannelMaskAudioContentTypeAudioDevice: расширяемый поставщикомAudioFormat: расширяемый поставщикомAudioGainModeAudioSourceAudioStreamTypeAudioUsage
Передача значений перечисления строк
Строковые значения используются для передачи информации в виде перечисляемых значений через границу интерфейса HAL. И фреймворк, и оболочка HAL используют целочисленные значения перечислений для реализации бизнес-логики и применяют подход к преобразованию, показанный на рисунке 3:
Рисунок 3. Передача строковых значений enum.
Например, чтобы передать значение типа аудиоформата из фреймворка поставщику, выполните следующие действия:
- Значение перечисления
AudioFormatпреобразуется в строковое значение вlibaudiohalи передается в HAL. - На стороне 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,AudioPortConfigAudioProfile := <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_VRVX_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 |