Функция комбинированной маршрутизации аудиоустройств добавляет поддержку потоковой передачи звука на несколько аудиоустройств одновременно. Используя эту функцию, привилегированные приложения могут выбирать несколько предпочтительных устройств для определённой стратегии через системные API. Приложения могут более точно определять возможности аудиоустройств, используя общедоступные API, предоставляемые этой функцией. В версиях Android 11 и ниже реализация аудиофреймворка имеет ограниченную поддержку нескольких аудиоустройств одного типа (например, двух Bluetooth-гарнитур A2DP), подключенных одновременно. Правила маршрутизации аудио по умолчанию также не позволяют пользователям выбирать несколько устройств одного типа для данного сценария использования.
Начиная с Android 12, эти ограничения сняты, что позволяет использовать новые возможности, такие как аудиовещание, многоадресная передача на группу наушников BLE или одновременный выбор нескольких звуковых карт USB. Маршрутизация на несколько USB-устройств одновременно не поддерживается.
Начиная с Android 14, инфраструктура USB поддерживает маршрутизацию на несколько USB-устройств при условии, что USB-устройства являются аудиоустройствами разных типов, а также имеется поддержка ядра и поставщика для одновременного подключения нескольких USB-устройств.
На этой странице рассказывается, как реализовать поддержку потоковой передачи звука на несколько аудиоустройств, а также как проверить реализацию этой функции.
Поддержка потоковой передачи звука на несколько аудиоустройств
В Android 12 есть два набора API, поддерживающих эту функцию:
- Системные API обрабатывают несколько предпочтительных устройств для одной стратегии.
- Интерфейс HIDL, реализованный поставщиком как часть аудио HAL, сообщает о возможностях устройства.
В следующих разделах каждый из этих API обсуждается более подробно.
Обрабатывайте несколько предпочтительных устройств для стратегии
Диспетчер аудиополитик предлагает системные API для лучшей поддержки потоковой передачи звука на несколько аудиоустройств одновременно. Эти системные API позволяют настраивать, получать и удалять несколько предпочитаемых устройств для заданной стратегии. До Android 12 эта функция поддерживалась только для одного устройства.
Диспетчер аудиополитик вводит концепцию активных медиаустройств для описания устройств, которые с наибольшей вероятностью будут выбраны для воспроизведения медиаконтента. При подключении съёмного устройства может потребоваться открыть выходные аудиопотоки HAL, которые могут быть направлены на это устройство, и проверить их на наличие поддерживаемых атрибутов.
При открытии выходного потока необходимо указать аудиоустройство. Активное медиаустройство — это устройство, используемое при открытии выходных потоков в данном контексте.
Выбор активного медиаустройства может меняться в зависимости от того, какие устройства подключены или отключены. Диспетчер аудиополитик использует следующий набор правил для выбора активных медиаустройств:
- Если все предпочтительные устройства для мультимедиа доступны, все они выбираются в качестве активных устройств.
- В противном случае выбирается последнее подключенное съемное устройство.
- Если съемные устройства не подключены, для выбора активных устройств применяются правила политики аудио по умолчанию для выбора выходных устройств.
Чтобы выходной поток был повторно открыт и направлен на активные устройства, он должен удовлетворять следующим критериям, чтобы была выбрана наилучшая конфигурация для воспроизведения:
- Выходной поток должен поддерживать активные устройства.
- Выходной поток должен поддерживать динамические профили.
- Выходной поток не должен быть в данный момент направлен на активные устройства.
Чтобы применить новый выбор устройства, диспетчер политик звука закрывает и снова открывает выходной поток при подключении устройства, если выходной поток бездействует, или откладывает его до тех пор, пока выходной поток не перейдет в режим ожидания.
Audio Policy Manager предлагает следующий список системных API (как определено в AudioManager.java
):
setPreferredDeviceForStrategy
Устанавливает предпочтительное устройство для маршрутизации звука для заданной стратегии. Обратите внимание, что устройство может быть недоступно на момент установки предпочтительного устройства, но будет использоваться после того, как станет доступным.
removePreferredDeviceForStrategy
Удаляет предпочитаемые аудиоустройства, ранее установленные с помощью
setPreferredDeviceForStrategy
илиsetPreferredDevicesForStrategy
.getPreferredDeviceForStrategy
Возвращает предпочтительное устройство для аудиостратегии, ранее заданной с помощью
setPreferredDeviceForStrategy
илиsetPreferredDevicesForStrategy
.setPreferredDevicesForStrategy
Устанавливает предпочтительные устройства для данной стратегии.
getPreferredDevicesForStrategy
Возвращает предпочтительные устройства для аудиостратегии, ранее заданной с помощью
setPreferredDeviceForStrategy
илиsetPreferredDevicesForStrategy
.OnPreferredDevicesForStrategyChangedListener
Определяет интерфейс для уведомления об изменениях в предпочтительных аудиоустройствах, которые установлены для данной аудиостратегии.
addOnPreferredDevicesForStrategyChangedListener
Добавляет прослушиватель для получения уведомлений об изменениях в аудиоустройстве, выбранном в соответствии со стратегией.
removeOnPreferredDevicesForStrategyChangedListener
Удаляет ранее добавленный прослушиватель изменений в аудиоустройстве, выбранном в соответствии со стратегией.
Отчет о возможностях устройства
В рамках реализации Audio HAL поставщики реализуют API, поддерживающие отчётность о возможностях устройств. В этом разделе объясняются типы данных и методы, используемые для отчётности о возможностях устройств, а также перечисляются некоторые изменения, внесённые в Audio HIDL HAL V7 для поддержки нескольких устройств.
Типы данных
В аудиоинтерфейсе HIDL HAL V7 возможности устройства описываются с помощью структур AudioProfile
и AudioTransport
. Структура AudioTransport
описывает возможности аудиопорта с помощью AudioProfile
для известных аудиоформатов или с помощью необработанных аппаратных дескрипторов для форматов, неизвестных платформе. Структура AudioProfile
содержит аудиоформат, поддерживаемые профилем частоты дискретизации и список масок каналов, как показано в следующем блоке кода из types.hal
:
/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
AudioFormat format;
/** List of the sample rates (in Hz) supported by the profile. */
vec<uint32_t> sampleRates;
/** List of channel masks supported by the profile. */
vec<AudioChannelMask> channelMasks;
};
В аудио HIDL HAL V7 тип данных AudioPort
определяется структурами AudioTransport
и AudioProfile
для описания возможностей устройства.
Методы аудио HAL
Диспетчер аудиополитик использует следующие методы для запроса возможностей устройства:
-
getParameters:
универсальный метод для получения значений параметров, специфичных для поставщика, таких как поддерживаемые аудиоформаты и соответствующие им частоты дискретизации. -
getAudioPort:
возвращает список поддерживаемых атрибутов (таких как частоты дискретизации, форматы, маски каналов, контроллеры усиления) для заданного аудиопорта.
Следующий код из IDevice.hal
показывает интерфейс для метода getAudioPort
:
/**
* Returns the list of supported attributes for a given audio port.
*
* As input, 'port' contains the information (type, role, address etc...)
* needed by the HAL to identify the port.
*
* As output, 'resultPort' contains possible attributes (sampling rates,
* formats, channel masks, gain controllers...) for this port.
*
* @param port port identifier.
* @return retval operation completion status.
* @return resultPort port descriptor with all parameters filled up.
*/
getAudioPort(AudioPort port)
generates (Result retval, AudioPort resultPort);
Изменения в устаревшем API
Для поддержки нескольких аудиопрофилей в устаревшем API версии 3.2 добавлена новая структура audio_port_v7
. Подробнее см. в исходном коде .
В связи с добавлением audio_port_v7
в версию 3.2 устаревшего API добавлен новый API под названием get_audio_port_v7
для запроса возможностей устройств с использованием структуры audio_port_v7
.
Следующий код из audio.h
показывает определение API get_audio_port_v7
:
/**
* Fills the list of supported attributes for a given audio port.
* As input, "port" contains the information (type, role, address etc...)
* needed by the HAL to identify the port.
* As output, "port" contains possible attributes (sampling rates,
* formats, channel masks, gain controllers...) for this port. The
* possible attributes are saved as audio profiles, which contains audio
* format and the supported sampling rates and channel masks.
*/
int (*get_audio_port_v7)(struct audio_hw_device *dev,
struct audio_port_v7 *port);
Данные из устаревшего API get_audio_port
необходимо заполнить новым форматом AudioPort
, если версия устаревшего API ниже 3.2, а версия HIDL HAL — 7 или выше. В этом случае предполагается, что все сообщаемые частоты дискретизации и маски каналов из get_audio_port
поддерживаются для всех возвращаемых форматов, что обеспечивает прямое сопоставление значений get_audio_port
с новой структурой AudioPort
.
Примеры реализаций API
В этом разделе описывается несколько тестовых наборов, содержащих методы, использующие API, рассмотренные в предыдущих разделах. В этих методах приведены примеры реализации и использования этих API.
Примером использования системных API setPreferredDevicesForStrategy
, getPreferredDevicesForStrategy
, removePreferredDeviceForStrategy
и OnPreferredDevicesForStrategyChangedListener
является метод PreferredDeviceRoutingTest
, который находится в GTS.
Чтобы увидеть пример использования новой структуры в AudioDeviceInfo
, см. метод AudioManagerTest#testGetDevices
, который находится в CTS.
Пример реализации get_audio_port_v7
находится в audio_hal.c
и показывает, как запрашиваются возможности для нескольких устройств.
Проверка
В этом разделе содержится информация о проверке CTS и GTS (Google Mobile Services Test Suite) Audio Manager.
тесты CTS
Тесты CTS находятся в android.media.cts.AudioManagerTest
.
Ниже приведен список доступных тестов Audio Manager:
AudioManagerTest#testGetDevices
Проверяет точные возможности аудиоустройства. Также проверяет, что возвращаемые аудиопрофили в структуре
AudioDeviceInfo
сохраняют содержимое старого формата сглаженного массива, но имеют новый форматAudioProfile
.AudioManagerTest#testPreferredDevicesForStrategy
иAudioManagerTest#testPreferredDeviceForCapturePreset
Убедитесь, что предпочтительные устройства для предустановленных стратегий и захвата тестов API успешно завершены.
тесты ГТС
Тесты GTS находятся в com.google.android.gts.audioservice.AudioServiceHostTest
.
Чтобы проверить правильность работы API предпочитаемых устройств для стратегии и предустановки захвата, запустите тесты AudioServiceHostTest#testPreferredDeviceRouting
и AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset
.