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


Процесс подключения 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 для попытки подключения. В противном случае он пытается использовать типы носителей в следующем порядке:

  1. Предпочтительные типы входных контактов.
  2. Предпочтительные типы выходных контактов.

Этот порядок можно изменить, установив для флага 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:

Процесс подключения cbasepin

CBasePin