summaryrefslogtreecommitdiff
path: root/libs/ardour/plugin_insert.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/plugin_insert.cc
parent6dfb11c2d08201f1a27818955707590b762f5a40 (diff)
Automation of LV2 plugin properties.
Work towards ParameterDescriptor being used more universally to describe control characteristics.
Diffstat (limited to 'libs/ardour/plugin_insert.cc')
-rw-r--r--libs/ardour/plugin_insert.cc107
1 files changed, 87 insertions, 20 deletions
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc
index 4ad3123e07..3bc2d18b7b 100644
--- a/libs/ardour/plugin_insert.cc
+++ b/libs/ardour/plugin_insert.cc
@@ -256,7 +256,17 @@ PluginInsert::create_automatable_parameters ()
param.set_range (desc.lower, desc.upper, _plugins.front()->default_value(i->id()), desc.toggled);
can_automate (param);
boost::shared_ptr<AutomationList> list(new AutomationList(param));
- add_control (boost::shared_ptr<AutomationControl> (new PluginControl(this, param, list)));
+ add_control (boost::shared_ptr<AutomationControl> (new PluginControl(this, param, desc, list)));
+ } else if (i->type() == PluginPropertyAutomation) {
+ Evoral::Parameter param(*i);
+ const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
+ if (desc.datatype != Variant::VOID) {
+ boost::shared_ptr<AutomationList> list;
+ if (Variant::type_is_numeric(desc.datatype)) {
+ list = boost::shared_ptr<AutomationList>(new AutomationList(param));
+ }
+ add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
+ }
}
}
}
@@ -368,7 +378,7 @@ PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t of
boost::shared_ptr<AutomationControl> c
= boost::dynamic_pointer_cast<AutomationControl>(li->second);
- if (c->parameter().type() == PluginAutomation && c->automation_playback()) {
+ if (c->list() && c->automation_playback()) {
bool valid;
const float val = c->list()->rt_safe_eval (now, valid);
@@ -1167,11 +1177,15 @@ PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
string
PluginInsert::describe_parameter (Evoral::Parameter param)
{
- if (param.type() != PluginAutomation) {
- return Automatable::describe_parameter(param);
+ if (param.type() == PluginAutomation) {
+ return _plugins[0]->describe_parameter (param);
+ } else if (param.type() == PluginPropertyAutomation) {
+ boost::shared_ptr<AutomationControl> c(automation_control(param));
+ if (c && !c->desc().label.empty()) {
+ return c->desc().label;
+ }
}
-
- return _plugins[0]->describe_parameter (param);
+ return Automatable::describe_parameter(param);
}
ARDOUR::framecnt_t
@@ -1190,19 +1204,16 @@ PluginInsert::type ()
return plugin()->get_info()->type;
}
-PluginInsert::PluginControl::PluginControl (PluginInsert* p, const Evoral::Parameter &param, boost::shared_ptr<AutomationList> list)
- : AutomationControl (p->session(), param, list, p->describe_parameter(param))
+PluginInsert::PluginControl::PluginControl (PluginInsert* p,
+ const Evoral::Parameter& param,
+ const ParameterDescriptor& desc,
+ boost::shared_ptr<AutomationList> list)
+ : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
, _plugin (p)
{
- ParameterDescriptor desc;
- boost::shared_ptr<Plugin> plugin = p->plugin (0);
-
- alist()->reset_default (plugin->default_value (param.id()));
-
- plugin->get_parameter_descriptor (param.id(), desc);
- _logarithmic = desc.logarithmic;
- _sr_dependent = desc.sr_dependent;
- _toggled = desc.toggled;
+ if (alist()) {
+ alist()->reset_default (desc.normal);
+ }
if (desc.toggled) {
set_flags(Controllable::Toggle);
@@ -1232,7 +1243,7 @@ PluginInsert::PluginControl::internal_to_interface (double val) const
{
val = Controllable::internal_to_interface(val);
- if (_logarithmic) {
+ if (_desc.logarithmic) {
if (val > 0) {
val = pow (val, 1/1.5);
} else {
@@ -1246,9 +1257,9 @@ PluginInsert::PluginControl::internal_to_interface (double val) const
double
PluginInsert::PluginControl::interface_to_internal (double val) const
{
- if (_logarithmic) {
+ if (_desc.logarithmic) {
if (val <= 0) {
- val= 0;
+ val = 0;
} else {
val = pow (val, 1.5);
}
@@ -1279,6 +1290,62 @@ PluginInsert::PluginControl::get_value () const
return _plugin->get_parameter (_list->parameter());
}
+PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* p,
+ const Evoral::Parameter& param,
+ const ParameterDescriptor& desc,
+ boost::shared_ptr<AutomationList> list)
+ : AutomationControl (p->session(), param, desc, list)
+ , _plugin (p)
+{
+ if (alist()) {
+ alist()->set_yrange (desc.lower, desc.upper);
+ alist()->reset_default (desc.normal);
+ }
+
+ if (desc.toggled) {
+ set_flags(Controllable::Toggle);
+ }
+}
+
+void
+PluginInsert::PluginPropertyControl::set_value (double user_val)
+{
+ /* Old numeric set_value(), coerce to appropriate datatype if possible.
+ This is lossy, but better than nothing until Ardour's automation system
+ can handle various datatypes all the way down. */
+ const Variant value(_desc.datatype, user_val);
+ if (value.type() == Variant::VOID) {
+ error << "set_value(double) called for non-numeric property" << endmsg;
+ return;
+ }
+
+ for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
+ (*i)->set_property(_list->parameter().id(), value);
+ }
+
+ _value = value;
+ AutomationControl::set_value(user_val);
+}
+
+XMLNode&
+PluginInsert::PluginPropertyControl::get_state ()
+{
+ stringstream ss;
+
+ XMLNode& node (AutomationControl::get_state());
+ ss << parameter().id();
+ node.add_property (X_("property"), ss.str());
+ node.remove_property (X_("value"));
+
+ return node;
+}
+
+double
+PluginInsert::PluginPropertyControl::get_value () const
+{
+ return _value.to_double();
+}
+
boost::shared_ptr<Plugin>
PluginInsert::get_impulse_analysis_plugin()
{