Add API allowing plugin preset load to affect automation
authorRobin Gareus <robin@gareus.org>
Tue, 21 Feb 2017 14:02:29 +0000 (15:02 +0100)
committerRobin Gareus <robin@gareus.org>
Tue, 21 Feb 2017 14:24:20 +0000 (15:24 +0100)
libs/ardour/ardour/plugin.h
libs/ardour/ardour/plugin_insert.h
libs/ardour/plugin_insert.cc

index 56d19a0cb4f583e08c425f427433d62a3c77d92c..e4efb2a441011e158f974b566ced706f6d1d6d18 100644 (file)
@@ -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
index 0f533d92005743f894297761df408cc3a18b27bb..2b8d1bc54246cc491f2ac9161b61b34d630563bc 100644 (file)
@@ -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
index bf97a1217efe9d04ee19cc604bc8976deeae9bc3..daae15d3ad320d3258a7f267633e15090d84006e 100644 (file)
@@ -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<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
 {
@@ -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)