ardour knob: watch automation
authorRobin Gareus <robin@gareus.org>
Sat, 25 Apr 2015 18:20:03 +0000 (20:20 +0200)
committerRobin Gareus <robin@gareus.org>
Sat, 25 Apr 2015 19:25:29 +0000 (21:25 +0200)
gtk2_ardour/ardour_knob.cc

index bfc3c88057ed5ab90e0f21a2d7ebc9b9d7bd7119..cff2acd4e3eb777c727bb2f257bc2f35f2210021 100644 (file)
@@ -37,6 +37,7 @@
 #include "ardour_knob.h"
 #include "ardour_ui.h"
 #include "global_signals.h"
+#include "timers.h"
 
 #include "canvas/colors.h"
 #include "canvas/utils.h"
@@ -66,6 +67,9 @@ ArdourKnob::ArdourKnob (Element e, Flags flags)
        , _tooltip (this)
 {
        ARDOUR_UI_UTILS::ColorsChanged.connect (sigc::mem_fun (*this, &ArdourKnob::color_handler));
+
+       // watch automation :(
+       Timers::rapid_connect (sigc::mem_fun (*this, &ArdourKnob::controllable_changed));
 }
 
 ArdourKnob::~ArdourKnob()
@@ -451,7 +455,7 @@ ArdourKnob::on_size_allocate (Allocation& alloc)
 void
 ArdourKnob::set_controllable (boost::shared_ptr<Controllable> c)
 {
-    watch_connection.disconnect ();  //stop watching the old controllable
+       watch_connection.disconnect ();  //stop watching the old controllable
 
        if (!c) return;
 
@@ -468,10 +472,16 @@ void
 ArdourKnob::controllable_changed ()
 {
        boost::shared_ptr<PBD::Controllable> c = binding_proxy.get_controllable();
+       if (!c) return;
 
-       _val = c->get_interface();  //% of knob travel
-       _val = min( max(0.0f, _val), 1.0f);  //range check
+       float val = c->get_interface();
+       val = min( max(0.0f, val), 1.0f); // clamp
+
+       if (val == _val) {
+               return;
+       }
 
+       _val = val;
        if (!_tooltip_prefix.empty()) {
                _tooltip.set_tip (_tooltip_prefix + c->get_user_string());
        }