diff --git a/libs/ardour/ardour/mute_master.h b/libs/ardour/ardour/mute_master.h index 0e3c10b795..925d679674 100644 --- a/libs/ardour/ardour/mute_master.h +++ b/libs/ardour/ardour/mute_master.h @@ -23,6 +23,7 @@ #include "evoral/Parameter.hpp" #include "pbd/signals.h" #include "pbd/stateful.h" +#include namespace ARDOUR { @@ -61,6 +62,7 @@ class MuteMaster : public PBD::Stateful XMLNode& get_state(); int set_state(const XMLNode&, int version); + int set_state(std::string mute_point); private: MutePoint _mute_point; diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index 9da9bf2a28..29659a2d0c 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -748,8 +748,12 @@ IO::get_port_counts_2X (XMLNode const & node, int /*version*/, ChanCount& n, boo if ((prop = node.property ("inputs")) != 0 && _direction == Input) { n_audio = count (prop->value().begin(), prop->value().end(), '{'); + } else if ((prop = node.property ("input-connection")) != 0 && _direction == Input) { + n_audio = 1; } else if ((prop = node.property ("outputs")) != 0 && _direction == Output) { n_audio = count (prop->value().begin(), prop->value().end(), '{'); + } else if ((prop = node.property ("output-connection")) != 0 && _direction == Output) { + n_audio = 2; } } diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index faaf41fd35..368c521d0b 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -352,7 +352,7 @@ LV2Plugin::has_editor() const } int -LV2Plugin::set_state(const XMLNode& node, int /*version*/) +LV2Plugin::set_state(const XMLNode& node, int version) { XMLNodeList nodes; XMLProperty *prop; @@ -368,8 +368,12 @@ LV2Plugin::set_state(const XMLNode& node, int /*version*/) return -1; } - nodes = node.children ("Port"); - + if (version < 3000){ + nodes = node.children ("port"); + } else { + nodes = node.children ("Port"); + } + for (iter = nodes.begin(); iter != nodes.end(); ++iter){ child = *iter; @@ -382,6 +386,7 @@ LV2Plugin::set_state(const XMLNode& node, int /*version*/) } map::iterator i = _port_indices.find(sym); + if (i != _port_indices.end()) { port_id = i->second; } else { diff --git a/libs/ardour/mute_master.cc b/libs/ardour/mute_master.cc index e7810b27fd..45499696a9 100644 --- a/libs/ardour/mute_master.cc +++ b/libs/ardour/mute_master.cc @@ -76,6 +76,14 @@ MuteMaster::mute_gain_at (MutePoint mp) const } } +int +MuteMaster::set_state (std::string mute_point) +{ + _mute_point = (MutePoint) string_2_enum (mute_point, _mute_point); + + return 0; +} + int MuteMaster::set_state (const XMLNode& node, int /*version*/) { diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 2ad4d4b350..af908a2036 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -798,8 +798,11 @@ PluginInsert::set_state(const XMLNode& node, int version) set_automatable (); } + /* Handle the node list for this Processor (or Insert if an A2 session) */ for (niter = nlist.begin(); niter != nlist.end(); ++niter) { + if ((*niter)->name() == plugin->state_node_name()) { + for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { (*i)->set_state (**niter, version); } @@ -808,6 +811,7 @@ PluginInsert::set_state(const XMLNode& node, int version) } if (version < 3000) { + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { if ((*niter)->name() == "Redirect") { /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */ @@ -815,7 +819,9 @@ PluginInsert::set_state(const XMLNode& node, int version) break; } } + set_parameter_state_2X (node, version); + } else { Processor::set_state (node, version); set_parameter_state (node, version); @@ -910,7 +916,7 @@ PluginInsert::set_parameter_state_2X (const XMLNode& node, int version) cnodes = (*niter)->children ("port"); - for(iter = cnodes.begin(); iter != cnodes.end(); ++iter){ + for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){ child = *iter; diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index b89ad2854b..acd4e1b9dc 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -1214,6 +1214,14 @@ Region::_set_state (const XMLNode& node, int version, PropertyChange& what_chang cerr << endl; send_change (what_changed); } + + /* Quick fix for 2.x sessions when region is muted */ + if ((prop = node.property (X_("flags")))) { + if (string::npos != prop->value().find("Muted")){ + set_muted (true); + } + } + return 0; } diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index f94d72ef77..d4bef14176 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -2037,11 +2037,6 @@ Route::_set_state_2X (const XMLNode& node, int version) /* 2X things which still remain to be handled: * default-type - * muted - * mute-affects-pre-fader - * mute-affects-post-fader - * mute-affects-control-outs - * mute-affects-main-outs * automation * controlouts */ @@ -2056,58 +2051,7 @@ Route::_set_state_2X (const XMLNode& node, int version) } else { _flags = Flag (0); } - - /* add standard processors */ - - _meter.reset (new PeakMeter (_session)); - add_processor (_meter, PreFader); - - if (is_monitor()) { - /* where we listen to tracks */ - _intreturn.reset (new InternalReturn (_session)); - add_processor (_intreturn, PreFader); - - _monitor_control.reset (new MonitorProcessor (_session)); - add_processor (_monitor_control, PostFader); - } - - _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main)); - add_processor (_main_outs, PostFader); - - /* IOs */ - - nlist = node.children (); - for (niter = nlist.begin(); niter != nlist.end(); ++niter) { - - child = *niter; - - if (child->name() == IO::state_node_name) { - - /* there is a note in IO::set_state_2X() about why we have to call - this directly. - */ - - _input->set_state_2X (*child, version, true); - _output->set_state_2X (*child, version, false); - - if ((prop = child->property (X_("name"))) != 0) { - set_name (prop->value ()); - } - - if ((prop = child->property (X_("id"))) != 0) { - _id = prop->value (); - } - - if ((prop = child->property (X_("active"))) != 0) { - bool yn = string_is_affirmative (prop->value()); - _active = !yn; // force switch - set_active (yn); - } - } - - /* XXX: panners? */ - } - + if ((prop = node.property (X_("phase-invert"))) != 0) { set_phase_invert (string_is_affirmative (prop->value())); } @@ -2124,6 +2068,65 @@ Route::_set_state_2X (const XMLNode& node, int version) set_solo (yn, this); } + if ((prop = node.property (X_("muted"))) != 0) { + + bool first = true; + bool muted = string_is_affirmative (prop->value()); + + if(muted){ + + string mute_point; + + if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) { + + if (string_is_affirmative (prop->value())){ + mute_point = mute_point + "PreFader"; + first = false; + } + } + + if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) { + + if (string_is_affirmative (prop->value())){ + + if (!first) { + mute_point = mute_point + ","; + } + + mute_point = mute_point + "PostFader"; + first = false; + } + } + + if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) { + + if (string_is_affirmative (prop->value())){ + + if (!first) { + mute_point = mute_point + ","; + } + + mute_point = mute_point + "Listen"; + first = false; + } + } + + if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) { + + if (string_is_affirmative (prop->value())){ + + if (!first) { + mute_point = mute_point + ","; + } + + mute_point = mute_point + "Main"; + } + } + + _mute_master->set_state (mute_point); + } + } + if ((prop = node.property (X_("meter-point"))) != 0) { _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point)); } @@ -2163,6 +2166,78 @@ Route::_set_state_2X (const XMLNode& node, int version) } } + /* add standard processors */ + + //_meter.reset (new PeakMeter (_session)); + //add_processor (_meter, PreFader); + + if (is_monitor()) { + /* where we listen to tracks */ + _intreturn.reset (new InternalReturn (_session)); + add_processor (_intreturn, PreFader); + + _monitor_control.reset (new MonitorProcessor (_session)); + add_processor (_monitor_control, PostFader); + } + + _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main)); + add_processor (_main_outs, PostFader); + + /* IOs */ + + nlist = node.children (); + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { + + child = *niter; + + if (child->name() == IO::state_node_name) { + + /* there is a note in IO::set_state_2X() about why we have to call + this directly. + */ + + _input->set_state_2X (*child, version, true); + _output->set_state_2X (*child, version, false); + + if ((prop = child->property (X_("name"))) != 0) { + Route::set_name (prop->value ()); + } + + if ((prop = child->property (X_("id"))) != 0) { + _id = prop->value (); + } + + if ((prop = child->property (X_("active"))) != 0) { + bool yn = string_is_affirmative (prop->value()); + _active = !yn; // force switch + set_active (yn); + } + + if ((prop = child->property (X_("gain"))) != 0) { + gain_t val; + + if (sscanf (prop->value().c_str(), "%f", &val) == 1) { + _amp->gain_control()->set_value (val); + } + } + + /* Set up Panners in the IO */ + XMLNodeList io_nlist = child->children (); + + XMLNodeConstIterator io_niter; + XMLNode *io_child; + + for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) { + + io_child = *io_niter; + + if (io_child->name() == X_("Panner")) { + _main_outs->panner()->set_state(*io_child, version); + } + } + } + } + XMLNodeList redirect_nodes; for (niter = nlist.begin(); niter != nlist.end(); ++niter){