re-configure _all_ panners on a route, when panner type changes
authorRobin Gareus <robin@gareus.org>
Fri, 10 Jan 2014 11:36:20 +0000 (12:36 +0100)
committerRobin Gareus <robin@gareus.org>
Fri, 10 Jan 2014 11:36:20 +0000 (12:36 +0100)
libs/ardour/route.cc

index 951a4ff30c6cbf3184374d105e0988a960779dba..6f23e920d4422fb08cca812103c44ed31062b31d 100644 (file)
@@ -1577,6 +1577,11 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams*
 void
 Route::set_custom_panner_uri (std::string const panner_uri)
 {
+       if (_in_configure_processors) {
+               DEBUG_TRACE (DEBUG::Panning, string_compose (_("Route::set_custom_panner_uri '%1' -- called while in_configure_processors\n"), name()));
+               return;
+       }
+
        if (!_main_outs->panner_shell()->set_user_selected_panner_uri(panner_uri)) {
                DEBUG_TRACE (DEBUG::Panning, string_compose (_("Route::set_custom_panner_uri '%1 '%2' -- no change needed\n"), name(), panner_uri));
                /* no change needed */
@@ -1585,33 +1590,35 @@ Route::set_custom_panner_uri (std::string const panner_uri)
 
        DEBUG_TRACE (DEBUG::Panning, string_compose (_("Route::set_custom_panner_uri '%1 '%2' -- reconfigure I/O\n"), name(), panner_uri));
 
-       if (_in_configure_processors) {
-               DEBUG_TRACE (DEBUG::Panning, string_compose (_("Route::set_custom_panner_uri '%1' -- called while in_configure_processors\n"), name()));
-               return;
-       }
-
-       /* reconfigure I/O */
+       /* reconfigure I/O -- re-initialize panner modules */
        {
                Glib::Threads::RWLock::WriterLock lm (_processor_lock);
-               ProcessorState pstate (this);
-               if (panner())
-               {
-                       /* there is already a panner it can just be re-configured in-place */
-                       Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
-                       ChanCount in = panner()->in();
-                       ChanCount out = panner()->out();
-                       _main_outs->panner_shell()->configure_io(in, out);
-                       _main_outs->panner_shell()->pannable()->set_panner(panner());
-               }
-               else
-               {
-                       Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+               Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
 
-                       if (configure_processors_unlocked (0)) {
-                               pstate.restore ();
-                               configure_processors_unlocked (0); // it worked before we tried to add it ...
-                               return;
+               for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
+                       boost::shared_ptr<Delivery> dl;
+                       boost::shared_ptr<Panner> panner;
+                       if ((dl = boost::dynamic_pointer_cast<Delivery> (*p)) == 0) {
+                               continue;
+                       }
+                       if (!dl->panner_shell()) {
+                               continue;
+                       }
+                       if (!(panner = dl->panner_shell()->panner())) {
+                               continue;
                        }
+                       /* _main_outs has already been set before the loop.
+                        * Ignore the return status here. It need reconfiguration */
+                       if (dl->panner_shell() != _main_outs->panner_shell()) {
+                               if (!dl->panner_shell()->set_user_selected_panner_uri(panner_uri)) {
+                                       continue;
+                               }
+                       }
+
+                       ChanCount in = panner->in();
+                       ChanCount out = panner->out();
+                       dl->panner_shell()->configure_io(in, out);
+                       dl->panner_shell()->pannable()->set_panner(dl->panner_shell()->panner());
                }
        }