Процесс подключения CBasePin
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
В этом разделе описывается, как класс CBasePin реализует процесс подключения к закреплению.
Диспетчер графов фильтра инициирует все подключения к закреплению. Он вызывает метод пин-кода вывода IPin::Connect, указав входной пин-код. Выходной пин-код завершает подключение путем вызова метода ввода IPin::ReceiveConnection. Входной пин-код может принять или отклонить подключение.
Диспетчер графов фильтров также может указать тип носителя для подключения. В этом случае контакты пытаются подключиться к такому типу. В противном случае пин-коды должны согласовывать тип. Диспетчер графов фильтров также может указать частичный тип носителя, который имеет значение GUID_NULL для основного типа, подтипа или типа формата. В этом случае пин-коды пытаются соответствовать любым частям типа носителя; значение GUID_NULL выступает в качестве подстановочного знака.
Метод CBasePin::Connect начинается с проверки того, что пин-код может принять подключение. Например, он проверяет, что пин-код еще не подключен. Он делегирует остальную часть процесса подключения методу CBasePin::AgreeMediaType. Все, что следует, выполняется AgreeMediaType.
Если тип носителя полностью указан, пин-код вызывает метод CBasePin::AttemptConnection для попытки подключения. В противном случае он пытается использовать типы носителей в следующем порядке:
- Предпочтительные типы входных контактов.
- Предпочтительный тип выходного пин-кода.
Чтобы изменить этот порядок, задав флаг CBasePin::m_bTryMyTypesFirst значение TRUE.
В каждом случае пин-код вызывает IPin::EnumMediaTypes для перечисления типов носителей. Этот метод извлекает объект перечислителя, который передается методу CBasePin::TryMediaTypes. Метод tryMediaTypes выполняет циклы по каждому типу носителя и вызывает TryConnection для каждого типа.
В методе AttemptConnection выходной пин-код вызывает следующие методы:
- Он вызывает CBasePin::CheckConnect на самом себе, чтобы проверить, подходит ли входной пин-код.
- Он вызывает CBasePin::CheckMediaType на себя, чтобы проверить тип носителя.
- Он вызывает IPin::ReceiveConnection на входной закреплении. Входной пин-код использует этот метод, чтобы определить, следует ли принимать подключение.
- Он вызывает CBasePin::CompleteConnect для завершения подключения.
Обратите внимание на следующее:
- CheckConnect — это виртуальный метод. В базовом классе этот метод проверяет совместимость направлений закреплений. Выходные контакты должны подключаться к входным контактам и наоборот. Производный класс пин-кода обычно переопределяет этот метод для выполнения других проверок. Например, он может запрашивать другой пин-код для интерфейса, который требуется для подключения. Если производный класс переопределяет CheckConnect, он также должен вызывать метод CBasePin.
- CheckMediaType — это чистый виртуальный метод, который должен реализовывать производный класс.
- CompleteConnect — это виртуальный метод, который ничего не делает в базовом классе. Производные классы могут переопределить этот метод, чтобы выполнить любую дополнительную работу, необходимую для завершения подключения, например выбор распределителя памяти.
Если какой-либо из этих шагов завершается ошибкой, выходной пин-код вызывает метод CBasePin::BreakConnect для отмены действий, выполняемых CheckConnect.
Метод receiveConnection ввода вызывает метод checkConnect, CheckMediaTypeи методы CompleteConnect. В случае сбоя любой из этих попыток подключения также завершается ошибкой.
На следующей схеме показан процесс подключения в CBasePin:
Связанные разделы