OSC: Add /group/list so surface can get a list of groups
[ardour.git] / libs / surfaces / us2400 / button.h
1 /*
2         Copyright (C) 2006,2007 John Anderson
3         Copyright (C) 2012 Paul Davis
4
5         This program is free software; you can redistribute it and/or modify
6         it under the terms of the GNU General Public License as published by
7         the Free Software Foundation; either version 2 of the License, or
8         (at your option) any later version.
9
10         This program is distributed in the hope that it will be useful,
11         but WITHOUT ANY WARRANTY; without even the implied warranty of
12         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13         GNU General Public License for more details.
14
15         You should have received a copy of the GNU General Public License
16         along with this program; if not, write to the Free Software
17         Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 #ifndef __ardour_us2400_control_protocol_button_h__
21 #define __ardour_us2400_control_protocol_button_h__
22
23 #include "ardour/types.h"
24
25 #include "controls.h"
26 #include "led.h"
27
28 namespace ArdourSurface {
29
30 namespace US2400 {
31
32 class Surface;
33
34 class Button : public Control
35 {
36 public:
37 /* These values uniquely identify each possible button that an MCP device may
38    send. Each DeviceInfo object contains its own set of button definitions that
39    define what device ID will be sent for each button, and there is no reason
40    for them to be the same.  */
41
42         enum ID {
43                 /* Global Buttons */
44
45                 Scrub,
46                 F1,
47                 F2,
48                 F3,
49                 F4,
50                 F5,
51                 F6,
52                 Rewind,
53                 Ffwd,
54                 Stop,
55                 Play,
56                 Record,
57                 Left,
58                 Right,
59                 Flip,
60                 MstrSelect,
61
62                 FinalGlobalButton,
63
64
65                 /* Global buttons that users should not redefine */
66
67                 Drop,
68                 Send,
69                 Pan,
70                 ClearSolo,
71                 Shift,
72                 Option,
73                 Ctrl,
74                 CmdAlt,
75
76                 /* Strip buttons */
77
78                 Solo,
79                 Mute,
80                 Select,
81                 FaderTouch,
82
83                 /* Master fader */
84
85                 MasterFaderTouch,
86         };
87
88
89         Button (Surface& s, ID bid, int did, std::string name, Group & group)
90                 : Control (did, name, group)
91                 , _surface (s)
92                 , _bid (bid)
93                 , _led  (did, name + "_led", group)
94                 , press_time (0) {}
95
96         MidiByteArray zero() { return _led.zero (); }
97         MidiByteArray set_state (LedState ls) { return _led.set_state (ls); }
98
99         ID bid() const { return _bid; }
100
101         static Control* factory (Surface& surface, Button::ID bid, int id, const std::string&, Group& group);
102         static int name_to_id (const std::string& name);
103         static std::string id_to_name (Button::ID);
104
105         Surface& surface() const { return _surface; }
106
107         void mark_dirty() { _led.mark_dirty(); }
108
109         void pressed ();
110         void released ();
111
112         int32_t long_press_count ();
113
114 private:
115         Surface& _surface;
116         ID  _bid; /* device independent button ID */
117         Led _led;
118         ARDOUR::microseconds_t press_time;
119 };
120
121 } // US2400 namespace
122 } // ArdourSurface namespace
123
124 #endif