Remover todos os filtros no grafo

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

A maneira mais fácil de remover todos os filtros em um grafo de filtro é simplesmente liberar o Gerenciador de Grafo de Filtros e criar um novo. Certifique-se de liberar todos os ponteiros que seu aplicativo tem para quaisquer interfaces nos Gerenciadores de Grafo de Filtro, bem como ponteiros para objetos no grafo, incluindo filtros, pinos, o relógio de referência e assim por diante.

Como alternativa, você pode remover os filtros um de cada vez, usando o método IFilterGraph::RemoveFilter :

// Stop the graph.
pControl->Stop();

// Enumerate the filters in the graph.
IEnumFilters *pEnum = NULL;
HRESULT hr = pGraph->EnumFilters(&pEnum);
if (SUCCEEDED(hr))
{
    IBaseFilter *pFilter = NULL;
    while (S_OK == pEnum->Next(1, &pFilter, NULL))
     {
         // Remove the filter.
         pGraph->RemoveFilter(pFilter);
         // Reset the enumerator.
         pEnum->Reset();
         pFilter->Release();
    }
    pEnum->Release();
}

Este exemplo usa o método IFilterGraph::EnumFilters para enumerar os filtros no grafo. Remover um filtro faz com que o objeto enumerador fique fora de sincronia com o grafo. Use o método IEnumFilters::Reset para redefinir o enumerador. Caso contrário, qualquer chamada subsequente para IEnumFilters::Next falhará.