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:
Paul Davis
2011-06-09 20:21:46 +00:00
parent 5b3916c62e
commit 071cc3ef01
5 changed files with 42 additions and 36 deletions

View 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

View 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())

View 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;

View 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));
}
}
/* 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 ()
{

View 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);