From 5db22a33c1ec13a14dd6654bf08b0ecd377ae67d Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 21 Feb 2017 15:02:29 +0100 Subject: Add API allowing plugin preset load to affect automation --- libs/ardour/ardour/plugin.h | 3 +++ libs/ardour/ardour/plugin_insert.h | 2 ++ libs/ardour/plugin_insert.cc | 37 +++++++++++++++++++++++++++++-------- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index 56d19a0cb4..e4efb2a441 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -256,6 +256,9 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent */ PBD::Signal0 PresetDirty; + /** Emitted for preset-load to set a control-port */ + PBD::Signal2 PresetPortSetValue; + virtual bool has_editor () const = 0; /** Emitted when a parameter is altered by something outside of our diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h index 0f533d9200..2b8d1bc542 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -374,6 +374,8 @@ class LIBARDOUR_API PluginInsert : public Processor void latency_changed (); bool _latency_changed; uint32_t _bypass_port; + + void preset_load_set_value (uint32_t, float); }; } // namespace ARDOUR diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index bf97a1217e..daae15d3ad 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -490,7 +490,9 @@ PluginInsert::create_automatable_parameters () ac->Changed.connect_same_thread (*this, boost::bind (&PluginInsert::enable_changed, this)); } } + plugin->PresetPortSetValue.connect_same_thread (*this, boost::bind (&PluginInsert::preset_load_set_value, this, _1, _2)); } + /** Called when something outside of this host has modified a plugin * parameter. Responsible for propagating the change to two places: * @@ -649,6 +651,23 @@ PluginInsert::bypassable_changed () BypassableChanged (); } +void +PluginInsert::preset_load_set_value (uint32_t p, float v) +{ + boost::shared_ptr ac = automation_control (Evoral::Parameter(PluginAutomation, 0, p)); + if (!ac) { + return; + } + + if (ac->automation_state() & Play) { + return; + } + + start_touch (p); + ac->set_value (v, Controllable::NoGroup); + end_touch (p); +} + void PluginInsert::inplace_silence_unconnected (BufferSet& bufs, const PinMappings& out_map, framecnt_t nframes, framecnt_t offset) const { @@ -3014,19 +3033,21 @@ PluginInsert::latency_changed () void PluginInsert::start_touch (uint32_t param_id) { - boost::shared_ptr ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id)); - if (ac) { - ac->start_touch (session().audible_frame()); - } + boost::shared_ptr ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id)); + if (ac) { + // ToDo subtract _plugin_signal_latency from audible_frame() when rolling, assert > 0 + ac->start_touch (session().audible_frame()); + } } void PluginInsert::end_touch (uint32_t param_id) { - boost::shared_ptr ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id)); - if (ac) { - ac->stop_touch (true, session().audible_frame()); - } + boost::shared_ptr ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id)); + if (ac) { + // ToDo subtract _plugin_signal_latency from audible_frame() when rolling, assert > 0 + ac->stop_touch (true, session().audible_frame()); + } } std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m) -- cgit v1.2.3