Повторное подключение закреплений
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
При соединении штыря фильтр может отключить и повторно подключить один из других контактов.
- Фильтр вызывает IPin::QueryAccept на гнезде другого фильтра и задает новый тип медиа.
- Если QueryAccept возвращает S_OK, фильтр вызывает IFilterGraph2::ReconnectEx для повторного подключения выводов.
Ниже приведены некоторые примеры того, когда фильтру может потребоваться повторно подключить контакты:
- Фильтры для чая. Разветвитель типа T разбивает входной поток на несколько выходов, не изменяя данные потока. Фильтр tee может принимать диапазон типов носителей, но типы должны соответствовать всем закрепленным подключениям. Таким образом, при подключении входного контакта фильтру может потребоваться пересогласовать любые существующие соединения на выходных контактах и наоборот. В качестве примера см. пример фильтра InfTee .
- Встроенные фильтры. Фильтр на месте изменяет входные данные в исходном буфере вместо копирования данных в отдельный выходной буфер. Фильтр на месте должен использовать один и тот же распределитель как для вышестоящих, так и для подчиненных подключений. Первый контакт для подключения (входа или выхода) разрешает распорядитель обычным образом. Однако, когда подключается другой контакт, первый распределитель, возможно, будет неприемлемым. В этом случае второй пин выбирает другой распределитель, а первый пин повторно подключается, используя новый распределитель. Пример реализации см. в классе CTransInPlaceFilter.
В методе ReconnectEx менеджер графа фильтров асинхронно отключает и повторно подключает контакты. Фильтр не должен пытаться повторно подключиться, если QueryAccept возвращает S_OK. В противном случае контакт останется отключённым, что приведет к ошибкам в графе. Кроме того, фильтр должен в одном потоке запросить повторное подключение из метода IPin::Connect. Если метод Connect возвращается в одном потоке, а другой поток делает запрос на повторное подключение, диспетчер графов может запустить граф, прежде чем сделать повторное подключение, вызывая ошибки графа.