Выпуск 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.
Показать пример политики аудио для Android 12
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <audioPolicyConfiguration version="7.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <globalConfiguration speaker_drc_enabled="true"/> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>Speaker</item> <item>Earpiece</item> <item>Built-In Mic</item> </attachedDevices> <defaultOutputDevice>Speaker</defaultOutputDevice> <mixPorts> <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> <mixPort name="primary input" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address=""> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> </devicePorts> <routes> <route type="mix" sink="Earpiece" sources="primary output"/> <route type="mix" sink="Speaker" sources="primary output"/> <route type="mix" sink="Wired Headset" sources="primary output"/> <route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/> </routes> </module> <xi:include href="a2dp_audio_policy_configuration.xml"/> </modules> <xi:include href="audio_policy_volumes.xml"/> <xi:include href="default_volume_tables.xml"/> </audioPolicyConfiguration>
Показать пример политики аудио для версий ниже Android 12
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <globalConfiguration speaker_drc_enabled="true"/> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>Speaker</item> <item>Earpiece</item> <item>Built-In Mic</item> </attachedDevices> <defaultOutputDevice>Speaker</defaultOutputDevice> <mixPorts> <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> <mixPort name="primary input" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address=""> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> </devicePorts> <routes> <route type="mix" sink="Earpiece" sources="primary output"/> <route type="mix" sink="Speaker" sources="primary output"/> <route type="mix" sink="Wired Headset" sources="primary output"/> <route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/> </routes> </module> <xi:include href="a2dp_audio_policy_configuration.xml"/> </modules> <xi:include href="audio_policy_volumes.xml"/> <xi:include href="default_volume_tables.xml"/> </audioPolicyConfiguration>
Структура верхнего уровня содержит модули, соответствующие каждому аппаратному модулю аудио HAL, где каждый модуль имеет список портов микширования, портов устройств и маршрутов:
- Микс-порты описывают возможные профили конфигурации для потоков, которые можно открыть в аудио HAL для воспроизведения и захвата.
- Порты устройств описывают устройства, которые можно подключить, с указанием их типа (и, при необходимости, адреса и свойств звука, если это необходимо).
- Маршруты отделены от дескриптора микшерного порта, что позволяет описывать маршруты от устройства к устройству или потока к устройству.
Таблицы громкости представляют собой простые списки точек, определяющих кривую, используемую для преобразования индекса пользовательского интерфейса в громкость в дБ. Отдельный включаемый файл содержит кривые по умолчанию, но каждую кривую для данного варианта использования и категории устройства можно перезаписать.
Показать пример таблицы томов
<?xml version="1.0" encoding="UTF-8"?> <volumes> <reference name="FULL_SCALE_VOLUME_CURVE"> <point>0,0</point> <point>100,0</point> </reference> <reference name="SILENT_VOLUME_CURVE"> <point>0,-9600</point> <point>100,-9600</point> </reference> <reference name="DEFAULT_VOLUME_CURVE"> <point>1,-4950</point> <point>33,-3350</point> <point>66,-1700</point> <point>100,0</point> </reference> </volumes>
Показать пример объемов
<?xml version="1.0" encoding="UTF-8"?> <volumes> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA"ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_SPEAKER"> <point>1,-5500</point> <point>20,-4300</point> <point>86,-1200</point> <point>100,0</point> </volume> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="SILENT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="SILENT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="SILENT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/> </volumes>
Включения файлов
Метод 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, после подключения.
Показать пример конфигурации устройства HDMI
<module name="primary" halVersion="2.0"> <attachedDevices> <item>Speaker</item> </attachedDevices> <defaultOutputDevice>Speaker</defaultOutputDevice> <mixPorts> <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> <mixPort name="direct" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT" /> <mixPort name="tunnel" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_HW_AV_SYNC" /> </mixPorts> <devicePorts> <devicePort tagName="Speaker" type="AUDIO_DEVICE_OUT_SPEAKER" role="sink" /> <devicePort tagName="Out Aux Digital" type="AUDIO_DEVICE_OUT_AUX_DIGITAL" role="sink" encodedFormats="AUDIO_FORMAT_AC3 AUDIO_FORMAT_IEC61937" /> </devicePorts> <routes> <route type="mix" sink="Speaker" sources="primary output"/> <route type="mix" sink="Out Aux Digital" sources="primary output,direct,tunnel"/> </routes> </module>
Вы также можете указать статическую маску канала, например AUDIO_CHANNEL_OUT_5POINT1
. Микшер AudioFlinger автоматически преобразует контент в стерео при отправке на аудиоустройство, которое не поддерживает многоканальный звук.
Медиакодеки
Убедитесь, что аудиокодеки, поддерживаемые вашим оборудованием и драйверами, правильно заявлены для вашего продукта. Подробности см. в разделе «Предоставление кодеков фреймворку» .