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

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

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

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

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

Менеджер политик аудио предоставляет следующий список системных 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 для описания возможностей устройства.

Методы Audio 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).

Тесты CTS

Тесты CTS находятся в android.media.cts.AudioManagerTest .

Ниже приведён список доступных тестов в Audio Manager:

  • AudioManagerTest#testGetDevices

    Проверяет точные возможности аудиоустройства. Также проверяется, что возвращаемые аудиопрофили в структуре AudioDeviceInfo сохраняют содержимое из старого, упрощенного формата массива, но находятся в новом формате AudioProfile .

  • AudioManagerTest#testPreferredDevicesForStrategy и AudioManagerTest#testPreferredDeviceForCapturePreset

    Убедитесь, что предпочтительные устройства для тестирования API, связанные с предустановленной стратегией и захватом данных, успешно проходят.

Тесты GTS

Тесты GTS находятся в com.google.android.gts.audioservice.AudioServiceHostTest .

Чтобы проверить корректность работы API для предпочтительных устройств для стратегии и предустановок захвата, запустите тесты AudioServiceHostTest#testPreferredDeviceRouting и AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset .