diff options
author | Robin Gareus <robin@gareus.org> | 2017-02-21 15:02:29 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-02-21 15:24:20 +0100 |
commit | 5db22a33c1ec13a14dd6654bf08b0ecd377ae67d (patch) | |
tree | 0d64bffa49a7a585bd49508241f1ae32e25db0b0 | |
parent | 1b2a64c391d7f4a81dda85bdbd063fb80329e498 (diff) |
Add API allowing plugin preset load to affect automation
-rw-r--r-- | libs/ardour/ardour/plugin.h | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/plugin_insert.h | 2 | ||||
-rw-r--r-- | 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<void> PresetDirty; + /** Emitted for preset-load to set a control-port */ + PBD::Signal2<void, uint32_t, float> 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: * @@ -650,6 +652,23 @@ PluginInsert::bypassable_changed () } void +PluginInsert::preset_load_set_value (uint32_t p, float v) +{ + boost::shared_ptr<AutomationControl> 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 { // TODO optimize: store "unconnected" in a fixed set. @@ -3014,19 +3033,21 @@ PluginInsert::latency_changed () void PluginInsert::start_touch (uint32_t param_id) { - boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id)); - if (ac) { - ac->start_touch (session().audible_frame()); - } + boost::shared_ptr<AutomationControl> 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<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id)); - if (ac) { - ac->stop_touch (true, session().audible_frame()); - } + boost::shared_ptr<AutomationControl> 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) |