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);
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
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()));
}
void
-PluginInsert::set_automatable ()
+PluginInsert::create_automatable_parameters ()
{
+ assert (!_plugins.empty());
+
set<Evoral::Parameter> a = _plugins.front()->automatable ();
Plugin::ParameterDescriptor desc;
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
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 */
}
}
+/** 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 ()
{