Маршрутизация потоков
Маршрутизация потоков — это возможность приложения мультимедиа переключать потоки между устройствами с минимальным прерыванием воспроизведения или сеанса записи.
Компьютер может иметь несколько устройств отрисовки и записи. Система перечисляет эти устройства на панели управления "Звуки ". В этом списке пользователь может задать устройство по умолчанию для каждой роли: воспроизведение, запись или четыре роли связи (отрисовка консоли, захват консоли, отрисовка связи или запись связи). Список устройств может быть динамически изменен, так как некоторые из этих устройств могут быть временно доступны, например USB-гарнитура. Если доступно несколько устройств, пользователь может изменить значение по умолчанию на другое устройство. Пользователь также может изменить формат устройства (частота выборки, биты на выборку и т. д.) на вкладке "Дополнительно " для свойств устройства.
Рассмотрим сценарий, в котором пользователь выбирает динамики в качестве устройства по умолчанию для отрисовки аудиопотоков. Затем пользователь подключает USB-гарнитуру, выбирает гарнитуру в качестве нового устройства по умолчанию и изменяет частоту выборки устройства с 44,1 кГц на 48 кГц. Пользователь хочет воспроизвести аудиопоток на гарнитуре на новой частоте выборки с минимальным прерыванием сеанса потоковой передачи.
В этом сценарии существует два случая, когда приложение мультимедиа должно обрабатывать следующее:
- Поток должен быть передан на новое устройство по умолчанию с минимальным прерыванием воспроизведения.
- Новое устройство должно возобновить воспроизведение в новом формате (то есть пользователь может изменить больше, чем частота выборки).
В Windows Vista для поддержки этого сценария приложению мультимедиа пришлось предоставить реализацию для маршрутизации потоков. Приложение несет ответственность за завершение существующих потоков и перезапуск потоков на новом устройстве. Если пользователь изменил устройство по умолчанию или его формат смешивания, все связанные сеансы были закрыты, и приложению пришлось обработать восстановление.
В Windows 7 приложение может легко передавать поток с существующего устройства по умолчанию в новую конечную точку звука по умолчанию. Высокоуровневые наборы API аудио, такие как Media Foundation, DirectSound и API WAVE, реализуют функцию маршрутизации потоков. Приложения мультимедиа, использующие эти наборы API для воспроизведения или записи потока с устройства по умолчанию, используют реализацию по умолчанию и не должны изменять приложение. Однако если ваше приложение мультимедиа использует MMDeviceAPI или WASAPI напрямую, приложение должно предоставить реализацию маршрутизации потоков.
Примечание.
MMDeviceAPI и WASAPI — это основные компоненты API аудио, которые приложение может использовать для отрисовки или записи потока на устройстве. MMDeviceAPI обнаруживает новое устройство конечной точки звука, и WASAPI управляет потоком звуковых данных между приложением мультимедиа и звуковым устройством конечной точки.
Чтобы реализовать функцию маршрутизации потоков, приложение должно прослушивать уведомления, отправленные MMDeviceAPI и WASAPI, когда:
- Устройство по умолчанию изменяется пользователем.
- Существующее устройство по умолчанию удаляется и добавляется новое устройство по умолчанию.
- Формат устройства изменен.
Обрабатывая эти уведомления, приложение может выполнять необходимые операции управления потоками при передаче потока на новое устройство по умолчанию. Кроме того, приложение может отображать или записывать существующие потоки с помощью нового формата, заданного пользователем во время активного сеанса отрисовки.
В этом разделе рассматриваются следующие вопросы.
- Получение конечной точки устройства для маршрутизации потоков
- Соответствующие уведомления для маршрутизации потоков
- Рекомендации по реализации маршрутизации потоков
В следующих примерах, включенных в пакет SDK для Windows, показано, как приложение может обрабатывать уведомления о маршрутизации потоков.
- RenderSharedTimerDriven
- RenderSharedEventDriven
- RenderExclusiveTimerDriven
- RenderExclusiveEventDriven
- CaptureSharedTimerDriven
- CaptureSharedEventDriven
См. также