summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-02-21 15:02:29 +0100
committerRobin Gareus <robin@gareus.org>2017-02-21 15:24:20 +0100
commit5db22a33c1ec13a14dd6654bf08b0ecd377ae67d (patch)
tree0d64bffa49a7a585bd49508241f1ae32e25db0b0 /libs
parent1b2a64c391d7f4a81dda85bdbd063fb80329e498 (diff)
Add API allowing plugin preset load to affect automation
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/plugin.h3
-rw-r--r--libs/ardour/ardour/plugin_insert.h2
-rw-r--r--libs/ardour/plugin_insert.cc37
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)