diff options
Diffstat (limited to 'libs/ardour/route.cc')
-rw-r--r-- | libs/ardour/route.cc | 353 |
1 files changed, 86 insertions, 267 deletions
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 2744b71f91..69ec29a0b1 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -124,7 +124,7 @@ Route::init () _amp.reset (new Amp (_session, _mute_master)); add_processor (_amp, PostFader); - /* add standard processors other than amp (added by ::init()) */ + /* add standard processors: meter, main outs, monitor out */ _meter.reset (new PeakMeter (_session)); _meter->set_display_to_user (false); @@ -835,183 +835,6 @@ Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::ite } bool -Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter) -{ - const XMLProperty *prop; - - if (node.name() != "Processor") { - return false; - } - - try { - if ((prop = node.property ("type")) != 0) { - - boost::shared_ptr<Processor> processor; - - /* meter, amp, monitor and intreturn are all singletons, deal with them first */ - - if (prop->value() == "meter") { - - if (_meter) { - if (_meter->set_state (node, Stateful::loading_state_version)) { - return false; - } else { - return true; - } - } - - PeakMeter* pm = new PeakMeter (_session); - - if (pm->set_state (node, Stateful::loading_state_version)) { - delete pm; - return false; - } - - _meter.reset (pm); - _meter->set_display_to_user (_meter_point == MeterCustom); - - processor = _meter; - - } else if (prop->value() == "monitor") { - - if (_monitor_control) { - if (_monitor_control->set_state (node, Stateful::loading_state_version)) { - return false; - } else { - return true; - } - } - - MonitorProcessor* mp = new MonitorProcessor (_session); - if (mp->set_state (node, Stateful::loading_state_version)) { - delete mp; - return false; - } - - _monitor_control.reset (mp); - processor = _monitor_control; - - } else if (prop->value() == "amp") { - - if (_amp) { - processor = _amp; - if (processor->set_state (node, Stateful::loading_state_version)) { - return false; - } else { - /* no reason to add it */ - return true; - } - } - - Amp* a = new Amp (_session, _mute_master); - if (_amp->set_state (node, Stateful::loading_state_version)) { - delete a; - return false; - } - - _amp.reset (a); - processor = _amp; - - } else if (prop->value() == "intreturn") { - - /* a route only has one internal return. If it exists already - just set its state, and return - */ - - if (_intreturn) { - if (_intreturn->set_state (node, Stateful::loading_state_version)) { - return false; - } else { - return true; - } - } - - InternalReturn* iret = new InternalReturn (_session); - if (iret->set_state (node, Stateful::loading_state_version)) { - delete iret; - return false; - } - - _intreturn.reset (iret); - processor = _intreturn; - - } else if (prop->value() == "main-outs") { - - if (_main_outs) { - if (_main_outs->set_state (node, Stateful::loading_state_version)) { - return false; - } else { - return true; - } - } - - Delivery* del = new Delivery (_session, _output, _mute_master, X_("toBeResetFroXML"), Delivery::Role (0)); - if (del->set_state (node, Stateful::loading_state_version)) { - delete del; - return false; - } - - _main_outs.reset (del); - processor = _main_outs; - - } else if (prop->value() == "intsend") { - - InternalSend* isend = new InternalSend (_session, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)); - if (isend->set_state (node, Stateful::loading_state_version)) { - delete isend; - return false; - } - - processor.reset (isend); - - } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" || - prop->value() == "lv2" || - prop->value() == "vst" || - prop->value() == "audiounit") { - - processor.reset (new PluginInsert(_session, node)); - - } else if (prop->value() == "port") { - - processor.reset (new PortInsert (_session, _mute_master, node)); - - } else if (prop->value() == "send") { - - processor.reset (new Send (_session, _mute_master, node)); - - } else { - error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg; - return false; - } - - if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) { - /* check for invisible processors stacked at the end and leave them there */ - ProcessorList::iterator p; - p = _processors.end(); - --p; - while (!(*p)->display_to_user() && p != _processors.begin()) { - --p; - } - ++p; - iter = p; - } - - return (add_processor (processor, iter, 0, false) == 0); - - } else { - error << _("Processor XML node has no type property") << endmsg; - return false; - } - } - - catch (failed_constructor &err) { - warning << _("processor could not be created. Ignored.") << endmsg; - return false; - } -} - - -bool Route::add_processor_from_xml_2X (const XMLNode& node, int version, ProcessorList::iterator iter) { const XMLProperty *prop; @@ -1028,18 +851,18 @@ Route::add_processor_from_xml_2X (const XMLNode& node, int version, ProcessorLis prop->value() == "vst" || prop->value() == "audiounit") { - processor.reset (new PluginInsert (_session, node)); + processor.reset (new PluginInsert (_session)); } else { - processor.reset (new PortInsert (_session, _mute_master, node)); + processor.reset (new PortInsert (_session, _mute_master)); } } } else if (node.name() == "Send") { - processor.reset (new Send (_session, _mute_master, node, version)); + processor.reset (new Send (_session, _mute_master)); } else { @@ -1047,6 +870,10 @@ Route::add_processor_from_xml_2X (const XMLNode& node, int version, ProcessorLis return false; } + if (processor->set_state (node, version)) { + return false; + } + if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) { /* check for invisible processors stacked at the end and leave them there */ ProcessorList::iterator p; @@ -1769,7 +1596,9 @@ Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err } } - processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */ + if (true) { + processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */ + } return 0; } @@ -2316,101 +2145,94 @@ Route::set_processor_state (const XMLNode& node) { const XMLNodeList &nlist = node.children(); XMLNodeConstIterator niter; - ProcessorList::iterator i, o; - - // Iterate through existing processors, remove those which are not in the state list - - for (i = _processors.begin(); i != _processors.end(); ) { - - /* leave amp alone, always */ - - if ((*i) == _amp) { - ++i; - continue; - } - - ProcessorList::iterator tmp = i; - ++tmp; - - bool processorInStateList = false; - - for (niter = nlist.begin(); niter != nlist.end(); ++niter) { - - XMLProperty* id_prop = (*niter)->property(X_("id")); - - if (id_prop && (*i)->id() == id_prop->value()) { - processorInStateList = true; - break; - } - } - - if (!processorInStateList) { - remove_processor (*i); - } - - i = tmp; - } - - // Iterate through state list and make sure all processors are on the track and in the correct order, - // set the state of existing processors according to the new state on the same go - - i = _processors.begin(); + ProcessorList new_order; + bool must_configure = false; - for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) { + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { XMLProperty* prop = (*niter)->property ("type"); - o = i; - - // Check whether the next processor in the list is the right one, - // except for "amp" which is always there and may not have the - // old ID since it is always created anew in every Route + if (prop->value() == "amp") { + _amp->set_state (**niter, Stateful::current_state_version); + new_order.push_back (_amp); + } else if (prop->value() == "meter") { + _meter->set_state (**niter, Stateful::current_state_version); + new_order.push_back (_meter); + } else if (prop->value() == "main-outs") { + _main_outs->set_state (**niter, Stateful::current_state_version); + new_order.push_back (_main_outs); + } else if (is_monitor() && prop->value() == "intreturn") { + if (!_intreturn) { + _intreturn.reset (new InternalReturn (_session)); + must_configure = true; + } + _intreturn->set_state (**niter, Stateful::current_state_version); + new_order.push_back (_intreturn); + } else if (is_monitor() && prop->value() == "monitor") { + if (!_monitor_control) { + _monitor_control.reset (new MonitorProcessor (_session)); + must_configure = true; + } + _monitor_control->set_state (**niter, Stateful::current_state_version); + new_order.push_back (_monitor_control); + } else { + ProcessorList::iterator o; - if (prop->value() != "amp") { - while (o != _processors.end()) { + for (o = _processors.begin(); o != _processors.end(); ++o) { XMLProperty* id_prop = (*niter)->property(X_("id")); if (id_prop && (*o)->id() == id_prop->value()) { + (*o)->set_state (**niter, Stateful::current_state_version); + new_order.push_back (*o); break; } - - ++o; } - } - - // If the processor (*niter) is not on the route, - // create it and move it to the correct location - - if (o == _processors.end()) { - - if (add_processor_from_xml (**niter, i)) { - --i; // move iterator to the newly inserted processor - } else { - cerr << "Error restoring route: unable to restore processor" << endl; - } - - } else { - - // Otherwise, the processor already exists; just - // ensure it is at the location provided in the XML state - if (i != o) { - boost::shared_ptr<Processor> tmp = (*o); - _processors.erase (o); // remove the old copy - _processors.insert (i, tmp); // insert the processor at the correct location - --i; // move iterator to the correct processor - } - - // and make it (just) so + // If the processor (*niter) is not on the route then create it + + if (o == _processors.end()) { + + boost::shared_ptr<Processor> processor; + + if (prop->value() == "intsend") { + + processor.reset (new InternalSend (_session, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0))); + + } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" || + prop->value() == "lv2" || + prop->value() == "vst" || + prop->value() == "audiounit") { + + processor.reset (new PluginInsert(_session)); + + } else if (prop->value() == "port") { + + processor.reset (new PortInsert (_session, _mute_master)); + + } else if (prop->value() == "send") { + + processor.reset (new Send (_session, _mute_master)); + + } else { + error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg; + continue; + } - (*i)->set_state (**niter, Stateful::current_state_version); - } - } + processor->set_state (**niter, Stateful::current_state_version); + new_order.push_back (processor); + must_configure = true; + } + } + } - /* note: there is no configure_processors() call because we figure that - the XML state represents a working signal route. - */ + { + Glib::RWLock::WriterLock lm (_processor_lock); + _processors = new_order; + if (must_configure) { + configure_processors_unlocked (0); + } + } - processors_changed (RouteProcessorChange ()); + processors_changed (RouteProcessorChange ()); } void @@ -3388,14 +3210,11 @@ Route::nth_send (uint32_t n) ProcessorList::iterator i; for (i = _processors.begin(); i != _processors.end(); ++i) { - cerr << "check " << (*i)->name() << endl; if (boost::dynamic_pointer_cast<Send> (*i)) { if (n-- == 0) { return *i; } - } else { - cerr << "\tnot a send\n"; - } + } } return boost::shared_ptr<Processor> (); |