次の方法で共有


サンプルの受信と送信

次の疑似コードは、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 を呼び出す。フィルタは複数のピンにサンプルを送信することがある。