サンプルの受信と送信
次の疑似コードは、IMemInput::Receive メソッドを実装する方法を示している。
HRESULT CMyInputPin::Receive(IMediaSample *pSample)
{
CAutoLock cObjectLock(&m_csReceive);
// おそらく、フィルタは何かに対して待機する必要がある。
WaitForSingleObject(m_hSomeEventThatReceiveNeedsToWaitOn, INFINITE);
// リソースを使う前に、処理を続けても安全であることを確認する。
// 基底クラスのメソッドが S_OK 以外の値を返した場合、継続しない。
hr = CBaseInputPin::Receive(pSample);
if (hr != S_OK)
{
return hr;
}
/* Active と Pause で割り当てられたリソースを使っても安全である。 */
// 出力ピンを介してサンプルを送信する。
for (各出力ピン)
pOutputPin->Deliver(pSample);
return hr;
}
Receive メソッドはフィルタ ロックではなく、ストリーミング ロックを保持する。ここで WaitForSingleObject の呼び出しにより示しているように、場合によっては、フィルタはデータを処理する前に特定のイベントを待つ必要がある。すべてのフィルタが待機する必要はない。CBaseInputPin::Receive メソッドは一般的なストリーミングの条件を確認している。フィルタが停止している場合は VFW_E_WRONG_STATE を返し、フィルタがフラッシュしている場合は S_FALSE を返す。S_OK 以外の戻り値を受け取った場合、Receive メソッドはサンプルを処理せずにすぐに返ることを示している。
サンプルの処理が終わったら、CBaseOutputPin::Deliver を呼び出してサンプルをダウンストリーム フィルタに送信する。このヘルパー メソッドはダウンストリーム入力ピンの IMemInputPin::Receive を呼び出す。フィルタは複数のピンにサンプルを送信することがある。