Настройте правила для аудио

В Android 10 значительно переработан менеджер правил аудио, чтобы обеспечить большую гибкость при поддержке сложных автомобильных сценариев использования:

  • Стратегии маршрутизации для определенных производителей.
  • Настраиваемые группы громкости для групп устаревших типов потоков, использующих одни и те же кривые громкости.
  • Стратегии маршрутизации, объявленные движком правил аудио, а не жестко закодированные.
  • Кривые громкости и группы, управляемые механизмом правил аудио.
  • Внутренний рефакторинг, подготавливающий к будущему разделению общего и настраиваемого кода и предлагающий более широкие возможности управления аудиоустройствами. Например, в правилах можно использовать все свойства устройства, а не только его тип.

В Android 7.0 появился формат файла конфигурации правил аудио (XML) для описания топологии аудио.

В предыдущих версиях Android для объявления аудиоустройств, присутствующих в продукте, требовалось использовать файл device/<company>/<device>/audio/audio_policy.conf. Пример такого файла для аудиооборудования Galaxy Nexus можно найти на странице device/samsung/tuna/audio/audio_policy.conf. Однако CONF – это простой проприетарный формат, который слишком ограничен, чтобы описывать сложные топологии для таких вертикалей, как телевизоры и автомобили.

В Android 7.0 файл audio_policy.conf был объявлен устаревшим и была добавлена поддержка определения топологии аудио с помощью XML-файла, который более удобен для чтения, имеет широкий спектр инструментов редактирования и синтаксического анализа и достаточно гибок для описания сложных топологий аудио. В Android 7.0 для выбора формата XML файлов конфигурации используется флаг сборки USE_XML_AUDIO_POLICY_CONF.

Преимущества формата XML

Как и в файле CONF, в XML-файле можно задать количество и типы профилей входного и выходного потоков, устройства, которые можно использовать для воспроизведения и записи, а также атрибуты аудио. Кроме того, формат XML имеет следующие преимущества:

  • В Android 10 можно одновременно запустить несколько приложений для записи.
    • Запуск записи никогда не отклоняется из-за одновременного выполнения нескольких действий.
    • Функция обратного вызова registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) уведомляет клиентов об изменениях пути захвата.
  • В следующих ситуациях клиент получает образцы аудио без звука:
    • Активен вариант использования, связанный с конфиденциальностью (например, VOICE_COMMUNICATION).
    • У клиента нет активной службы или активного интерфейса.
    • Специальные роли распознаются правилом:
      • Сервис специальных возможностей. Может записывать, даже если активен вариант использования, связанный с конфиденциальностью.
      • Ассистент. Считается конфиденциальным, если интерфейс находится поверх других окон.
  • Аудиопрофили имеют структуру, аналогичную простым дескрипторам аудио HDMI, что позволяет использовать разные наборы частот дискретизации и масок каналов для каждого аудиоформата.
  • Для всех возможных подключений между устройствами и потоками данных есть четкие определения. Ранее неявное правило позволяло подключать все устройства, присоединенные к одному модулю HAL, и не давало правилу аудио контролировать подключения, запрошенные с помощью API аудиопатчей. В формате XML описание топологии определяет ограничения на подключение.
  • Поддержка включает стандартные определения A2DP, USB или перенаправления.
  • Кривые громкости можно настраивать. Ранее таблицы объемов были жестко закодированы. Таблицы объемов описаны в формате XML и могут быть настроены.

В шаблоне по адресу frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml показано, как используются многие из этих функций.

Формат и местоположение файла

Новый файл конфигурации правил для аудиоконтента – audio_policy_configuration.xml. Он находится в папке /system/etc. Ниже приведены примеры простой конфигурации аудиоправил в формате XML-файла для Android 12 и более ранних версий.

Структура верхнего уровня содержит модули, соответствующие каждому аппаратному модулю HAL аудио, где каждый модуль имеет список портов микширования, портов устройств и маршрутов:

  • Порты микширования описывают возможные профили конфигурации для потоков, которые можно открыть в HAL аудио для воспроизведения и записи.
  • Порты устройств описывают устройства, которые можно подключить, с указанием их типа (и, если применимо, адреса и свойств аудио).
  • Маршруты отделены от дескриптора порта микширования, что позволяет описывать маршруты от устройства к устройству или от потока к устройству.

Таблицы громкости – это простые списки точек, определяющих кривую, которая используется для преобразования индекса пользовательского интерфейса в громкость в дБ. Отдельный файл include содержит кривые по умолчанию, но каждую кривую для определенного варианта использования и категории устройства можно переопределить.

Включение файлов

Метод включения XML-файлов (XInclude) можно использовать для добавления информации о конфигурации правил аудио, которая находится в других XML-файлах. Все файлы должны соответствовать описанной выше структуре со следующими ограничениями:

  • Файлы могут содержать только элементы верхнего уровня.
  • Файлы не должны содержать элементы XInclude.

Используйте директиву include, чтобы не копировать стандартную информацию о конфигурации модуля HAL аудио Android Open Source Project (AOSP) во все файлы конфигурации аудиополитики (это может привести к ошибкам). Стандартный XML-файл конфигурации правил для аудио предоставляется для следующих HAL:

  • A2DP: a2dp_audio_policy_configuration.xml
  • Перенаправление подмикса: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

Организация кода правил в отношении аудио

AudioPolicyManager.cpp состоит из нескольких модулей, что упрощает его обслуживание и настройку. Структура frameworks/av/services/audiopolicy включает следующие модули:

Модуль Описание
/managerdefault Включает общие интерфейсы и реализацию поведения, общую для всех приложений. Похож на AudioPolicyManager.cpp, но без функций поисковой системы и общих концепций.
/common Определяет базовые классы (например, структуры данных для профилей аудиопотоков ввода-вывода, дескрипторов аудиоустройств, аудиопатчей и аудиопортов). Ранее это было определено в AudioPolicyManager.cpp.
/engine

Применяет правила, определяющие, какие устройства и уровни громкости должны использоваться в том или ином случае. Он реализует стандартный интерфейс с общей частью, например для получения подходящего устройства для определенного варианта использования воспроизведения или захвата или для установки подключенных устройств или внешнего состояния (то есть состояния вызова принудительного использования), которое может изменить решение о маршрутизации.

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

/engineconfigurable Реализация механизма правил, основанная на Parameter Framework (см. ниже). Конфигурация основана на фреймворке параметров, а правила определяются XML-файлами.
/enginedefault Реализация механизма правил на основе предыдущих реализаций Android Audio Policy Manager. Это значение по умолчанию, которое включает заданные в коде правила, соответствующие реализациям Nexus и AOSP.
/service Включает интерфейсы связывателя, реализацию потоков и блокировки с интерфейсом для остальной части фреймворка.

Конфигурация с помощью Parameter Framework

Код аудиополитики организован так, чтобы его было легко понять и поддерживать, а также поддерживать аудиополитику, полностью определяемую файлами конфигурации. Организация и дизайн аудиополитики основаны на Intel Parameter Framework, фреймворке на основе плагинов и правил для обработки параметров.

Настраиваемые правила для аудио позволяют производителям оригинального оборудования:

  • Описывать структуру системы и ее параметры в XML.
  • Напишите на C++ или используйте существующий серверный код (плагин) для доступа к описанным параметрам.
  • Определите (в XML или на предметно-ориентированном языке) условия и правила, при которых определенный параметр должен принимать определенное значение.

В AOSP есть пример файла конфигурации правил аудио, в котором используется фреймворк параметров: Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml. Подробную информацию можно найти в документации Intel по Parameter Framework.

В Android 10 и более ранних версиях настраиваемая аудиополитика выбирается с помощью параметра сборки USE_CONFIGURABLE_AUDIO_POLICY. В Android 11 или более поздней версии версия аудиополитики выбирается в файле audio_policy_configuration.xml. Чтобы выбрать настраиваемый механизм правил для аудио, задайте для атрибута engine_library элемента globalConfiguration значение configurable, как показано в примере ниже.

<audioPolicyConfiguration>
    <globalConfiguration engine_library="configurable" />
...
</audioPolicyConfiguration>

API маршрутизации аудио

В Android 6.0 появился общедоступный API перечисления и выбора, который работает на основе инфраструктуры аудиопатчей и аудиопортов и позволяет разработчикам приложений указывать предпочтительное устройство вывода или ввода для подключенных аудиозаписей или треков.

В Android 7.0 API перечисления и выбора проверяется тестами CTS и расширен, чтобы включать маршрутизацию для нативных аудиопотоков C/C++ (OpenSL ES). Маршрутизация нативных потоков по-прежнему выполняется на языке Java, но теперь с использованием интерфейса AudioRouting, который заменяет, объединяет и делает устаревшими явные методы маршрутизации, относящиеся к классам AudioTrack и AudioRecord.

Подробнее об Enumeration and Selection API можно узнать в интерфейсах конфигурации Android и OpenSLES_AndroidConfiguration.h. Подробнее о маршрутизации аудио…

Поддержка по нескольким каналам

Если ваше оборудование и драйвер поддерживают многоканальный звук через HDMI, вы можете выводить аудиопоток напрямую на аудиооборудование (в обход микшера AudioFlinger, чтобы он не сводился к двум каналам). HAL аудио должен сообщать, поддерживает ли профиль выходного потока многоканальное аудио. Если HAL предоставляет информацию о своих возможностях, менеджер политик по умолчанию разрешает многоканальное воспроизведение через HDMI. Подробную информацию можно найти в статье device/samsung/tuna/audio/audio_hw.c.

Чтобы указать, что в вашем продукте есть многоканальный аудиовыход, отредактируйте файл конфигурации правил использования аудиоконтента и добавьте описание многоканального выхода. В приведенном ниже примере из файла frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml показана динамическая маска канала, которая означает, что менеджер правил обработки аудиозаписей запрашивает маски каналов, поддерживаемые приемником HDMI, после подключения.

Вы также можете указать статическую маску канала, например AUDIO_CHANNEL_OUT_5POINT1. Микшер AudioFlinger автоматически преобразует многоканальный звук в стерео, если аудиоустройство не поддерживает многоканальный звук.

Медиакодеки

Убедитесь, что аудиокодеки, поддерживаемые вашим оборудованием и драйверами, правильно объявлены для вашего продукта. Подробнее о том, как предоставить доступ к кодекам для фреймворка…