another DEBUG_TRACE for mackie control x-thread requests
[ardour.git] / libs / surfaces / mackie / button.h
index 697c6649fd4c11e817b8a17de2065bb420ba0fa0..e9cbdd7b4be517765425e4ffb8080856c8248681 100644 (file)
 #ifndef __ardour_mackie_control_protocol_button_h__
 #define __ardour_mackie_control_protocol_button_h__
 
+#include "ardour/types.h"
+
 #include "controls.h"
 #include "led.h"
 
+namespace ArdourSurface {
+
 namespace Mackie {
 
 class Surface;
@@ -30,20 +34,130 @@ class Surface;
 class Button : public Control
 {
 public:
-       Button (int id, int ordinal, std::string name, Group & group)
-               : Control (id,  ordinal, name, group)
-               , _led  (id, ordinal, name + "_led", group) {}
-       
-       virtual const Led & led() const  { return _led; }
-       
-       virtual type_t type() const { return type_button; };
-
-       static Control* factory (Surface&, int id, int ordinal, const char*, Group&);
-       
+/* These values uniquely identify each possible button that an MCP device may
+   send. Each DeviceInfo object contains its own set of button definitions that
+   define what device ID will be sent for each button, and there is no reason
+   for them to be the same.  */
+
+       enum ID {
+               /* Global Buttons */
+
+               Track,
+               Send,
+               Pan,
+               Plugin,
+               Eq,
+               Dyn,
+               Left,
+               Right,
+               ChannelLeft,
+               ChannelRight,
+               Flip,
+               View,
+               NameValue,
+               TimecodeBeats,
+               F1,
+               F2,
+               F3,
+               F4,
+               F5,
+               F6,
+               F7,
+               F8,
+               MidiTracks,
+               Inputs,
+               AudioTracks,
+               AudioInstruments,
+               Aux,
+               Busses,
+               Outputs,
+               User,
+               Read,
+               Write,
+               Trim,
+               Touch,
+               Latch,
+               Grp,
+               Save,
+               Undo,
+               Cancel,
+               Enter,
+               Marker,
+               Nudge,
+               Loop,
+               Drop,
+               Replace,
+               Click,
+               ClearSolo,
+               Rewind,
+               Ffwd,
+               Stop,
+               Play,
+               Record,
+               CursorUp,
+               CursorDown,
+               CursorLeft,
+               CursorRight,
+               Zoom,
+               Scrub,
+               UserA,
+               UserB,
+
+               FinalGlobalButton,
+
+               /* Global buttons that users should not redefine */
+
+               Shift,
+               Option,
+               Ctrl,
+               CmdAlt,
+
+               /* Strip buttons */
+
+               RecEnable,
+               Solo,
+               Mute,
+               Select,
+               VSelect,
+               FaderTouch,
+
+               /* Master fader */
+
+               MasterFaderTouch,
+       };
+
+
+       Button (Surface& s, ID bid, int did, std::string name, Group & group)
+               : Control (did, name, group)
+               , _surface (s)
+               , _bid (bid)
+               , _led  (did, name + "_led", group)
+               , press_time (0) {}
+
+       MidiByteArray zero() { return _led.zero (); }
+       MidiByteArray set_state (LedState ls) { return _led.set_state (ls); }
+
+       ID bid() const { return _bid; }
+
+       static Control* factory (Surface& surface, Button::ID bid, int id, const std::string&, Group& group);
+       static int name_to_id (const std::string& name);
+       static std::string id_to_name (Button::ID);
+
+       Surface& surface() const { return _surface; }
+
+       void pressed ();
+       void released ();
+
+       int32_t long_press_count ();
+
 private:
+       Surface& _surface;
+       ID  _bid; /* device independent button ID */
        Led _led;
+       ARDOUR::microseconds_t press_time;
 };
 
-}
+} // Mackie namespace
+} // ArdourSurface namespace
 
 #endif