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

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

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

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

В предыдущих версиях Android требовалось использовать device/<company>/<device>/audio/audio_policy.conf для объявления аудиоустройств, присутствующих в вашем продукте (вы можете увидеть пример этого файла для аудиооборудования Galaxy Nexus в device/samsung/tuna/audio/audio_policy.conf ). 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 описание топологии определяет ограничения соединения.
  • Поддержка include позволяет избежать повторения стандартных определений отправки 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 (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, основанной на подключаемых модулях и правилах структуре для обработки параметров.

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

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

Медиа-кодеки

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