summaryrefslogtreecommitdiff
path: root/libs/surfaces/mackie/mackie_jog_wheel.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/surfaces/mackie/mackie_jog_wheel.h')
-rw-r--r--libs/surfaces/mackie/mackie_jog_wheel.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/libs/surfaces/mackie/mackie_jog_wheel.h b/libs/surfaces/mackie/mackie_jog_wheel.h
new file mode 100644
index 0000000000..c22b75bd1b
--- /dev/null
+++ b/libs/surfaces/mackie/mackie_jog_wheel.h
@@ -0,0 +1,102 @@
+#ifndef mackie_jog_wheel
+#define mackie_jog_wheel
+
+#include "timer.h"
+
+#include <stack>
+#include <deque>
+#include <queue>
+
+class MackieControlProtocol;
+
+namespace Mackie
+{
+
+class SurfacePort;
+class Control;
+class ControlState;
+
+/**
+ A jog wheel can be used to control many things. This
+ handles all of the states and state transitions.
+
+ Mainly it exists to avoid putting a bunch of messy
+ stuff in MackieControlProtocol.
+
+ But it doesn't really know who it is, with stacks, queues and various
+ boolean state variables.
+*/
+class JogWheel
+{
+public:
+ enum State { scroll, zoom, speed, scrub, shuttle, select };
+
+ JogWheel( MackieControlProtocol & mcp );
+
+ /// As the wheel turns...
+ void jog_event( SurfacePort & port, Control & control, const ControlState & state );
+
+ // These are for incoming button presses that change the internal state
+ // but they're not actually used at the moment.
+ void zoom_event( SurfacePort & port, Control & control, const ControlState & state );
+ void scrub_event( SurfacePort & port, Control & control, const ControlState & state );
+ void speed_event( SurfacePort & port, Control & control, const ControlState & state );
+ void scroll_event( SurfacePort & port, Control & control, const ControlState & state );
+
+ /// Return the current jog wheel mode, which defaults to Scroll
+ State jog_wheel_state() const;
+
+ /// The current transport speed for ffwd and rew. Can be
+ /// set by wheel when they're pressed.
+ float transport_speed() const { return _transport_speed; }
+
+ /// one of -1,0,1
+ int transport_direction() const { return _transport_direction; }
+ void transport_direction( int rhs ) { _transport_direction = rhs; }
+
+ void push( State state );
+ void pop();
+
+ /// Turn zoom mode on and off
+ void zoom_state_toggle();
+
+ /**
+ Cycle scrub -> shuttle -> previous
+ */
+ State scrub_state_cycle();
+
+ /// Check to see when the last scrub event was
+ /// And stop scrubbing if it was too long ago.
+ /// Intended to be called from a periodic timer of
+ /// some kind.
+ void check_scrubbing();
+
+protected:
+ void add_scrub_interval( unsigned long elapsed );
+ float average_scrub_interval();
+ float std_dev_scrub_interval();
+
+private:
+ MackieControlProtocol & _mcp;
+
+ // transport speed for ffwd and rew, controller by jog
+ float _transport_speed;
+ int _transport_direction;
+
+ /// Speed for shuttle
+ float _shuttle_speed;
+
+ /// a stack for keeping track of states
+ std::stack<State> _jog_wheel_states;
+
+ /// So we know how fast to set the transport speed while scrubbing
+ Timer _scrub_timer;
+
+ /// to keep track of what the current scrub rate is
+ /// so we can calculate a moving average
+ std::deque<unsigned long> _scrub_intervals;
+};
+
+}
+
+#endif