lincoln's patch to get loading 2.X sessions to work better
authorPaul Davis <paul@linuxaudiosystems.com>
Sun, 28 Mar 2010 19:07:23 +0000 (19:07 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Sun, 28 Mar 2010 19:07:23 +0000 (19:07 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6804 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/mute_master.h
libs/ardour/io.cc
libs/ardour/lv2_plugin.cc
libs/ardour/mute_master.cc
libs/ardour/plugin_insert.cc
libs/ardour/region.cc
libs/ardour/route.cc

index 0e3c10b795b02e6a2250c3b59cdbcef84e02fecb..925d6796745fbb8ad0dbbc920c69cd1b44d94319 100644 (file)
@@ -23,6 +23,7 @@
 #include "evoral/Parameter.hpp"
 #include "pbd/signals.h"
 #include "pbd/stateful.h"
+#include <string>
 
 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;
index 9da9bf2a280ae81d378d8df17cb87ccc02e8da42..29659a2d0c181513c2a332f348afa96f7f154298 100644 (file)
@@ -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;
                }
        }
 
index faaf41fd357de4734b8786a17cf8f24df8508d94..368c521d0b9a093f9e4d39593e7e9db96305a067 100644 (file)
@@ -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<string,uint32_t>::iterator i = _port_indices.find(sym);
+               
                if (i != _port_indices.end()) {
                        port_id = i->second;
                } else {
index e7810b27fd274d59a3d24b53b84c8b5385d1f177..45499696a96b7dbacc611f63d06faf43cbd886bd 100644 (file)
@@ -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*/)
 {
index 2ad4d4b350ffed899ee11409ec3b806fff103a3a..af908a20365840c3c5ddeb0b53110fd32765259f 100644 (file)
@@ -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;
                        
index b89ad2854b575573b7a3a40f7bc63c92ea8c10c3..acd4e1b9dce46ee097c4f988360eaf251ca79632 100644 (file)
@@ -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;
 }
index f94d72ef77a55db9faa22cbb1e30372939381ba1..d4bef141760f8e13dc61dfadd14a8824e73c4543 100644 (file)
@@ -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){