fix serious breakage with setup of plugin automatable controls/parameters, in which the relative ordering of things during ::set_state() was totally wrong. still see multiple instances of automation tracks for processors in GUI
git-svn-id: svn://localhost/ardour2/branches/3.0@9698 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
/* 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 ()
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user