int MpTopologyGraph::addVirtualInputs(MpResourceTopology& resourceTopology, UtlHashBag& newResources, UtlBoolean replaceNumInName, int resourceNum) { int portsAdded = 0; MpResourceTopology::VirtualPortIterator portIter; UtlString realResourceName; int realPortIdx; UtlString virtualResourceName; int virtualPortIdx; resourceTopology.initVirtualInputIterator(portIter); while (resourceTopology.getNextVirtualInput(portIter, realResourceName, realPortIdx, virtualResourceName, virtualPortIdx) == OS_SUCCESS) { if(replaceNumInName) { MpResourceTopology::replaceNumInName(realResourceName, resourceNum); MpResourceTopology::replaceNumInName(virtualResourceName, resourceNum); } // Lookup real resource. MpResource *pResource = (MpResource*)newResources.find(&realResourceName); assert(pResource); if (!pResource) { continue; } // Check port index correctness. Note, that this check gracefully // handles case with realPortIdx equal -1. if (realPortIdx >= pResource->maxInputs()) { assert(!"Trying to map virtual port to non existing real port!"); continue; } // Add entry to virtual ports map. // We need to create UtlVoidPtr wrapper for pResource, or it will be // destroyed on pair deletion. UtlContainablePair *pRealPort = new UtlContainablePair(new UtlVoidPtr(pResource), new UtlInt(realPortIdx)); UtlContainablePair *pVirtPort = new UtlContainablePair(new UtlString(virtualResourceName), new UtlInt(virtualPortIdx)); mVirtualInputs.insertKeyAndValue(pVirtPort, pRealPort); portsAdded++; } resourceTopology.freeVirtualInputIterator(portIter); return portsAdded; }
// Creates a link between the "outPortIdx" port of the "rFrom" resource // to the "inPortIdx" port of the "rTo" resource. // If the flow graph is not "started", this call takes effect immediately. // Otherwise, the call takes effect at the start of the next frame processing // interval. // Returns OS_SUCCESS if the link was successfully added. Returns // OS_INVALID_ARGUMENT if the caller specified an invalid port index. // Returns OS_UNSPECIFIED if the addLink attempt failed for some other // reason. OsStatus MpFlowGraphBase::addLink(MpResource& rFrom, int outPortIdx, MpResource& rTo, int inPortIdx) { OsWriteLock lock(mRWMutex); UtlBoolean handled; MpFlowGraphMsg msg(MpFlowGraphMsg::FLOWGRAPH_ADD_LINK, NULL, &rFrom, &rTo, outPortIdx, inPortIdx); if (outPortIdx < 0 || outPortIdx >= rFrom.maxOutputs() || inPortIdx < 0 || inPortIdx >= rTo.maxInputs()) return OS_INVALID_ARGUMENT; if (mCurState == STARTED) return postMessage(msg); handled = handleMessage(msg); if (handled) return OS_SUCCESS; else return OS_UNSPECIFIED; }