diff options
author | David Robillard <d@drobilla.net> | 2014-11-01 23:29:10 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2014-11-02 02:10:24 -0500 |
commit | 8a128b33d38172ae525ac798c53bc105bc4e2c64 (patch) | |
tree | 226459f2fec72a9717d12f190d354f72175607dc /libs/ardour/automatable.cc | |
parent | 6dfb11c2d08201f1a27818955707590b762f5a40 (diff) |
Automation of LV2 plugin properties.
Work towards ParameterDescriptor being used more universally to describe control characteristics.
Diffstat (limited to 'libs/ardour/automatable.cc')
-rw-r--r-- | libs/ardour/automatable.cc | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index 8629722889..466899ce48 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -31,8 +31,10 @@ #include "ardour/midi_track.h" #include "ardour/pan_controllable.h" #include "ardour/pannable.h" +#include "ardour/plugin.h" #include "ardour/plugin_insert.h" #include "ardour/session.h" +#include "ardour/uri_map.h" #include "i18n.h" @@ -146,9 +148,9 @@ Automatable::add_control(boost::shared_ptr<Evoral::Control> ac) } ControlSet::add_control (ac); - _can_automate_list.insert (param); if (al) { + _can_automate_list.insert (param); automation_list_automation_state_changed (param, al->automation_state ()); // sync everything up } } @@ -170,6 +172,8 @@ Automatable::describe_parameter (Evoral::Parameter param) return string_compose("Bender [%1]", int(param.channel()) + 1); } else if (param.type() == MidiChannelPressureAutomation) { return string_compose("Pressure [%1]", int(param.channel()) + 1); + } else if (param.type() == PluginPropertyAutomation) { + return string_compose("Property %1", URIMap::instance().id_to_uri(param.id())); } else { return EventTypeMap::instance().to_symbol(param); } @@ -251,7 +255,7 @@ Automatable::get_automation_xml_state () for (Controls::iterator li = controls().begin(); li != controls().end(); ++li) { boost::shared_ptr<AutomationList> l = boost::dynamic_pointer_cast<AutomationList>(li->second->list()); - if (!l->empty()) { + if (l && !l->empty()) { node->add_child_nocopy (l->get_state ()); } } @@ -394,6 +398,7 @@ Automatable::control_factory(const Evoral::Parameter& param) { boost::shared_ptr<AutomationList> list(new AutomationList(param)); Evoral::Control* control = NULL; + ParameterDescriptor desc(param); if (param.type() >= MidiCCAutomation && param.type() <= MidiChannelPressureAutomation) { MidiTrack* mt = dynamic_cast<MidiTrack*>(this); if (mt) { @@ -405,10 +410,24 @@ Automatable::control_factory(const Evoral::Parameter& param) } else if (param.type() == PluginAutomation) { PluginInsert* pi = dynamic_cast<PluginInsert*>(this); if (pi) { - control = new PluginInsert::PluginControl(pi, param); + pi->plugin(0)->get_parameter_descriptor(param.id(), desc); + control = new PluginInsert::PluginControl(pi, param, desc); } else { warning << "PluginAutomation for non-Plugin" << endl; } + } else if (param.type() == PluginPropertyAutomation) { + PluginInsert* pi = dynamic_cast<PluginInsert*>(this); + if (pi) { + desc = pi->plugin(0)->get_property_descriptor(param.id()); + if (desc.datatype != Variant::VOID) { + if (!Variant::type_is_numeric(desc.datatype)) { + list.reset(); // Can't automate non-numeric data yet + } + control = new PluginInsert::PluginPropertyControl(pi, param, desc, list); + } + } else { + warning << "PluginPropertyAutomation for non-Plugin" << endl; + } } else if (param.type() == GainAutomation) { Amp* amp = dynamic_cast<Amp*>(this); if (amp) { @@ -426,7 +445,7 @@ Automatable::control_factory(const Evoral::Parameter& param) } if (!control) { - control = new AutomationControl(_a_session, param); + control = new AutomationControl(_a_session, param, desc); } control->set_list(list); |