summaryrefslogtreecommitdiff
path: root/libs/ardour/automatable.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2014-11-01 23:29:10 -0400
committerDavid Robillard <d@drobilla.net>2014-11-02 02:10:24 -0500
commit8a128b33d38172ae525ac798c53bc105bc4e2c64 (patch)
tree226459f2fec72a9717d12f190d354f72175607dc /libs/ardour/automatable.cc
parent6dfb11c2d08201f1a27818955707590b762f5a40 (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.cc27
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);