HIDL Аудио HAL

В Android 13 и более ранних версиях интерфейс Audio HAL определяется с помощью HIDL в файлах HIDL HAL (с расширением .hal ) и схемах XSD для файлов конфигурации, как показано ниже.

audio_hal

Рисунок 1. Аудиоинтерфейс HAL.

Файлы конфигурации

Файлы конфигурации XML для политик звука и звуковых эффектов считаются частью интерфейса Audio HIDL HAL. Эти файлы должны соответствовать своим схемам, и соответствие проверяется с помощью тестов VTS.

В рамках реализации аудио HIDL HAL необходимо создать файл конфигурации политики аудио , описывающий топологию аудио. Для того чтобы платформа могла использовать возможности аудио HAL, их необходимо объявить в файле audio_policy_configuration.xml .

Аудио HIDL HAL API

В этом разделе описываются основные API HAL, API эффектов и общие API HAL для HIDL.

Core HAL

Ниже представлены некоторые ключевые интерфейсы Core HAL, использующие HIDL:

  • IDeviceFactory.hal — это точка входа в API.
  • IDevice.hal и IPrimaryDevice.hal содержат такие методы, как setMasterVolume или openInputStream .
  • Потоки являются однонаправленными и используются AudioFlinger для отправки или приема аудиосигнала в HAL и из него через IStream.hal , IStreamOut.hal и IStreamIn.hal .

В следующей таблице указано расположение полезных компонентов Core HAL HIDL:

Основной компонент HAL Расположение
Последняя версия API /hardware/interfaces/audio/6.0
Типы, специфичные для последней версии API Core HAL. /hardware/interfaces/audio/6.0/types.hal
Схема XSD файла конфигурации политики аудио /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd

Реализация API Core HAL по умолчанию ( /hardware/interfaces/audio/core/all-versions/default/ ) представляет собой обертку над реализацией HAL до версии 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 Effects HAL по адресу /hardware/interfaces/audio/effect/all-versions/default/ и раздел «Аудиоэффекты» .

Common HAL

API Common HAL, использующий HIDL, содержит следующее:

  • Определения ( /hardware/interfaces/audio/common/6.0/types.hal ), используемые совместно API ядра и эффектов.
  • Утилиты ( /hardware/interfaces/audio/common/all-versions ) используются для упрощения написания кода с использованием HIDL API для реализаций, клиентов и тестов.

Обновления для Audio HAL V7

В версии 7 Audio HAL в Android 12 произошли значительные изменения, описанные в этом разделе. Audio HAL V7 выполняет следующие функции:

  • Объединяет модели данных, используемые фреймворком и HAL.
  • Сводит к минимуму дублирование данных между типами данных HIDL (перечислениями) и XML-схемой, используемой для настройки политики аудио.

В частности, в Audio HAL V7 внесены изменения в следующие области:

Эти изменения более подробно обсуждаются в соответствующих разделах.

Перечисления

Начиная с Audio HAL V7, перечисляемые типы, используемые в файле конфигурации политики аудио, определяются только в схеме XSD, а не в HIDL.

В Audio HAL V6 значения типов перечислений (например, AudioFormat ) в types.hal также определены в схеме XSD файла конфигурации политики аудио, что приводит к дублированию. Чтобы избежать этого в V7, типы перечислений заменены на string , и все возможные значения перечислений указаны в схеме XSD.

На рисунке 2 сравниваются некоторые изменения в типе перечисления AudioFormat в версии V7:

audioformat-change

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

Для получения информации о типах перечислений, преобразованных в string , обратитесь к следующему списку:

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

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

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

audio-passing-values

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

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

  1. В libaudiohal значение перечисления AudioFormat преобразуется в строковое значение и передается в HAL.
  2. На стороне HAL стандартный обёрточный модуль преобразует строку в значение перечисления, которое передаётся в устаревший HAL.

Изменения XML-схемы

Наличие полных списков значений перечислений в определении XML-схемы (XSD) позволяет улучшить проверку XML-файла конфигурации аудиополитики системой VTS. Мы внесли изменения в файл конфигурации аудиополитики, используемый с HAL V7, чтобы он соответствовал стандарту XSD.

В версии V7 для разделения списков значений в атрибутах (таких как частота дискретизации, маски каналов и флаги) используется стандартный символ (пробел), вместо символов , (запятая) и | (вертикальная черта), используемых в версиях 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

Типы данных

В версии 7 мы переопределили некоторые структуры данных, чтобы свести к минимуму дублирование определений. Повторяющиеся кортежи элементов данных сгруппированы в многократно используемые структуры. Эти структуры данных используют новейшие возможности HIDL, такие как безопасные объединения.

Например, в версиях V6 и ниже в интерфейсах и типах HIDL часто используется тройка <format, sampling rate, channel mask> . Чтобы устранить эту избыточность, в версии 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 Версия 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