實作插入式終端機
插入式終端機實作的一般需求如下:
- 可插入式終端機的基礎串流程式碼應該符合所需 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::D isconnectTerminal 呼叫上遞減它。 在 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::D isconnectTerminal
終端機應該執行任何動作,以中斷終端機與圖形其餘部分的連線。 這通常牽涉到從圖形中移除所有終端機的篩選準則,並將終端機狀態設定為TS_NOTINUSE。
ITTerminalControl::RunRenderFilter
終端機應該只會傳回E_NOTIMPL。
ITTerminalControl::StopRenderFilter
終端機應該只會傳回E_NOTIMPL。