@@ -261,7 +261,10 @@ void ProcessorGraph::updateConnections(Array<SignalChainTabButton*, CriticalSect
261261 std::cout << std::endl;
262262
263263 Array<GenericProcessor*> splitters;
264- // GenericProcessor* activeSplitter = nullptr;
264+
265+ // keep track of which splitter is currently being explored, in case there's another
266+ // splitter between the one being explored and its source.
267+ GenericProcessor* activeSplitter = nullptr ;
265268
266269 for (int n = 0 ; n < tabs.size (); n++) // cycle through the tabs
267270 {
@@ -282,8 +285,8 @@ void ProcessorGraph::updateConnections(Array<SignalChainTabButton*, CriticalSect
282285 if (!(source->isSink () ||
283286 source->isSplitter () ||
284287 source->isMerger () ||
285- source->isUtility ())
286- && !( source->wasConnected ))
288+ source->isUtility () ||
289+ source->wasConnected ))
287290 {
288291 std::cout << " Connecting to audio and record nodes." << std::endl;
289292 connectProcessorToAudioAndRecordNodes (source);
@@ -294,23 +297,23 @@ void ProcessorGraph::updateConnections(Array<SignalChainTabButton*, CriticalSect
294297 }
295298
296299 // find the next dest that's not a merger or splitter
300+ GenericProcessor* prev = source;
297301 while (dest != nullptr && (dest->isMerger () || dest->isSplitter ()))
298302 {
299- if (dest->isSplitter () && !dest->wasConnected )
303+ if (dest->isSplitter () && dest != activeSplitter && !splitters.contains (dest))
304+ {
305+ // add to stack of splitters to explore
306+ splitters.add (dest);
307+ dest->switchIO (0 ); // go down first path
308+ }
309+ else if (dest->isMerger () && dest->getSourceNode () != prev)
300310 {
301- if (!splitters.contains (dest))
302- {
303- splitters.add (dest);
304- dest->switchIO (0 ); // go down first path
305- }
306- else
307- {
308- int splitterIndex = splitters.indexOf (dest);
309- splitters.remove (splitterIndex);
310- dest->switchIO (1 ); // go down second path
311- dest->wasConnected = true ; // make sure we don't re-use this splitter
312- }
311+ // keep the input aligned with the current path
312+ dest->switchIO ();
313+ jassert (dest->getSourceNode () == prev);
313314 }
315+
316+ prev = dest;
314317 dest = dest->getDestNode ();
315318 }
316319
@@ -330,21 +333,42 @@ void ProcessorGraph::updateConnections(Array<SignalChainTabButton*, CriticalSect
330333 std::cout << std::endl;
331334
332335 source->wasConnected = true ;
333- source = dest; // switch source and dest
334336
335- if (source == nullptr && splitters. size () > 0 )
337+ if (dest != nullptr && dest-> wasConnected )
336338 {
339+ // don't bother retraversing downstream of a dest that has already been connected
340+ // (but if it leads to a splitter that is still in the stack, it may still be
341+ // used as a source for the unexplored branch.)
342+
343+ std::cout << dest->getName () << " " << dest->getNodeId () <<
344+ " has already been connected." << std::endl;
345+ std::cout << std::endl;
346+ dest = nullptr ;
347+ }
337348
338- source = splitters.getLast ();
339- GenericProcessor* newSource;// = source->getSourceNode();
349+ source = dest; // switch source and dest
340350
341- while (source->isSplitter () || source->isMerger ())
351+ if (source == nullptr )
352+ {
353+ if (splitters.size () > 0 )
342354 {
343- newSource = source->getSourceNode ();
344- newSource->setPathToProcessor (source);
345- source = newSource;
346- }
355+ activeSplitter = splitters.getLast ();
356+ splitters.removeLast ();
357+ activeSplitter->switchIO (1 );
347358
359+ source = activeSplitter;
360+ GenericProcessor* newSource;
361+ while (source->isSplitter () || source->isMerger ())
362+ {
363+ newSource = source->getSourceNode ();
364+ newSource->setPathToProcessor (source);
365+ source = newSource;
366+ }
367+ }
368+ else
369+ {
370+ activeSplitter = nullptr ;
371+ }
348372 }
349373
350374 } // end while source != 0
0 commit comments