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

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

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

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

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

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

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

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

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

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

Policy Manager Audio представляет концепцию активных мультимедийных устройств для описания устройств, которые , скорее всего , будет определены для воспроизведения медиа. Когда подключено съемное устройство, выходные потоки аудио HAL, которые могут быть маршрутизированы на это устройство, могут быть открыты и исследованы на предмет поддерживаемых атрибутов.

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

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

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

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

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

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

Policy Manager Audio предлагает следующий список системных интерфейсов (как определено в 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 показывает определение get_audio_port_v7 API:

/**
 * 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);

Данные из унаследованной get_audio_port API должен быть заполнен в новый AudioPort формат , когда версия наследство API ниже 3,2 и версия HIDL HAL является 7 или выше. В этом случае, все эти данные о частоте дискретизации и маске канала из get_audio_port предполагается поддерживаются для всех возвращенных форматов, позволяя простое отображение из get_audio_port значений к новой AudioPort структуре.

Примеры реализации API

В этом разделе описывается несколько наборов тестов, содержащих методы, использующие API, описанные в предыдущих разделах. Обратитесь к этим методам за некоторыми примерами реализации и использования этих API.

Пример использования из setPreferredDevicesForStrategy , getPreferredDevicesForStrategy , removePreferredDeviceForStrategy и OnPreferredDevicesForStrategyChangedListener системного API , находится в PreferredDeviceRoutingTest методе, который расположен в ГТС.

Чтобы увидеть пример новой структуры в 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 тестов.