mackie: radically shrink down the profile editor
[ardour.git] / libs / surfaces / mackie / controls.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 __mackie_controls_h__
21 #define __mackie_controls_h__
22
23 #include <map>
24 #include <vector>
25 #include <string>
26 #include <stdint.h>
27
28 #include <boost/smart_ptr.hpp>
29
30 #include "pbd/controllable.h"
31 #include "pbd/signals.h"
32
33 #include "mackie_control_exception.h"
34 #include "midi_byte_array.h"
35
36 namespace ARDOUR {
37         class AutomationControl;
38 }
39
40 namespace ArdourSurface {
41
42 namespace Mackie {
43
44 class Strip;
45 class Group;
46 class Surface;
47
48 class Control {
49 public:
50         Control (int id, std::string name, Group& group);
51         virtual ~Control() {}
52
53         int id() const { return _id; }
54         const std::string & name() const  { return _name; }
55         Group & group() const { return _group; }
56
57         bool in_use () const;
58         void set_in_use (bool);
59
60         // Keep track of the timeout so it can be updated with more incoming events
61         sigc::connection in_use_connection;
62
63         virtual MidiByteArray zero() = 0;
64
65         /** If we are doing an in_use timeout for a fader without touch, this
66          *  is its touch button control; otherwise 0.
67          */
68         Control* in_use_touch_control;
69
70         boost::shared_ptr<ARDOUR::AutomationControl> control () const { return normal_ac; }
71         virtual void set_control (boost::shared_ptr<ARDOUR::AutomationControl>);
72
73         float get_value ();
74         void set_value (float val, PBD::Controllable::GroupControlDisposition gcd = PBD::Controllable::UseGroup);
75
76         virtual void start_touch (double when);
77         virtual void stop_touch (bool mark, double when);
78
79   protected:
80         boost::shared_ptr<ARDOUR::AutomationControl> normal_ac;
81
82   private:
83         int _id; /* possibly device-dependent ID */
84         std::string _name;
85         Group& _group;
86         bool _in_use;
87 };
88
89 }
90 }
91
92 std::ostream & operator <<  (std::ostream & os, const ArdourSurface::Mackie::Control & control);
93
94 #endif /* __mackie_controls_h__ */