X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fplugin_insert.cc;h=f50483beaf2e143f18424c439d5543f34766b67e;hb=0cd3bd4f194439a047f8ab6b7baaf38d118a1d85;hp=f41d6bbc25725cbad1eafec233d83d0a8c586cd3;hpb=1e424e11460812262df89c08c6af521a935760cf;p=ardour.git diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index f41d6bbc25..f50483beaf 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -23,7 +23,6 @@ #include -#include #include "pbd/failed_constructor.h" #include "pbd/xml++.h" @@ -63,35 +62,16 @@ using namespace PBD; const string PluginInsert::port_automation_node_name = "PortAutomation"; PluginInsert::PluginInsert (Session& s, boost::shared_ptr plug) - : Processor (s, plug->name()) + : Processor (s, (plug ? plug->name() : string ("toBeRenamed"))) , _signal_analysis_collected_nframes(0) , _signal_analysis_collect_nframes_max(0) { /* the first is the master */ - _plugins.push_back (plug); - set_automatable (); + if (plug) { + _plugins.push_back (plug); + set_automatable (); - { - Glib::Mutex::Lock em (_session.engine().process_lock()); - IO::PortCountChanged (max(input_streams(), output_streams())); - } - - ProcessorCreated (this); /* EMIT SIGNAL */ -} - -PluginInsert::PluginInsert (Session& s, const XMLNode& node) - : Processor (s, "unnamed plugin insert"), - _signal_analysis_collected_nframes(0), - _signal_analysis_collect_nframes_max(0) -{ - if (set_state (node, Stateful::loading_state_version)) { - throw failed_constructor(); - } - - _pending_active = _active; - - { Glib::Mutex::Lock em (_session.engine().process_lock()); IO::PortCountChanged (max(input_streams(), output_streams())); } @@ -131,7 +111,6 @@ PluginInsert::set_count (uint32_t num) PluginInsert::~PluginInsert () { - GoingAway (); /* EMIT SIGNAL */ } void @@ -141,7 +120,7 @@ PluginInsert::auto_state_changed (Evoral::Parameter which) return; boost::shared_ptr c - = boost::dynamic_pointer_cast(data().control (which)); + = boost::dynamic_pointer_cast(control (which)); if (c && ((AutomationList*)c->list().get())->automation_state() != Off) { _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame())); @@ -207,12 +186,19 @@ PluginInsert::set_automatable () for (set::iterator i = a.begin(); i != a.end(); ++i) { if (i->type() == PluginAutomation) { - can_automate (*i); - _plugins.front()->get_parameter_descriptor(i->id(), desc); + Evoral::Parameter param(*i); - param.set_range(desc.lower, desc.upper, _plugins.front()->default_value(i->id())); + + _plugins.front()->get_parameter_descriptor(i->id(), desc); + + /* the Parameter belonging to the actual plugin doesn't have its range set + but we want the Controllable related to this Parameter to have those limits. + */ + + param.set_range (desc.lower, desc.upper, _plugins.front()->default_value(i->id())); + can_automate (param); boost::shared_ptr list(new AutomationList(param)); - add_control(boost::shared_ptr(new PluginControl(this, *i, list))); + add_control (boost::shared_ptr(new PluginControl(this, param, list))); } } } @@ -284,7 +270,7 @@ PluginInsert::connect_and_run (BufferSet& bufs, nframes_t nframes, nframes_t off uint32_t n = 0; - for (Controls::iterator li = data().controls().begin(); li != data().controls().end(); ++li, ++n) { + for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) { boost::shared_ptr c = boost::dynamic_pointer_cast(li->second); @@ -412,7 +398,7 @@ PluginInsert::set_parameter (Evoral::Parameter param, float val) _plugins[0]->set_parameter (param.id(), val); boost::shared_ptr ac - = boost::dynamic_pointer_cast(data().control(param)); + = boost::dynamic_pointer_cast(control(param)); if (ac) { ac->set_value(val); @@ -427,11 +413,12 @@ PluginInsert::set_parameter (Evoral::Parameter param, float val) float PluginInsert::get_parameter (Evoral::Parameter param) { - if (param.type() != PluginAutomation) + if (param.type() != PluginAutomation) { return 0.0; - else - return - _plugins[0]->get_parameter (param.id()); + } else { + assert (!_plugins.empty ()); + return _plugins[0]->get_parameter (param.id()); + } } void @@ -442,14 +429,14 @@ PluginInsert::automation_run (BufferSet& bufs, nframes_t nframes) nframes_t end = now + nframes; nframes_t offset = 0; - Glib::Mutex::Lock lm (data().control_lock(), Glib::TRY_LOCK); + Glib::Mutex::Lock lm (control_lock(), Glib::TRY_LOCK); if (!lm.locked()) { connect_and_run (bufs, nframes, offset, false); return; } - if (!data().find_next_event (now, end, next_event)) { + if (!find_next_event (now, end, next_event)) { /* no events have a time within the relevant range */ @@ -467,7 +454,7 @@ PluginInsert::automation_run (BufferSet& bufs, nframes_t nframes) offset += cnt; now += cnt; - if (!data().find_next_event (now, end, next_event)) { + if (!find_next_event (now, end, next_event)) { break; } } @@ -697,7 +684,8 @@ PluginInsert::state (bool full) child->add_child_nocopy (automation_list (*x).state (full)); autonode->add_child_nocopy (*child); */ - autonode->add_child_nocopy (((AutomationList*)data().control(*x)->list().get())->state (full)); + AutomationList* list = dynamic_cast(control(*x)->list().get()); + autonode->add_child_nocopy (list->state (full)); } node.add_child_nocopy (*autonode); @@ -791,8 +779,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); } @@ -800,7 +791,10 @@ PluginInsert::set_state(const XMLNode& node, int version) } } + Processor::set_state (node, 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) */ @@ -808,15 +802,24 @@ 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); } // The name of the PluginInsert comes from the plugin, nothing else _name = plugin->get_info()->name; + /* catch up on I/O */ + + { + Glib::Mutex::Lock em (_session.engine().process_lock()); + IO::PortCountChanged (max(input_streams(), output_streams())); + } + return 0; } @@ -865,7 +868,7 @@ PluginInsert::set_parameter_state (const XMLNode& node, int version) } boost::shared_ptr c = boost::dynamic_pointer_cast( - data().control(Evoral::Parameter(PluginAutomation, 0, port_id), true)); + control(Evoral::Parameter(PluginAutomation, 0, port_id), true)); if (c) { c->alist()->set_state (*child, version); @@ -903,7 +906,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; @@ -922,7 +925,7 @@ PluginInsert::set_parameter_state_2X (const XMLNode& node, int version) } boost::shared_ptr c = boost::dynamic_pointer_cast( - data().control(Evoral::Parameter(PluginAutomation, 0, port_id), true)); + control(Evoral::Parameter(PluginAutomation, 0, port_id), true)); if (c) { if (!child->children().empty()) { @@ -962,30 +965,7 @@ PluginInsert::signal_latency() const ARDOUR::PluginType PluginInsert::type () { - boost::shared_ptr lp; -#ifdef VST_SUPPORT - boost::shared_ptr vp; -#endif -#ifdef HAVE_AUDIOUNITS - boost::shared_ptr ap; -#endif - - PluginPtr other = plugin (); - - if ((lp = boost::dynamic_pointer_cast (other)) != 0) { - return ARDOUR::LADSPA; -#ifdef VST_SUPPORT - } else if ((vp = boost::dynamic_pointer_cast (other)) != 0) { - return ARDOUR::VST; -#endif -#ifdef HAVE_AUDIOUNITS - } else if ((ap = boost::dynamic_pointer_cast (other)) != 0) { - return ARDOUR::AudioUnit; -#endif - } else { - /* NOT REACHED */ - return (ARDOUR::PluginType) 0; - } + return plugin()->get_info()->type; } PluginInsert::PluginControl::PluginControl (PluginInsert* p, const Evoral::Parameter ¶m, boost::shared_ptr list)