Files
Work/dvcap/Nuker.cpp
2024-08-07 09:16:27 -04:00

50 lines
1.6 KiB
C++

#include <dvcap/nuker.hpp>
Nuker::Nuker(ComPointer<IGraphBuilder> &graphBuilder)
: mGraphBuilder(graphBuilder)
{
mGraphBuilder->AddRef(); // make sure this does what you want (ie) we don't want the
} // graphBuilder to be destroyed when the constructor fires
Nuker::~Nuker()
{
}
bool Nuker::nukeFilter(ComPointer<IBaseFilter> &baseFilter,bool nukeDownstream,bool isDeviceFilter)
{
ComPointer<IEnumPins> enumPins;
ComPointer<IPin> pin;
ULONG fetched=0;
PIN_INFO pinInfo;
if(!baseFilter.isOkay())return false;
if(!ComResult(baseFilter->EnumPins((IEnumPins**)enumPins)).success())
message("[Nuker::nukeFilter]baseFilter->EnumPins((IEnumPins**)enumPins) failed.");
enumPins->Reset();
while(ComResult(enumPins->Next(1,(IPin**)pin,&fetched)).success())
{
ComPointer<IPin> toPin;
if(!pin.isOkay())break;
if(ComResult(pin->ConnectedTo((IPin**)toPin)).success()&&toPin.isOkay())
{
if(!ComResult(toPin->QueryPinInfo(&pinInfo)).success())
message("[Nuker::nukeFilter]toPin->QueryPinInfo(&pinInfo) Failed.");
if(PINDIR_INPUT==pinInfo.dir && nukeDownstream)
{
ComPointer<IBaseFilter> pinFilter(pinInfo.pFilter);
nukeFilter(pinFilter,nukeDownstream,isDeviceFilter); // have to do something with first argument
mGraphBuilder->Disconnect(toPin);
mGraphBuilder->Disconnect(pin);
if(!isDeviceFilter)
{
if(!ComResult(mGraphBuilder->RemoveFilter(pinInfo.pFilter)).success())
{
message("[Nuker::nukeFilter] mGraphBuilder->RemoveFilter(pinInfo.pFilter).");
}
}
}
}
}
return true;
}