Комбинированная маршрутизация аудиоустройств

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

При открытии выходного потока необходимо указать аудиоустройство. Активное медиаустройство — это устройство, используемое при открытии выходных потоков в данном контексте.

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

  1. Если все предпочтительные устройства для мультимедиа доступны, все они выбираются в качестве активных устройств.
  2. В противном случае выбирается последнее подключенное съемное устройство.
  3. Если съемные устройства не подключены, для выбора активных устройств применяются правила политики аудио по умолчанию для выбора выходных устройств.

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

  • Выходной поток должен поддерживать активные устройства.
  • Выходной поток должен поддерживать динамические профили.
  • Выходной поток не должен быть в данный момент направлен на активные устройства.

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

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 .