throttle TransportStateChange signal emissions
authorRobin Gareus <robin@gareus.org>
Tue, 10 Mar 2015 09:46:24 +0000 (10:46 +0100)
committerRobin Gareus <robin@gareus.org>
Tue, 10 Mar 2015 09:49:52 +0000 (10:49 +0100)
libs/ardour/ardour/session.h
libs/ardour/session_transport.cc

index 7d2908a18c29ab87a541cdea4ccedd246f5a3a87..b50d502e164837b82dcdc23e415e6e6f26ead47c 100644 (file)
@@ -992,6 +992,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        double                  _transport_speed;
        double                  _default_transport_speed;
        double                  _last_transport_speed;
+       double                  _signalled_varispeed;
        double                  _target_transport_speed;
        CubicInterpolation       interpolation;
 
index 5e01f14bdd5c9301f4b31e7499ef5abc977d0575..b392dabcbf536280c842a7f70b76ba923351d54c 100644 (file)
@@ -1321,7 +1321,28 @@ Session::set_transport_speed (double speed, framepos_t destination_frame, bool a
                }
 
                DEBUG_TRACE (DEBUG::Transport, string_compose ("send TSC3 with speed = %1\n", _transport_speed));
-               TransportStateChange (); /* EMIT SIGNAL */
+
+               /* throttle signal emissions. 
+                * when slaved [_last]_transport_speed
+                * usually changes every cycle (tiny amounts due to DLL).
+                * Emitting a signal every cycle is overkill and unwarranted.
+                *
+                * Using _last_transport_speed is not acceptable,
+                * since it allows for large changes over a long period 
+                * of time. Hence we introduce a dedicated variable to keep track
+                *
+                * The 0.2% dead-zone is somewhat arbitrary. Main use-case
+                * for TransportStateChange() here is the ShuttleControl display.
+                */
+               if (fabsf(_signalled_varispeed - speed) > .002f
+                   // still, signal hard changes to 1.0 and 0.0:
+                   || ( speed == 1.f && _signalled_varispeed != 1.f)
+                   || ( speed == 0.f && _signalled_varispeed != 0.f)
+                  )
+               {
+                       TransportStateChange (); /* EMIT SIGNAL */
+                       _signalled_varispeed = speed;
+               }
        }
 }