Поделиться через


Рекомендации по реализации маршрутизации потоков

В Windows 7 высокоуровневые API платформы, использующие основные API аудио, такие как Media Foundation, DirectSound и API волны, реализуют функцию маршрутизации потоков, обрабатывая переключение потоков с существующего устройства на новую конечную точку звука по умолчанию. Приложения мультимедиа, использующие эти API, используют поведение маршрутизации потоков без каких-либо изменений в источнике. Прямые клиенты WASAPI могут использовать уведомления, отправленные компонентами Core Audio, и реализовать функцию маршрутизации потоков.

Прямые клиенты WASAPI (приложения мультимедиа, использующие WASAPI напрямую), получают новые уведомления об устройстве и сеансе аудио, отправляемые компонентами Core Audio. Поведение функции маршрутизации потоков определяется тем, как приложение обрабатывает эти уведомления.

API MMDevice и звуковой сеанс отправляют уведомления об изменениях состояния устройства и изменениях сеанса для клиентов WASAPI в виде обратных вызовов. Чтобы получить эти уведомления, клиент должен зарегистрировать свою реализацию IMMNotificationClient и IAudioSessionEvents. Дополнительные сведения см. в разделе "Соответствующие уведомления" для маршрутизации потоков.

В сценарии usb-гарнитуры, описанной в статье "Маршрутизация потоков", приложение воспроизводит аудиопоток и использует MMDeviceAPI и WASAPI для отрисовки потока на устройстве отрисовки по умолчанию, говорящем. При изменении устройства по умолчанию приложение получает уведомление IMMNotificationClient. Приложение также получает уведомления IAudioSessionEvents , указывающие, что пользователь удалил устройство конечной точки аудио или что формат потока изменился для устройства, к которому подключен звуковой сеанс. После получения уведомлений приложение останавливает потоковую передачу в конечную точку говорящего и повторно открывает поток для отрисовки в текущей конечной точке по умолчанию, гарнитура.

diagram of data flow for device notifications.

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

Stream Managment

В следующем списке приведены инструкции, которые должен выполнять клиент WASAPI, чтобы обеспечить функциональность переключения потоков.

  1. Дождитесь соответствующего уведомления IMMNotificationClient . Если устройство является устройством по умолчанию, получено уведомление IMMNotificationClient::OnDefaultDeviceChanged.

  2. Если новое устройство доступно, получите ссылку на конечную точку нового устройства. Вызовите IMMDeviceEnumerator::GetDefaultAudioEndpoint для нового устройства по умолчанию. Если новое устройство не является устройством по умолчанию, можно получить его, вызвав IMMDeviceEnumerator::GetDevice. Дополнительные сведения см. в статье "Получение конечной точки устройства для маршрутизации потоков".

  3. Дождитесь ввода-адреса IAudioSessionEvents::OnSessionDisconnected со значением причины.

    Примечание.

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

     

  4. Оцените значение причины и определите, нужно ли передавать поток в другую конечную точку звука или поток должен быть повторно инициализирован с новым форматом.

  5. Остановите потоковую передачу на старое устройство по умолчанию, если причина указывает, что поток следует перенаправить на новое устройство по умолчанию.

  6. Выполнение вычислений сопоставления позиций.

  7. Откройте поток на новом устройстве и передайте все сведения о состоянии.

  8. Возобновление потоковой передачи на новом устройстве по умолчанию.

  9. Обработка отъезда старого устройства по умолчанию.

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

Рекомендации по сопоставлению позиций

Когда приложение получает уведомления IMMNotificationClient и IAudioSessionEvents , оно может направлять существующие потоки на новое устройство по умолчанию. Когда существующий аудиопоток прерван и открыт на новом устройстве, отрисовка на новом устройстве должна начинаться с позиции, с которой поток был остановлен на старом устройстве. Для этого приложение должно иметь последнее известное положение устройства, чтобы вычислить начальную позицию на новом устройстве. Например, эту позицию можно использовать в качестве разностного смещения для последующего сопоставления позиций. При запуске потоковой отрисовки новое положение устройства можно перенаставить на кэшированное положение устройства.

Ниже приведены инструкции по созданию простого перехода потока.

  1. Кэшируйте последнюю позицию устройства потока на старом устройстве.
  2. Остановите поток на старом устройстве.
  3. Выполните переназначающие вычисления, чтобы получить новую позицию.
  4. Начните отрисовку потока на новом устройстве.
  5. Отпустите старый поток.

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

Если во время отрисовки IAudioRenderClient ::GetBuffer возвращает ошибку, так как старое устройство потеряно, приложение не нужно останавливать старый поток, так как операция потоковой передачи уже завершена. Сведения об обработке этой ошибки см. в разделе "Восстановление из ошибки недопустимого устройства".

Сведения об API MMDevice

Сведения о WASAPI

Маршрутизация потоков