Аудио ХАЛ

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

На этой странице представлен обзор звукового HAL и подробные сведения о его API и требованиях к реализации.

Аудио интерфейс HAL

Аудиоинтерфейс HAL определяется с помощью HIDL в файлах .hal и схем XSD для файлов конфигурации, как показано ниже.

audio_hal

Рис. 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.

audioformat-change

Рисунок 2. Сравнение некоторых изменений в перечислении AudioFormat

Обратитесь к следующему списку типов enum, которые были преобразованы в String :

  • AudioChannelMask
  • AudioContentType
  • AudioDevice : расширяемый поставщиком
  • AudioFormat : расширяемый поставщиком
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

Передать строковые значения перечисления

Строковые значения используются для передачи информации в виде значений перечисления через границу интерфейса HAL. И платформа, и оболочка HAL используют целочисленные значения перечисления для реализации бизнес-логики и используют подход преобразования, изображенный на рисунке 3 .

audio-passing-values

Рисунок 3. Передача строковых значений enum

Например, чтобы передать значение типа аудиоформата из фреймворка поставщику:

  1. Значение перечисления AudioFormat преобразуется в строковое значение в libaudiohal и передается в HAL.
  2. На стороне 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