共用方式為


CBasePin 連線程式

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

本節說明 CBasePin類別如何實作釘選連線程式

Filter Graph Manager 會起始所有針腳連線。 它會呼叫輸出釘選 IPin::Connect 方法,並指定輸入針腳。 輸出接點會呼叫輸入針腳的 IPin::ReceiveConnection 方法來完成連線。 輸入針腳可以接受或拒絕連線。

Filter Graph Manager 也可以指定連線的媒體類型。 如果是,針腳會嘗試使用該類型進行連線。 如果沒有,針腳必須交涉類型。 Filter Graph 管理員也可以指定 部分 媒體類型,其中具有主要類型、子類型或格式類型的值GUID_NULL。 在此情況下,針腳會嘗試比對已指定媒體類型的哪個部分;值GUID_NULL做為通配符。

CBasePin::Connect 方法會從確認釘選是否可接受連線開始。 例如,它會檢查針腳是否已連線。 它會將連線程式的其餘部分委派給 CBasePin::AgreeMediaType 方法。 後續所有專案都是由 AgreeMediaType來執行。

如果媒體類型已完整指定,釘選會呼叫 CBasePin::AttemptConnection 方法來嘗試連線。 否則,它會依下列順序嘗試媒體類型:

  1. 輸入針腳的慣用類型。
  2. 輸出釘選的慣用類型。

您可以將 CBasePin::m_bTryMyTypesFirst 旗標設定為 TRUE來反轉此順序。

在每個案例中,釘選都會呼叫 IPin::EnumMediaTypes 來列舉媒體類型。 這個方法會擷取列舉值對象,這個物件會傳遞至 CBasePin::TryMediaTypes方法TryMediaTypes 方法會迴圈每個媒體類型,並針對每個類型呼叫 TryConnection

AttemptConnection 方法內,輸出釘選會呼叫下列方法:

請注意下列事項:

  • CheckConnect 是虛擬方法。 在基類中,此方法會檢查針腳方向是否相容。 輸出針腳必須連線到輸入針腳,反之亦然。 衍生的 pin 類別通常會覆寫此方法以執行其他檢查。 例如,它可能會查詢連接所需的介面的其他針腳。 如果衍生類別覆寫 CheckConnect,它也應該呼叫 CBasePin 方法。
  • CheckMediaType 是衍生類別必須實作的純虛擬方法。
  • CompleteConnect 是虛擬方法,在基類中不會執行任何動作。 衍生類別可以覆寫這個方法,以執行完成連線所需的任何額外工作,例如決定記憶體配置器。

如果這些步驟有任何失敗,輸出釘選會呼叫 CBasePin::BreakConnect 方法來復原 checkConnect checkConnect所採取的任何步驟。

輸入針腳的 ReceiveConnection 方法會呼叫輸入針腳的 checkConnect CheckMediaTypeCompleteConnect 方法。 如果其中任何一項失敗,連線嘗試也會失敗。

下圖顯示 CBasePin中的連線程式:

cbasepin 連線程式

CBasePin