protected void RemoveDownstream(CoreStreaming.IBaseFilter filter, bool removeFirstFilter)
{
// Get a pin enumerator off the filter
CoreStreaming.IEnumPins pinEnum;
int hr = filter.EnumPins(out pinEnum);
pinEnum.Reset();
if ((hr == 0) && (pinEnum != null))
{
// Loop through each pin
var pins = new CoreStreaming.IPin[1];
int f;
do
{
// Get the next pin
hr = pinEnum.Next(1, pins, out f);
if ((hr == 0) && (pins[0] != null))
{
// Get the pin it is connected to
CoreStreaming.IPin pinTo = null;
pins[0].ConnectedTo(out pinTo);
if (pinTo != null)
{
// Is this an input pin?
var info = new CoreStreaming.PinInfo();
hr = pinTo.QueryPinInfo(out info);
if ((hr == 0) && (info.dir == (CoreStreaming.PinDirection.Input)))
{
// Recurse down this branch
RemoveDownstream(info.filter, true);
// Disconnect
GraphBuilder.Disconnect(pinTo);
GraphBuilder.Disconnect(pins[0]);
// Remove this filter
// but don't remove the video or audio compressors
if (info.filter != VideoCompressorFilter)
GraphBuilder.RemoveFilter(info.filter);
}
Marshal.ReleaseComObject(info.filter);
Marshal.ReleaseComObject(pinTo);
}
Marshal.ReleaseComObject(pins[0]);
}
}
while (hr == 0);
Marshal.ReleaseComObject(pinEnum); pinEnum = null;
}
}