Слой аппаратной абстракции аудио (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 |