CBasePin 連線程式
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 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 方法來嘗試連線。 否則,它會以下列順序嘗試媒體類型:
- 輸入針腳的慣用類型。
- 輸出釘選的慣用類型。
您可以將 CBasePin::m_bTryMyTypesFirst 旗標設定為 TRUE,以反轉此順序。
在每個案例中,針腳都會呼叫 IPin::EnumMediaTypes 來列舉媒體類型。 這個方法會擷取列舉值物件,此物件會傳遞至 CBasePin::TryMediaTypes 方法。 TryMediaTypes方法會迴圈查看每個媒體類型,並針對每個類型呼叫TryConnection。
在 AttemptConnection 方法中,輸出針腳會呼叫下列方法:
- 它會在本身呼叫 CBasePin::CheckConnect ,以檢查輸入針腳是否適合。
- 它會在本身呼叫 CBasePin::CheckMediaType ,以驗證媒體類型。
- 它會在輸入針腳上呼叫 IPin::ReceiveConnection 。 輸入針腳會使用這個方法來判斷它是否應該接受連線。
- 它會在本身呼叫 CBasePin::CompleteConnect 以完成連線。
請注意:
- CheckConnect 是虛擬方法。 在基類中,這個方法會檢查針腳方向是否相容。 輸出針腳必須連接到輸入針腳,反之亦然。 衍生的 Pin 類別通常會覆寫這個方法以執行其他檢查。 例如,它可能會查詢連接所需的介面的其他針腳。 如果衍生類別覆寫 CheckConnect,它也應該呼叫 CBasePin 方法。
- CheckMediaType 是純虛擬方法,衍生類別必須實作這個方法。
- CompleteConnect 是虛擬方法,不會在基類中執行任何動作。 衍生類別可以覆寫這個方法,以執行完成連線所需的任何其他工作,例如決定記憶體配置器。
如果上述任何步驟失敗,輸出釘選會呼叫 CBasePin::BreakConnect 方法來復原 CheckConnect採取的任何步驟。
輸入針腳的 ReceiveConnection 方法會呼叫輸入針腳的 CheckConnect、 CheckMediaType和 CompleteConnect 方法。 如果其中任一失敗,連線嘗試也會失敗。
下圖顯示 CBasePin中的連線程式:
相關主題