Fix restoring of CC121 configuration
[ardour.git] / libs / surfaces / faderport8 / fp8_strip.h
1 /*
2  * Copyright (C) 2017 Robin Gareus <robin@gareus.org>
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17  */
18
19 #ifndef _ardour_surfaces_fp8strip_h_
20 #define _ardour_surfaces_fp8strip_h_
21
22 #include <stdint.h>
23 #include <boost/shared_ptr.hpp>
24
25 #include "pbd/signals.h"
26 #include "pbd/controllable.h"
27
28 #include "fp8_base.h"
29 #include "fp8_button.h"
30
31 #ifdef FADERPORT16
32 # define N_STRIPS 16
33 #elif defined FADERPORT2
34 # define N_STRIPS 1
35 #else
36 # define N_STRIPS 8
37 #endif
38
39 namespace ARDOUR {
40         class Stripable;
41         class AutomationControl;
42         class PeakMeter;
43         class ReadOnlyControl;
44 }
45
46 namespace ArdourSurface { namespace FP_NAMESPACE {
47
48 class FP8Strip
49 {
50 public:
51         FP8Strip (FP8Base& b, uint8_t id);
52         ~FP8Strip ();
53
54         enum CtrlElement {
55                 BtnSolo,
56                 BtnMute,
57                 BtnSelect,
58                 Fader,
59                 Meter,
60                 Redux,
61                 BarVal,
62                 BarMode
63         };
64
65         static uint8_t midi_ctrl_id (CtrlElement type, uint8_t id);
66
67         FP8ButtonInterface& solo_button () { return _solo; }
68         FP8ButtonInterface& mute_button () { return _mute; }
69         FP8ButtonInterface& selrec_button () { return _selrec; }
70         FP8ButtonInterface& recarm_button () { return *_selrec.button_shift(); }
71         FP8ButtonInterface& select_button () { return *_selrec.button(); }
72
73         void set_select_button_color (uint32_t color) {
74                 if ((color & 0xffffff00) == 0) {
75                         select_button ().set_color (0xffffffff);
76                 } else {
77                         select_button ().set_color (color);
78                 }
79         }
80
81         bool midi_touch (bool t);
82         bool midi_fader (float val);
83
84         void initialize (); // call only when connected, sends midi
85
86         void set_select_cb (boost::function<void ()>&);
87
88         enum DisplayMode {
89                 Stripables,
90                 PluginSelect, // no clock display
91                 PluginParam, // param value
92                 SendDisplay, // param value + select-bar
93         };
94
95         void set_periodic_display_mode (DisplayMode m);
96
97         // convenience function to call all set_XXX_controllable
98         void set_stripable (boost::shared_ptr<ARDOUR::Stripable>, bool panmode);
99         void set_text_line (uint8_t, std::string const&, bool inv = false);
100
101         enum CtrlMask {
102                 CTRL_FADER  = 0x001,
103                 CTRL_MUTE   = 0x002,
104                 CTRL_SOLO   = 0x004,
105                 CTRL_REC    = 0x004,
106                 CTRL_PAN    = 0x008,
107                 CTRL_SELECT = 0x010,
108                 CTRL_TEXT0  = 0x100,
109                 CTRL_TEXT1  = 0x200,
110                 CTRL_TEXT2  = 0x400,
111                 CTRL_TEXT3  = 0x800,
112
113                 CTRL_TEXT01 = 0x300,
114                 CTRL_TEXT   = 0xf00,
115                 CTRL_ALL    = 0xfff,
116         };
117
118         void unset_controllables (int which = CTRL_ALL);
119
120         void set_fader_controllable  (boost::shared_ptr<ARDOUR::AutomationControl>);
121         void set_mute_controllable   (boost::shared_ptr<ARDOUR::AutomationControl>);
122         void set_solo_controllable   (boost::shared_ptr<ARDOUR::AutomationControl>);
123         void set_rec_controllable    (boost::shared_ptr<ARDOUR::AutomationControl>);
124         void set_pan_controllable    (boost::shared_ptr<ARDOUR::AutomationControl>);
125         void set_select_controllable (boost::shared_ptr<ARDOUR::AutomationControl>);
126
127 private:
128         FP8Base&  _base;
129         uint8_t   _id;
130         FP8MomentaryButton _solo;
131         FP8MomentaryButton _mute;
132         FP8ARMSensitiveButton _selrec;
133
134         bool _touching;
135
136         PBD::ScopedConnection _base_connection; // periodic
137         PBD::ScopedConnectionList _button_connections;
138
139         std::string _stripable_name;
140
141         boost::shared_ptr<ARDOUR::AutomationControl> _fader_ctrl;
142         boost::shared_ptr<ARDOUR::AutomationControl> _mute_ctrl;
143         boost::shared_ptr<ARDOUR::AutomationControl> _solo_ctrl;
144         boost::shared_ptr<ARDOUR::AutomationControl> _rec_ctrl;
145         boost::shared_ptr<ARDOUR::AutomationControl> _pan_ctrl;
146         boost::shared_ptr<ARDOUR::AutomationControl> _x_select_ctrl;
147
148         PBD::ScopedConnection _fader_connection;
149         PBD::ScopedConnection _mute_connection;
150         PBD::ScopedConnection _solo_connection;
151         PBD::ScopedConnection _rec_connection;
152         PBD::ScopedConnection _pan_connection;
153         PBD::ScopedConnection _x_select_connection;
154
155         boost::shared_ptr<ARDOUR::PeakMeter> _peak_meter;
156         boost::shared_ptr<ARDOUR::ReadOnlyControl> _redux_ctrl;
157
158         void set_x_select_controllable (boost::shared_ptr<ARDOUR::AutomationControl>);
159         boost::function<void ()> _select_plugin_functor;
160
161         void drop_automation_controls ();
162
163         PBD::Controllable::GroupControlDisposition group_mode () const;
164
165         /* notifications, update view */
166         void notify_fader_changed ();
167         void notify_solo_changed ();
168         void notify_mute_changed ();
169         void notify_rec_changed ();
170         void notify_pan_changed ();
171         void notify_x_select_changed ();
172
173         /* actions, update model */
174         void set_mute (bool);
175         void set_solo (bool);
176         void set_select ();
177         void set_recarm ();
178
179         /* periodic poll, update view */
180         void set_strip_name ();
181         void periodic_update_fader ();
182         void periodic_update_meter ();
183         void periodic_update_timecode (uint32_t);
184         void periodic ();
185
186         /* cache */
187         unsigned short _last_fader;
188         uint8_t _last_meter;
189         uint8_t _last_redux;
190         uint8_t _last_barpos;
191
192         /* display */
193         void set_strip_mode (uint8_t, bool clear = false);
194         void set_bar_mode (uint8_t, bool force = false);
195
196         uint8_t _strip_mode;
197         uint8_t _bar_mode;
198         DisplayMode _displaymode;
199         std::string _last_line[4];
200 };
201
202 } } /* namespace */
203 #endif /* _ardour_surfaces_fp8strip_h_ */