Настройка политик аудио

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

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

В 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 использует флаг сборки USE_XML_AUDIO_POLICY_CONF для выбора формата XML файлов конфигурации.

Преимущества формата 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 и для версий ниже Android 12.

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

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

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

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

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

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

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

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

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

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

Конфигурация с использованием структуры параметров

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

Использование настраиваемой политики аудио позволяет поставщикам OEM-производителей:

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

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

В 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 .

Подробную информацию об API перечисления и выбора см. в разделах Интерфейсы конфигурации Android и OpenSLES_AndroidConfiguration.h . Подробную информацию о маршрутизации звука см. в разделе AudioRouting .

Многоканальная поддержка

Если ваше оборудование и драйвер поддерживают многоканальный звук через 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 автоматически микширует контент в стерео при отправке на аудиоустройство, которое не поддерживает многоканальный звук.

Медиакодеки

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