CodeTV.CrossbarHelper.BuildRoutingList C# (CSharp) Méthode

BuildRoutingList() private méthode

private BuildRoutingList ( IPin startingInputPin, Routing routing, int depth ) : int
startingInputPin IPin
routing Routing
depth int
Résultat int
        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;
        }