private int BuildRoutingList(IPin startingInputPin, Routing routing, int depth)
{
if (startingInputPin == null || routing == null)
return -1; // E_POINTER;
// If the pin isn't connected, then it's a terminal pin
IPin startingOutputPin = null;
int hr = startingInputPin.ConnectedTo(out startingOutputPin);
if (hr != 0)
return ((depth == 0) ? -1 : 1);
// It is connected, so now find out if the filter supports IAMCrossbar
PinInfo pinInfo;
if (startingOutputPin.QueryPinInfo(out pinInfo) == 0)
{
//ASSERT (pinInfo.dir == PINDIR_OUTPUT);
IAMCrossbar crossbar = pinInfo.filter as IAMCrossbar;
if (crossbar != null)
{
int inputs, outputs, inputIndex, outputIndex;
int inputIndexRelated, outputIndexRelated;
PhysicalConnectorType inputPhysicalType, outputPhysicalType;
hr = crossbar.get_PinCounts(out outputs, out inputs);
// for all output pins
for (outputIndex = 0; outputIndex < outputs; outputIndex++)
{
hr = crossbar.get_CrossbarPinInfo(false, outputIndex, out outputIndexRelated, out outputPhysicalType);
// for all input pins
for (inputIndex = 0; inputIndex < inputs; inputIndex++)
{
hr = crossbar.get_CrossbarPinInfo(true, inputIndex, out inputIndexRelated, out inputPhysicalType);
// Can we route it?
if (crossbar.CanRoute(outputIndex, inputIndex) == 0)
{
IPin pPin = null;
hr = GetCrossbarPinAtIndex(crossbar, inputIndex, true, out pPin);
// We've found a route through this crossbar
// so save our state before recusively searching
// again.
Routing routingNext = new Routing();
// doubly linked list
routingNext.rightRouting = routing;
routing.leftRouting = routingNext;
routing.crossbar = crossbar;
routing.inputIndex = inputIndex;
routing.outputIndex = outputIndex;
routing.inputIndexRelated = inputIndexRelated;
routing.outputIndexRelated = outputIndexRelated;
routing.inputPhysicalType = inputPhysicalType;
routing.outputPhysicalType = outputPhysicalType;
routing.depth = depth;
routing.inputName = this.pinNameByPhysicalConnectorType[inputPhysicalType] as string;
hr = BuildRoutingList(pPin, routingNext, depth + 1);
if (hr == 1)
{
routing.leftRouting = null;
SaveRouting(routing, inputPhysicalType >= PhysicalConnectorType.Audio_Tuner);
}
} // if we can route
} // for all input pins
}
//pXbar.Release();
}
else
{
// The filter doesn't support IAMCrossbar, so this
// is a terminal pin
DsUtils.FreePinInfo(pinInfo);
Marshal.ReleaseComObject(startingOutputPin);
return (depth == 0) ? -1 : 1;
}
DsUtils.FreePinInfo(pinInfo);
}
Marshal.ReleaseComObject(startingOutputPin);
return 0;
}