Слой аппаратной абстракции аудио (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,- 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-версия | HAL-версия | 
|---|---|
| Андроид 12 | 7,0 | 
| Андроид 11 | 6,0 | 
| Андроид 10 | 5,0 | 
| Андроид 9 | 4.0 | 
| Андроид 8 | 2.0 | 
