停止中
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
Stop メソッドは、Receive メソッドのブロックを解除し、フィルターのアロケーターのコミットを解除する必要があります。 アロケーターをデコミットすると、保留中の GetBuffer 呼び出しが強制的に返されます。これにより、サンプルを待機しているアップストリーム フィルターのブロックが解除されます。 Stop メソッドは、フィルター ロックを保持し、フィルターのすべてのピンで CBasePin::Inactive を呼び出す CBaseFilter::Stop メソッドを呼び出します。
HRESULT CMyFilter::Stop()
{
CAutoLock lock_it(m_pLock);
// Inactivate all the pins, to protect the filter resources.
hr = CBaseFilter::Stop();
/* Safe to destroy filter resources used by the streaming thread. */
return hr;
}
入力ピンの Inactive メソッドを次のようにオーバーライドします。
HRESULT CMyInputPin::Inactive()
{
// You do not need to hold the filter lock here.
// It is already locked in Stop.
// Unblock Receive.
SetEvent(m_hSomeEventThatReceiveNeedsToWaitOn);
// Make sure Receive will fail.
// This also decommits the allocator.
HRESULT hr = CBaseInputPin::Inactive();
// Make sure Receive has completed, and is not using resources.
{
CAutoLock c(&m_csReceive);
/* It is now safe to destroy filter resources used by the
streaming thread. */
}
return hr;
}