Слой аппаратной абстракции аудио (HAL) Android соединяет высокоуровневые API-интерфейсы аудио-инфраструктуры в android.media с базовыми аудиодрайверами и оборудованием. Audio HAL определяет стандартный интерфейс, к которому обращаются аудиосервисы. Это должно быть реализовано для правильной работы звукового оборудования.
На этой странице представлен обзор звукового HAL и подробные сведения о его API и требованиях к реализации.
Аудио интерфейс HAL
Аудиоинтерфейс HAL определяется с помощью HIDL в файлах .hal и схем XSD для файлов конфигурации, как показано ниже.

Рис. 1. Аудиоинтерфейс HAL
Файлы конфигурации
XML-файлы конфигурации звуковой политики и звуковых эффектов считаются частью интерфейса Audio HAL. Эти файлы должны соответствовать своим схемам, и это соответствие проверяется тестами VTS.
В рамках реализации аудио HAL необходимо создать файл конфигурации политики аудио , описывающий топологию аудио. Возможности аудио HAL должны быть объявлены в файле audio_policy_configuration.xml , чтобы платформа могла их использовать.
Аудио HAL API
Аудио HAL содержит следующие API:
- Ядро HAL
- Эффекты HAL
- Общий HAL
Каждый из этих API описан в следующих разделах.
Ядро HAL
Core HAL — это основной API, используемый AudioFlinger для воспроизведения звука и управления маршрутизацией звука. Вот некоторые из ключевых интерфейсов:
-
IDeviceFactory.hal— это точка входа в API. -
IDevice.halиIPrimaryDevice.halсодержат такие методы, какsetMasterVolumeилиopenInputStream. - Потоки являются однонаправленными и используются AudioFlinger для отправки или получения звука в HAL и из него через
IStream.hal,IStreamOut.halиIStreamIn.hal.
В следующей таблице указано расположение полезных компонентов 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 до Treble с использованием устаревших общих библиотек . Реализация по умолчанию также может рассматриваться как справочная при реализации новых версий аудио HAL, которые напрямую взаимодействуют с драйверами ядра.
Эффекты HAL
Эффекты HAL API используются структурой эффектов для управления звуковыми эффектами. Вы также можете настроить эффекты предварительной обработки , такие как автоматическая регулировка усиления и шумоподавление, с помощью HAL API эффектов.
В следующей таблице указано расположение полезных компонентов HAL эффектов.
| Эффекты компонента HAL | Расположение |
|---|---|
| Последняя версия API | /hardware/interfaces/audio/effect/6.0/ |
| XSD-схема файла конфигурации эффекта | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd |
Дополнительные сведения см. в примере реализации HAL API эффектов ( /hardware/interfaces/audio/effect/all-versions/default/ ) и в разделе « Аудиоэффекты ».
Общий HAL
Common HAL — это библиотека общих типов данных, используемых API Core и Effects HAL. У него нет интерфейсов и связанных с ним тестов VTS, поскольку он определяет только структуры данных. Общий API HAL содержит следующее:
- Определения (
/hardware/interfaces/audio/common/6.0/types.hal), общие для Core и Effect API. - Утилиты (
/hardware/interfaces/audio/common/all-versions), используемые для облегчения написания кода с использованием HIDL API для реализаций, клиентов и тестов.
Требования
В дополнение к реализации звукового HAL и созданию файла конфигурации звуковой политики необходимо соблюдать следующие требования HAL:
- Если захват для Sound Trigger (захват из буфера DSP горячего слова) поддерживается одним входным профилем, реализация должна поддерживать количество активных потоков в этом профиле, соответствующее количеству одновременных сеансов, поддерживаемых Sound Trigger HAL.
- Параллельность передачи голосового вызова и захвата из процессора приложения, как описано на странице Параллельный захват .
Обновления аудио HAL V7
Чтобы решить проблемы обратной совместимости, стабильная версия AIDL является обязательной для всех изменений HAL, начиная с Android T. Для поддержки и улучшения внедрения AIDL в Android T и более поздних версиях Audio HAL V7 делает следующее:
- Унифицирует модели данных, используемые платформой и HAL.
- Сводит к минимуму дублирование между типами данных HIDL (перечислениями) и схемой XML, используемой для настройки политики аудио.
В частности, в аудио HAL V7 внесены изменения в следующих областях:
Эти изменения более подробно обсуждаются в соответствующих разделах.
Перечисления
Начиная с Audio HAL V7, перечисляемые типы, используемые в файле конфигурации политики аудио, определяются только в схеме XSD, а не в HIDL.
В аудио HAL V6 значения типов enum (таких как AudioFormat ) в types.hal также определяются в схеме XSD файла конфигурации политики аудио, создавая дублирование. Чтобы избежать этого в версии 7, типы перечисления изменены на string , а все возможные значения перечисления перечислены в схеме XSD.
См. рис. 2 для сравнения некоторых изменений в типе перечисления AudioFormat в V7.

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

Рисунок 3. Передача строковых значений enum
Например, чтобы передать значение типа аудиоформата из фреймворка поставщику:
- Значение перечисления
AudioFormatпреобразуется в строковое значение вlibaudiohalи передается в HAL. - На стороне HAL оболочка по умолчанию преобразует строку в значение перечисления, которое передается в устаревший HAL.
Изменения XML-схемы
Наличие полных списков значений перечисления в определении схемы XML (XSD) позволяет улучшить проверку XML-файла конфигурации политики аудио с помощью VTS. Изменения вносятся в файл конфигурации политики аудио, используемый с HAL V7, для соответствия XSD.
В версии 7 вместо , ( ␣ ) и | (вертикальная черта) символы, используемые в 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,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-версия | HAL-версия |
|---|---|
| Андроид 12 | 7,0 |
| Андроид 11 | 6,0 |
| Андроид 10 | 5,0 |
| Андроид 9 | 4.0 |
| Андроид 8 | 2.0 |