fix serious breakage with setup of plugin automatable controls/parameters, in which...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 9 Jun 2011 20:21:46 +0000 (20:21 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 9 Jun 2011 20:21:46 +0000 (20:21 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@9698 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/plugin_insert.h
libs/ardour/audio_unit.cc
libs/ardour/automatable.cc
libs/ardour/plugin_insert.cc
libs/ardour/session_command.cc

index 6e33ad9b61bd5dd714836c51c65f8c52029f79dc..ff2af9d1505273aa0cc5b58f714b2d29e5f31600 100644 (file)
@@ -155,7 +155,7 @@ class PluginInsert : public Processor
        void automation_run (BufferSet& bufs, pframes_t nframes);
        void connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now = 0);
 
-       void set_automatable ();
+       void create_automatable_parameters ();
        void control_list_automation_state_changed (Evoral::Parameter, AutoState);
        void set_parameter_state_2X (const XMLNode& node, int version);
        void set_control_ids (const XMLNode&, int version);
@@ -164,6 +164,7 @@ class PluginInsert : public Processor
 
        boost::shared_ptr<Plugin> plugin_factory (boost::shared_ptr<Plugin>);
        void add_plugin_with_activation (boost::shared_ptr<Plugin>);
+       void add_plugin (boost::shared_ptr<Plugin>);
 };
 
 } // namespace ARDOUR
index 9c1f8948ce58e8148ba20cd90c3e346904fd60c2..a4d2dd241eb01f2ab19fd2856dbbeefbdab16075 100644 (file)
@@ -370,6 +370,7 @@ AUPlugin::AUPlugin (AudioEngine& engine, Session& session, boost::shared_ptr<CAC
        init ();
 }
 
+
 AUPlugin::AUPlugin (const AUPlugin& other)
        : Plugin (other)
        , comp (other.get_comp())
index 661b1532446a8d1f775de504b62e4d6aec3f7c5e..8c17a99beac891f69b4daca871157896a08eb861 100644 (file)
@@ -255,8 +255,6 @@ Automatable::set_automation_xml_state (const XMLNode& node, Evoral::Parameter le
                                continue;
                         }
 
-
-
                        if (!id_prop) {
                                warning << "AutomationList node without automation-id property, "
                                        << "using default: " << EventTypeMap::instance().to_symbol(legacy_param) << endmsg;
index a92427409cb65fd97c4b1ecbe3e0f6b10e26bc86..fadf588ffead12fcc1775a21ae7061b6671ea4ff 100644 (file)
@@ -72,7 +72,8 @@ PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
        if (plug) {
                plug->set_insert_info (this);
                _plugins.push_back (plug);
-               set_automatable ();
+
+               create_automatable_parameters ();
 
                Glib::Mutex::Lock em (_session.engine().process_lock());
                IO::PortCountChanged (max(input_streams(), output_streams()));
@@ -192,8 +193,10 @@ PluginInsert::is_generator() const
 }
 
 void
-PluginInsert::set_automatable ()
+PluginInsert::create_automatable_parameters ()
 {
+       assert (!_plugins.empty());
+
        set<Evoral::Parameter> a = _plugins.front()->automatable ();
 
        Plugin::ParameterDescriptor desc;
@@ -876,60 +879,50 @@ PluginInsert::set_state(const XMLNode& node, int version)
                return -1;
        }
 
+       // The name of the PluginInsert comes from the plugin, nothing else
+       _name = plugin->get_info()->name;
+
        uint32_t count = 1;
-       bool need_automatables = true;
 
        if (_plugins.empty()) {
                /* if we are adding the first plugin, we will need to set
                   up automatable controls.
                */
-               need_automatables = true;
+               add_plugin (plugin);
+               create_automatable_parameters ();
+               set_control_ids (node, version);
        }
 
-       plugin->set_insert_info (this);
-
        if ((prop = node.property ("count")) != 0) {
                sscanf (prop->value().c_str(), "%u", &count);
        }
 
-       /* Handle the node list for this Processor (or Insert if an A2 session).
-        * This needs to happen before the add_plugin_with_activation below, as
-        * the plugin set_state calls may themselves call latency_compute_run,
-        * which will leave the plugin deactivated whether it is currently
-        * activated or not.
-        */
+       if (_plugins.size() != count) {
+               for (uint32_t n = 1; n < count; ++n) {
+                       add_plugin (plugin_factory (plugin));
+               }
+       }
+
        for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
 
+               /* find the node with the type-specific node name ("lv2", "ladspa", etc)
+                  and set all plugins to the same state.
+               */
+
                if ((*niter)->name() == plugin->state_node_name()) {
 
                        plugin->set_state (**niter, version);
+
                        for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
                                (*i)->set_state (**niter, version);
                        }
-                       break;
-               }
-       }
 
-       if (_plugins.size() != count) {
-
-               add_plugin_with_activation (plugin);
-
-               for (uint32_t n = 1; n < count; ++n) {
-                       add_plugin_with_activation (plugin_factory (plugin));
+                       break;
                }
        }
 
-       /* we cannot call this until the _plugins contains at least 1 
-          plugin so that we can look up parameter information etc.
-       */
-       
        Processor::set_state (node, version);
 
-       if (need_automatables) {
-               set_automatable ();
-               set_control_ids (node, version);
-       }
-
        if (version < 3000) {
 
                /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
@@ -947,8 +940,13 @@ PluginInsert::set_state(const XMLNode& node, int version)
                set_parameter_state_2X (node, version);
        }
 
-       // The name of the PluginInsert comes from the plugin, nothing else
-       _name = plugin->get_info()->name;
+       for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
+               if (active()) {
+                       (*i)->activate ();
+               } else {
+                       (*i)->deactivate ();
+               }
+       }
 
        /* catch up on I/O */
 
@@ -1204,6 +1202,14 @@ PluginInsert::add_plugin_with_activation (boost::shared_ptr<Plugin> plugin)
        }
 }
 
+/** Add a plugin to our list */
+void
+PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
+{
+       plugin->set_insert_info (this);
+       _plugins.push_back (plugin);
+}
+
 void
 PluginInsert::realtime_handle_transport_stopped ()
 {
index 36ad0152775200df10465063ae06bebd0278e24f..c240a4aa9447b5b32f606ef0bb443ce18d6c4814 100644 (file)
@@ -140,7 +140,7 @@ Session::memento_command_factory(XMLNode *n)
                            );
            }
 
-           cerr << "Alist not found\n";
+           cerr << "Alist " << id << " not found\n";
 
     } else if (obj_T == "ARDOUR::Crossfade") {
            boost::shared_ptr<Crossfade> c = playlists->find_crossfade (id);