CBasePin 連線程式
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 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 方法來嘗試連線。 否則,它會依下列順序嘗試媒體類型:
- 輸入針腳的慣用類型。
- 輸出釘選的慣用類型。
您可以將 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 checkConnect所採取的任何步驟。
輸入針腳的 ReceiveConnection 方法會呼叫輸入針腳的 checkConnect 、CheckMediaType和 CompleteConnect 方法。 如果其中任何一項失敗,連線嘗試也會失敗。
相關主題