共用方式為


CBasePin 連線程式

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

本節說明 CBasePin 類別如何實作針腳連線程式。

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

Filter Graph 管理員也可以指定連接的媒體類型。 如果是,釘選會嘗試與該類型連線。 如果沒有,釘選必須交涉類型。 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採取的任何步驟。

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

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

cbasepin 連線程式

CBasePin