50 lines
1.6 KiB
C++
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;
|
|
}
|