プラグ可能なターミナルの実装
プラグ可能なターミナル実装の一般的な要件は次のとおりです。
- プラグ可能なターミナルの基になるストリーミング コードは、目的の MSP の機能と一致している必要があります。
- ほとんどの MSP を操作するには、ターミナルで DirectShow フィルターを使用する必要があります (これはここから想定されています)。
- オーディオ端末は、ほとんどの MSP で 8 kHz 16 ビットのモノ リニア PCM をサポートする必要があります。
- ターミナルでは 、IMarshal を実装することで、フリー スレッド マーシャリングを有効にする必要があります。 これを行うには、COM API CoCreateFreeThreadedMarshaler を呼び出し、返されたポインターに IMarshal を集計します。 ターミナル オブジェクトのデストラクターは IMarshal-Release> を呼び出す必要があります。
- ターミナルは、適切な追加のターミナル固有のインターフェイスを実装または集計する必要があります。
- ターミナルの実装はスレッド セーフである必要があります。
- ターミナルの実装では、 ITTerminalControl の定義に Termmgr.h を#includeする必要があります。 これは、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を返す必要があります。 制限が 1 の場合、カウントには単にブール値またはTERMINAL_STATE値を指定できます。
ターミナルは、SysAllocString を介して割り当てられた、選択した BSTR 名を返す必要があります。 この名前はユーザーにとって意味があり、ローカライズする必要があります。
ターミナルは、メディアの種類 (TAPIMEDIATYPE_AUDIOまたはTAPIMEDIATYPE_VIDEO) を返す必要があります。
ターミナルは、ターミナルの方向を示すTERMINAL_DIRECTION列挙値を返します。 ターミナルが双方向 (ブリッジなど) の場合は、TD_BIDIRECTIONALを返す必要があります。
ターミナルは ITTerminalControl を実装する必要があります (vtable のみ)。
ITTerminalControl::get_AddressHandle
アプリケーションによって提供されるターミナルは、常にアドレス ハンドルとして NULL を 返す必要があります。 これは、このターミナルが特定の MSP アドレス オブジェクトに作成されなかったことを MSP に示します。
ITTerminalControl::ConnectTerminal
この呼び出しでは、ターミナルはそのフィルターを特定のグラフに追加し、必要に応じて相互に接続します。 その後、ターミナルは、指定されたストリーム方向に対してターミナルによって公開されるピンを返す必要があります。
複数のストリームへの同時接続をサポートしていないターミナルでは、このメソッドが正常に完了すると、内部変数が TS_INUSE に設定されます。
ターミナルは、この呼び出しの dwTerminalDirection パラメーターを使用して、接続されているストリームの方向を決定できます。 これは双方向端子に必要です。
Note
通常 (MSP 基本クラスおよびすべての既知の MSP) では、ターミナルが 1 つの ConnectTerminal 呼び出しから複数のピンを返した場合、MSP ストリーム コードは接続に失敗します。 接続中に複数のピンを返すターミナルでは、追加のピンを効果的に使用するために、MSP がターミナルに関する特別な知識を持っている必要があるため、これは問題ありません。
ITTerminalControl::CompleteConnectTerminal
ターミナルはS_OKを返すだけです。 必要に応じて、ターミナルで接続後の初期化を行うこともできます。
ITTerminalControl::D isconnectTerminal
ターミナルは、グラフの残りの部分からターミナルを切断するために必要な操作を行う必要があります。 通常、これには、グラフからすべてのターミナルフィルターを削除し、ターミナルの状態をTS_NOTINUSEに設定する必要があります。
ITTerminalControl::RunRenderFilter
ターミナルはE_NOTIMPLを返すだけです。
ITTerminalControl::StopRenderFilter
ターミナルはE_NOTIMPLを返すだけです。