Mackie Control: Need signal from session if group parameters change so strips redispl...
[ardour.git] / libs / surfaces / mackie / button.h
index 97cd1e309febe74685cb45a9e892e5492ca6a540..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,87 +34,130 @@ class Surface;
 class Button : public Control
 {
 public:
-       enum ButtonID {
-               ButtonIo = 0x28,
-               ButtonSends = 0x29,
-               ButtonPan = 0x2a,
-               ButtonPlugin = 0x2b,
-               ButtonEq = 0x2c,
-               ButtonDyn = 0x2d,
-               ButtonLeft = 0x2e,
-               ButtonRight = 0x2f,
-               ButtonChannelLeft = 0x30,
-               ButtonChannelRight = 0x31,
-               ButtonFlip = 0x32,
-               ButtonEdit = 0x33,
-               ButtonNameValue = 0x34,
-               ButtonTimecodeBeats = 0x35,
-               ButtonF1 = 0x36,
-               ButtonF2 = 0x37,
-               ButtonF3 = 0x38,
-               ButtonF4 = 0x39,
-               ButtonF5 = 0x3a,
-               ButtonF6 = 0x3b,
-               ButtonF7 = 0x3c,
-               ButtonF8 = 0x3d,
-               ButtonF9 = 0x3e,
-               ButtonF10 = 0x3f,
-               ButtonF11 = 0x40,
-               ButtonF12 = 0x41,
-               ButtonF13 = 0x42,
-               ButtonF14 = 0x43,
-               ButtonF15 = 0x44,
-               ButtonF16 = 0x45,
-               ButtonShift = 0x46,
-               ButtonOption = 0x47,
-               ButtonControl = 0x48,
-               ButtonCmdAlt = 0x49,
-               ButtonOn = 0x4a,
-               ButtonRecReady = 0x4b,
-               ButtonUndo = 0x4c,
-               ButtonSnapshot = 0x4d,
-               ButtonTouch = 0x4e,
-               ButtonRedo = 0x4f,
-               ButtonMarker = 0x50,
-               ButtonEnter = 0x51,
-               ButtonCancel = 0x52,
-               ButtonMixer = 0x53,
-               ButtonFrmLeft = 0x54,
-               ButtonFrmRight = 0x55,
-               ButtonLoop = 0x56,
-               ButtonPunchIn = 0x57,
-               ButtonPunchOut = 0x58,
-               ButtonHome = 0x59,
-               ButtonEnd = 0x5a,
-               ButtonRewind = 0x5b,
-               ButtonFfwd = 0x5c,
-               ButtonStop = 0x5d,
-               ButtonPlay = 0x5e,
-               ButtonRecord = 0x5f,
-               ButtonCursorUp = 0x60,
-               ButtonCursorDown = 0x61,
-               ButtonCursorLeft = 0x62,
-               ButtonCursorRight = 0x63,
-               ButtonZoom = 0x64,
-               ButtonScrub = 0x65,
-               ButtonUserA = 0x66,
-               ButtonUserB = 0x67,
+/* 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 (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&);
-       
+       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