停止
Stop メソッドは Receive メソッドの動作を停止し、フィルタのアロケータをデコミットする必要がある。アロケータをデコミットすると、ペンディング状態の GetBuffer 呼び出しはすべて返り、サンプルを待っているアップストリーム フィルタの動作の停止が解除される。Stop メソッドはフィルタ ロックを保持した後、CBaseFilter::Stop メソッドを呼び出す。その結果、フィルタのすべてのピンの CBasePin::Inactive が呼び出される。
HRESULT CMyFilter::Stop()
{
CAutoLock lock_it(m_pLock);
// フィルタ リソースを保護するため、すべてのピンを非アクティブにする。
hr = CBaseFilter::Stop();
/* ストリーミング スレッドで使われるフィルタ リソースを破棄しても安全である。 */
return hr;
}
入力ピンの Inactive メソッドを次のようにオーバーライドする。
HRESULT CMyInputPin::Inactive()
{
// ここではフィルタ ロックを保持する必要はない。
// 既に Stop で保持されている。
// Receive の動作停止を解除する。
SetEvent(m_hSomeEventThatReceiveNeedsToWaitOn);
// Receive を確実に失敗させる。
// また、アロケータもデコミットする。
HRESULT hr = CBaseInputPin::Inactive();
// Receive が完了し、リソースを使っていないことを確認する。
{
CAutoLock c(&m_csReceive);
/* ストリーミング スレッドで使われるフィルタ リソースを破棄しても安全である。 */
}
return hr;
}