Функция комбинированной маршрутизации аудиоустройств добавляет поддержку одновременной потоковой передачи аудио на несколько аудиоустройств. Используя эту функцию, привилегированные приложения могут выбирать несколько предпочтительных устройств для определенной стратегии с помощью системных API. Приложения могут более точно обнаруживать возможности аудиоустройств, используя общедоступные API, предоставляемые этой функцией. Для Android версии 11 и ниже реализация платформы аудио имеет ограниченную поддержку нескольких аудиоустройств одного типа (например, двух гарнитур Bluetooth A2DP), подключенных одновременно. Правила маршрутизации звука по умолчанию также не позволяют пользователям выбирать несколько устройств одного типа для данного варианта использования.
Начиная с Android 12 эти ограничения сняты, чтобы разрешить новые варианты использования, такие как аудиотрансляция, многоадресная рассылка на группу аудионаушников BLE или одновременное использование нескольких звуковых карт USB.
На этой странице рассказывается, как реализовать поддержку потоковой передачи звука на несколько аудиоустройств и как проверить реализацию этой функции.
Поддержка потокового аудио на несколько аудиоустройств
В Android 12 есть два набора API, которые поддерживают эту функцию:
- Системные API обрабатывают несколько предпочтительных устройств для стратегии.
- Интерфейс HIDL, реализованный производителем как часть звукового HAL, сообщает о возможностях устройства.
В следующих разделах более подробно рассматривается каждый из этих API.
Обработка нескольких предпочтительных устройств для стратегии
Audio Policy Manager предлагает системные API для лучшей поддержки одновременной потоковой передачи звука на несколько аудиоустройств. Эти системные API позволяют устанавливать, получать и удалять несколько предпочтительных устройств для данной стратегии. До Android 12 эта функция поддерживалась только для одного устройства.
Диспетчер политик аудио представляет концепцию активных мультимедийных устройств для описания устройств, которые, скорее всего, будут выбраны для воспроизведения мультимедиа. Когда отсоединяемое устройство подключено, выходные аудиопотоки HAL, которые могут быть перенаправлены на это устройство, возможно, придется открыть и проверить на наличие поддерживаемых атрибутов.
Аудиоустройство должно быть указано при открытии выходного потока. Активное мультимедийное устройство — это устройство, используемое при открытии выходных потоков в этом контексте.
Выбор активного мультимедийного устройства может меняться в зависимости от фактически подключенных или отключенных устройств. Диспетчер политик аудио использует следующую серию правил для выбора активных мультимедийных устройств:
- Если доступны все предпочитаемые устройства для мультимедиа, все они выбираются в качестве активных устройств.
- В противном случае выбирается последнее подключенное съемное устройство.
- Если съемные устройства не подключены, для выбора активных устройств применяются правила политики аудио по умолчанию для выбора устройств вывода.
Выходной поток должен удовлетворять следующим критериям для повторного открытия и маршрутизации на активные устройства, чтобы для воспроизведения была выбрана наилучшая конфигурация:
- Выходной поток должен поддерживать активные устройства.
- Выходной поток должен поддерживать динамические профили.
- Выходной поток не должен в настоящее время направляться на активные устройства.
Чтобы применить новый выбор устройства, Audio Policy Manager закрывает и снова открывает выходной поток при подключении устройства, если выходной поток простаивает, или откладывает его до момента перевода выходного потока в режим ожидания.
Audio Policy Manager предлагает следующий список системных API (как определено в AudioManager.java
):
setPreferredDeviceForStrategy
Устанавливает предпочтительное устройство для маршрутизации звука для данной стратегии. Обратите внимание, что устройство может быть недоступно в момент установки предпочтительного устройства, но оно используется после того, как станет доступным.
removePreferredDeviceForStrategy
Удаляет предпочтительные аудиоустройства, ранее установленные с помощью
setPreferredDeviceForStrategy
илиsetPreferredDevicesForStrategy
.getPreferredDeviceForStrategy
Возвращает предпочтительное устройство для звуковой стратегии, ранее установленной с помощью
setPreferredDeviceForStrategy
илиsetPreferredDevicesForStrategy
.setPreferredDevicesForStrategy
Устанавливает предпочтительные устройства для данной стратегии.
getPreferredDevicesForStrategy
Возвращает предпочтительные устройства для стратегии аудио, ранее установленной с помощью
setPreferredDeviceForStrategy
илиsetPreferredDevicesForStrategy
.OnPreferredDevicesForStrategyChangedListener
Определяет интерфейс для уведомления об изменениях в предпочтительных аудиоустройствах, установленных для данной аудиостратегии.
addOnPreferredDevicesForStrategyChangedListener
Добавляет прослушиватель для получения уведомлений об изменениях аудиоустройства, предпочтительного для стратегии.
removeOnPreferredDevicesForStrategyChangedListener
Удаляет ранее добавленный прослушиватель изменений в предпочтительном для стратегии аудиоустройстве.
Возможности отчетного устройства
В рамках реализации Audio HAL поставщики реализуют API-интерфейсы, поддерживающие возможности устройства создания отчетов. В этом разделе объясняются типы данных и методы, используемые для сообщения о возможностях устройства, и перечислены некоторые изменения, внесенные в аудио 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
Audio Policy Manager использует следующие методы для запроса возможностей устройства:
-
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
Для поддержки нескольких аудиопрофилей версия 3.2 устаревшего API добавляет новую структуру с именем 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) для 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
.