插入式終端實作的一般需求如下:
- 插入式終端機的基礎串流程式代碼應該符合所需 MSP 的功能。
- 終端機必須使用 DirectShow 篩選器來處理大部分 MSP(這是從此處假設的)。
- 音訊終端機必須支援大多數 MSP 的 8 kHz 16 位單軌 PCM。
- 終端機應藉由實作 IMarshal,來啟用自由執行緒封送處理。 終端機可以透過呼叫 COM API CoCreateFreeThreadedMarshaler,並將 IMarshal 聚合至返回的指標 來達成此目的。 終端機物件的解構函式應該呼叫 IMarshal->Release。
- 終端機應該實作或匯總任何適合的其他終端機特定介面。
- 終端機的實作必須是執行緒安全的。
- 終端機實作必須 #include Termmgr.h,才能定義 ITTerminalControl。 另有一般所需的包含檔和函式庫,用於 Windows 2000 SP1 下的 TAPI 3 或 TAPI 3 應用程式。
介面和方法實作注意事項:
終端機必須實作 ITTerminal (雙重介面 - vtable + IDispatch)。
終端機必須傳回您挑選的 GUID BSTR 表示法,以識別您的終端機類型。 透過 SysAllocString配置 BSTR。 若要從 GUID 轉換成 BSTR,請呼叫 StringFromCLSID、SysAllocString,以及 CoTaskMemFree。
如果應用程式實作終端機,終端機通常會傳回TT_DYNAMIC。 傳回TT_STATIC也會正常運作,如果終端機對應至硬體裝置,則傳回此值可能適用;不過,這樣做可能會讓使用者感到困惑,因為 MSP 的靜態終端列舉中不會有靜態終端機。
如果終端機實作不會任意限制終端機可以同時連線的數據流數目,則終端機應該一律會傳回TS_NOTINUSE。
否則,終端實作會任意限制一次可連接終端機的數據流數目。 在此情況下,終端機應保留其所連接的數據流數目計數。 終端機應該會在成功的 ITTerminalControl::ConnectTerminal 呼叫時遞增此內部計數,並於成功的 ITTerminalControl::DisconnectTerminal 呼叫時遞減。 在 ITTerminal::get_State中,如果此計數等於一次可選取終端機的最大數據流數目,則應該傳回TS_INUSE;否則,它應該會傳回TS_NOTINUSE。 請注意,如果限制為一,則該計數可能只是布爾值或 TERMINAL_STATE 值。
終端機應該會傳回自選的 BSTR 名稱,並透過 SysAllocString分配。 此名稱應該對使用者有意義,而且應該當地語系化。
終端機應該會傳回其媒體類型,TAPIMEDIATYPE_AUDIO或TAPIMEDIATYPE_VIDEO。
終端會傳回TERMINAL_DIRECTION列舉值,指出終端機的方向。 如果終端機是雙向的(例如網橋),則必須傳回TD_BIDIRECTIONAL。
終端機必須實作 ITTerminalControl(僅限 vtable)。
ITTerminalControl::get_AddressHandle
應用程式提供的終端機應該一律傳回 NULL 做為位址句柄。 這表示 MSP 未在特定 MSP 位址物件上建立此終端機。
ITTerminalControl::ConnectTerminal
在此呼叫中,終端機將會把其篩選器新增至指定的圖形,如果適用,將它們相互連接。 然後,終端機應該會傳回針對指定數據流方向所公開的終端機接腳。
不支援並行連線至多個數據流的終端機,會在此方法成功完成時,將內部變數設定為TS_INUSE。
終端機可以使用 dwTerminalDirection 參數從這個呼叫中來判斷其所連接的資料流的方向。 這是雙向終端機的必要要求。
注意
一般而言(在 MSP 基類和所有已知的 MSP 中),如果終端機從單一 ConnectTerminal 呼叫返回多個針腳,MSP 資料流代碼將導致連線失敗。 沒問題,因為一個在連接期間會傳回多於一個針腳的終端機,需要 MSP 具備有關終端機的特定知識,才能有效利用額外的針腳。
ITTerminalControl::CompleteConnectTerminal
終端機應該只會傳回S_OK。 如果需要,終端機也可以進行連線后初始化。
ITTerminalControl::DisconnectTerminal
終端機應該執行任何必要動作,以中斷終端機與圖形其餘部分的連線。 這通常牽涉到從圖形中移除所有終端機的篩選條件,並將終端機狀態設定為TS_NOTINUSE。
ITTerminalControl::RunRenderFilter
終端機應該只會傳回E_NOTIMPL。
ITTerminalControl::StopRenderFilter
終端機應該只會傳回E_NOTIMPL。