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

В релизе 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 и для версий Android ниже 12.

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

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

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

Включенные файлы

Метод 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

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

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

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

Настройка с использованием Parameter Framework

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

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

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

AOSP включает пример файла конфигурации аудиополитики, использующего Parameter Framework, по адресу 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 .

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

Медиакодеки

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