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

Функция маршрутизации комбинированных аудиоустройств добавляет поддержку потоковой передачи аудио на несколько аудиоустройств одновременно. Используя эту функцию, привилегированные приложения могут выбирать несколько предпочтительных устройств для определенной стратегии с помощью системных API. Приложения могут более точно обнаруживать возможности аудиоустройств, используя общедоступные API, предоставляемые этой функцией. Для версий Android 11 и ниже реализация аудиофреймворка имеет ограниченную поддержку нескольких аудиоустройств одного типа (например, 2 гарнитуры Bluetooth A2DP), подключенных одновременно. Правила маршрутизации аудио по умолчанию также не позволяют пользователям выбирать несколько устройств одного типа для данного варианта использования.

Начиная с Android 12, эти ограничения снимаются, чтобы разрешить новые варианты использования, такие как аудиовещание, многоадресная передача на группу наушников BLE или выбор нескольких звуковых карт USB одновременно. Маршрутизация на несколько устройств USB одновременно не поддерживается.

Начиная с Android 14, фреймворк USB поддерживает маршрутизацию на несколько USB-устройств при условии, что USB-устройства являются аудиоустройствами разных типов, а также имеется поддержка ядра и поставщика для одновременного подключения нескольких USB-устройств.

На этой странице рассказывается, как реализовать поддержку потоковой передачи звука на несколько аудиоустройств и как проверить реализацию этой функции.

Поддержка потоковой передачи звука на несколько аудиоустройств

В Android 12 есть два набора API, поддерживающих эту функцию:

  • API-интерфейсы системы обрабатывают несколько предпочтительных устройств для одной стратегии.
  • Интерфейс HIDL, реализованный поставщиком как часть аудио HAL, сообщает о возможностях устройства.

В следующих разделах каждый из этих API обсуждается более подробно.

Управление несколькими предпочтительными устройствами для стратегии

Audio Policy Manager предлагает системные API для лучшей поддержки потоковой передачи аудио на несколько аудиоустройств одновременно. Эти системные API позволяют устанавливать, получать и удалять несколько предпочтительных устройств для заданной стратегии. До Android 12 эта функция поддерживалась только для одного устройства.

Audio Policy Manager вводит концепцию активных медиаустройств для описания устройств, которые с наибольшей вероятностью будут выбраны для воспроизведения мультимедиа. При подключении съемного устройства выходные аудиопотоки 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, которые поддерживают возможности отчетов устройств. В этом разделе объясняются типы данных и методы, используемые для отчетов о возможностях устройств, а также перечисляются некоторые изменения, внесенные в аудио 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

Для поддержки нескольких аудиопрофилей версия 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 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 .