remove a bunch of code that will no longer be used
[ardour.git] / libs / surfaces / mackie / mackie_control_protocol.h
1 /*
2     Copyright (C) 2006,2007 John Anderson
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (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., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 #ifndef ardour_mackie_control_protocol_h
20 #define ardour_mackie_control_protocol_h
21
22 #include <vector>
23 #include <map>
24 #include <list>
25 #include <set>
26
27 #include <sys/time.h>
28 #include <pthread.h>
29 #include <boost/smart_ptr.hpp>
30
31 #define ABSTRACT_UI_EXPORTS
32 #include "pbd/abstract_ui.h"
33 #include "midi++/types.h"
34 #include "ardour/types.h"
35 #include "control_protocol/control_protocol.h"
36
37 #include "types.h"
38 #include "midi_byte_array.h"
39 #include "controls.h"
40 #include "jog_wheel.h"
41 #include "timer.h"
42 #include "device_info.h"
43 #include "device_profile.h"
44
45 namespace ARDOUR {
46         class AutomationControl;
47         class Port;
48 }
49
50 namespace MIDI {
51         class Port;
52 }
53
54 namespace ArdourSurface {
55
56 namespace Mackie {
57         class Surface;
58         class Control;
59         class SurfacePort;
60         class Button;
61         class Strip;
62 }
63
64 gboolean ipmidi_input_handler (GIOChannel*, GIOCondition condition, void *data);
65
66 struct MackieControlUIRequest : public BaseUI::BaseRequestObject {
67 public:
68         MackieControlUIRequest () {}
69         ~MackieControlUIRequest () {}
70 };
71
72 class MackieControlProtocol
73         : public ARDOUR::ControlProtocol
74         , public AbstractUI<MackieControlUIRequest>
75 {
76   public:
77         static const int MODIFIER_OPTION;
78         static const int MODIFIER_CONTROL;
79         static const int MODIFIER_SHIFT;
80         static const int MODIFIER_CMDALT;
81         static const int MODIFIER_ZOOM;
82         static const int MODIFIER_SCRUB;
83         static const int MODIFIER_MARKER;
84         static const int MODIFIER_NUDGE;
85         static const int MAIN_MODIFIER_MASK;
86
87         enum ViewMode {
88                 Mixer,
89                 AudioTracks,
90                 MidiTracks,
91                 Busses,
92                 Auxes,
93                 Selected,
94                 Hidden,
95                 Plugins,
96         };
97
98         enum SubViewMode {
99                 None,
100                 EQ,
101                 Dynamics,
102                 Sends,
103                 TrackView,
104         };
105
106         enum FlipMode {
107                 Normal, /* fader controls primary, vpot controls secondary */
108                 Mirror, /* fader + vpot control secondary */
109                 Swap,   /* fader controls secondary, vpot controls primary */
110                 Zero,   /* fader controls primary, but doesn't move, vpot controls secondary */
111         };
112
113         MackieControlProtocol(ARDOUR::Session &);
114         virtual ~MackieControlProtocol();
115
116         static MackieControlProtocol* instance() { return _instance; }
117
118         const Mackie::DeviceInfo& device_info() const { return _device_info; }
119         Mackie::DeviceProfile& device_profile() { return _device_profile; }
120
121         PBD::Signal0<void> DeviceChanged;
122         PBD::Signal1<void,boost::shared_ptr<Mackie::Surface> > ConnectionChange;
123
124         void device_ready ();
125
126         int set_active (bool yn);
127         int  set_device (const std::string&, bool force);
128         void set_profile (const std::string&);
129
130         FlipMode flip_mode () const { return _flip_mode; }
131         ViewMode view_mode () const { return _view_mode; }
132         SubViewMode subview_mode () const { return _subview_mode; }
133         static bool subview_mode_would_be_ok (SubViewMode, boost::shared_ptr<ARDOUR::Stripable>);
134         boost::shared_ptr<ARDOUR::Stripable> subview_stripable() const;
135         bool zoom_mode () const { return modifier_state() & MODIFIER_ZOOM; }
136         bool     metering_active () const { return _metering_active; }
137
138         bool is_track (boost::shared_ptr<ARDOUR::Stripable>) const;
139         bool is_audio_track (boost::shared_ptr<ARDOUR::Stripable>) const;
140         bool is_midi_track (boost::shared_ptr<ARDOUR::Stripable>) const;
141         bool selected (boost::shared_ptr<ARDOUR::Stripable>) const;
142         bool is_hidden (boost::shared_ptr<ARDOUR::Stripable>) const;
143         bool is_mapped (boost::shared_ptr<ARDOUR::Stripable>) const;
144         boost::shared_ptr<ARDOUR::Stripable> first_selected_stripable () const;
145         void update_selected (boost::shared_ptr<ARDOUR::Stripable>, bool selected);
146
147         void check_fader_automation_state ();
148         void update_fader_automation_state ();
149         void set_automation_state (ARDOUR::AutoState);
150
151         void set_view_mode (ViewMode);
152         int set_subview_mode (SubViewMode, boost::shared_ptr<ARDOUR::Stripable>);
153         void set_flip_mode (FlipMode);
154         void display_view_mode ();
155
156         XMLNode& get_state ();
157         int set_state (const XMLNode&, int version);
158
159         /* Note: because Mackie control is inherently a duplex protocol,
160            we do not implement get/set_feedback() since this aspect of
161            support for the protocol is not optional.
162         */
163
164         static bool probe();
165         static void* request_factory (uint32_t);
166
167         mutable Glib::Threads::Mutex surfaces_lock;
168         typedef std::list<boost::shared_ptr<Mackie::Surface> > Surfaces;
169         Surfaces surfaces;
170
171         boost::shared_ptr<Mackie::Surface> get_surface_by_raw_pointer (void*) const;
172         boost::shared_ptr<Mackie::Surface> nth_surface (uint32_t) const;
173
174         uint32_t global_index (Mackie::Strip&);
175
176         std::list<boost::shared_ptr<ARDOUR::Bundle> > bundles ();
177
178         void set_master_on_surface_strip (uint32_t surface, uint32_t strip);
179         void set_monitor_on_surface_strip (uint32_t surface, uint32_t strip);
180
181         uint32_t n_strips (bool with_locked_strips = true) const;
182
183         bool has_editor () const { return true; }
184         void* get_gui () const;
185         void tear_down_gui ();
186
187         void handle_button_event (Mackie::Surface&, Mackie::Button& button, Mackie::ButtonState);
188
189         void notify_subview_stripable_deleted ();
190         void notify_stripable_removed ();
191         void notify_routes_added (ARDOUR::RouteList &);
192         void notify_vca_added (ARDOUR::VCAList &);
193
194         void notify_presentation_info_changed();
195
196         void recalibrate_faders ();
197         void toggle_backlight ();
198         void set_touch_sensitivity (int);
199
200         /// rebuild the current bank. Called on route or vca added/removed and
201         /// presentation info changed.
202         void refresh_current_bank();
203
204         // button-related signals
205         void notify_record_state_changed();
206         void notify_transport_state_changed();
207         void notify_loop_state_changed();
208         void notify_metering_state_changed();
209         // mainly to pick up punch-in and punch-out
210         void notify_parameter_changed(std::string const &);
211         void notify_solo_active_changed(bool);
212
213         /// Turn timecode on and beats off, or vice versa, depending
214         /// on state of _timecode_type
215         void update_timecode_beats_led();
216
217         /// this is called to generate the midi to send in response to a button press.
218         void update_led(Mackie::Surface&, Mackie::Button & button, Mackie::LedState);
219
220         void update_global_button (int id, Mackie::LedState);
221         void update_global_led (int id, Mackie::LedState);
222
223         ARDOUR::Session & get_session() { return *session; }
224         framepos_t transport_frame() const;
225
226         int modifier_state() const { return _modifier_state; }
227         int main_modifier_state() const { return _modifier_state & MAIN_MODIFIER_MASK; }
228
229         typedef std::list<boost::shared_ptr<ARDOUR::AutomationControl> > ControlList;
230
231         void add_down_button (ARDOUR::AutomationType, int surface, int strip);
232         void remove_down_button (ARDOUR::AutomationType, int surface, int strip);
233         ControlList down_controls (ARDOUR::AutomationType);
234
235         void add_down_select_button (int surface, int strip);
236         void remove_down_select_button (int surface, int strip);
237         void select_range ();
238
239         int16_t ipmidi_base() const { return _ipmidi_base; }
240         void    set_ipmidi_base (int16_t);
241
242         void ping_devices ();
243
244   protected:
245         // shut down the surface
246         void close();
247
248         // This sets up the notifications and sets the
249         // controls to the correct values
250         void update_surfaces();
251
252         // connects global (not strip) signals from the Session to here
253         // so the surface can be notified of changes from the other UIs.
254         void connect_session_signals();
255
256         // set all controls to their zero position
257         void zero_all();
258
259         /**
260            Fetch the set of Stripables to be considered for control by the
261            surface. Excluding master, hidden and control routes, and inactive routes
262         */
263         typedef std::vector<boost::shared_ptr<ARDOUR::Stripable> > Sorted;
264         Sorted get_sorted_stripables();
265
266         // bank switching
267         int switch_banks (uint32_t first_remote_id, bool force = false);
268         void prev_track ();
269         void next_track ();
270
271         // also called from poll_automation to update timecode display
272         void update_timecode_display();
273
274         std::string format_bbt_timecode (ARDOUR::framepos_t now_frame);
275         std::string format_timecode_timecode (ARDOUR::framepos_t now_frame);
276
277         void do_request (MackieControlUIRequest*);
278         int stop ();
279
280         void thread_init ();
281
282         bool stripable_is_locked_to_strip (boost::shared_ptr<ARDOUR::Stripable>) const;
283
284   private:
285
286         struct ButtonHandlers {
287             Mackie::LedState (MackieControlProtocol::*press) (Mackie::Button&);
288             Mackie::LedState (MackieControlProtocol::*release) (Mackie::Button&);
289
290             ButtonHandlers (Mackie::LedState (MackieControlProtocol::*p) (Mackie::Button&),
291                             Mackie::LedState (MackieControlProtocol::*r) (Mackie::Button&))
292             : press (p)
293             , release (r) {}
294         };
295
296         typedef std::map<Mackie::Button::ID,ButtonHandlers> ButtonMap;
297
298         static MackieControlProtocol* _instance;
299
300         bool profile_exists (std::string const&) const;
301
302         Mackie::DeviceInfo       _device_info;
303         Mackie::DeviceProfile    _device_profile;
304         sigc::connection          periodic_connection;
305         sigc::connection          redisplay_connection;
306         sigc::connection          hui_connection;
307         uint32_t                 _current_initial_bank;
308         PBD::ScopedConnectionList audio_engine_connections;
309         PBD::ScopedConnectionList session_connections;
310         PBD::ScopedConnectionList stripable_connections;
311         PBD::ScopedConnectionList subview_stripable_connections;
312         PBD::ScopedConnectionList gui_connections;
313         PBD::ScopedConnectionList fader_automation_connections;
314         // timer for two quick marker left presses
315         Mackie::Timer            _frm_left_last;
316         // last written timecode string
317         std::string              _timecode_last;
318         framepos_t                               _frame_last;
319         // Which timecode are we displaying? BBT or Timecode
320         ARDOUR::AnyTime::Type    _timecode_type;
321         // Bundle to represent our input ports
322         boost::shared_ptr<ARDOUR::Bundle> _input_bundle;
323         // Bundle to represent our output ports
324         boost::shared_ptr<ARDOUR::Bundle> _output_bundle;
325         void*                    _gui;
326         bool                     _scrub_mode;
327         FlipMode                 _flip_mode;
328         ViewMode                 _view_mode;
329         SubViewMode              _subview_mode;
330         boost::shared_ptr<ARDOUR::Stripable> _subview_stripable;
331         int                      _current_selected_track;
332         int                      _modifier_state;
333         ButtonMap                 button_map;
334         int16_t                  _ipmidi_base;
335         bool                      needs_ipmidi_restart;
336         bool                     _metering_active;
337         bool                     _initialized;
338         typedef std::vector<boost::weak_ptr<ARDOUR::Stripable> > Selection;
339         Selection                _last_selected_stripables;
340         XMLNode*                 configuration_state;
341         int                      state_version;
342         int                      _last_bank[9];
343         bool                     marker_modifier_consumed_by_button;
344         bool                     nudge_modifier_consumed_by_button;
345
346         boost::shared_ptr<ArdourSurface::Mackie::Surface>       _master_surface;
347
348         struct ipMIDIHandler {
349                 MackieControlProtocol* mcp;
350                 MIDI::Port* port;
351         };
352         friend struct ipMIDIHandler; /* is this necessary */
353         friend gboolean ArdourSurface::ipmidi_input_handler (GIOChannel*, GIOCondition condition, void *data);
354
355         int create_surfaces ();
356         bool periodic();
357         bool redisplay();
358         bool redisplay_subview_mode ();
359         bool hui_heartbeat ();
360         void build_gui ();
361         bool midi_input_handler (Glib::IOCondition ioc, MIDI::Port* port);
362         void clear_ports ();
363         void clear_surfaces ();
364         void force_special_stripable_to_strip (boost::shared_ptr<ARDOUR::Stripable> r, uint32_t surface, uint32_t strip_number);
365         void build_button_map ();
366         void gui_track_selection_changed (ARDOUR::StripableNotificationListPtr, bool save_list);
367         void _gui_track_selection_changed (ARDOUR::StripableNotificationList*, bool save_list, bool gui_did_change);
368         int ipmidi_restart ();
369         void initialize ();
370         int set_device_info (const std::string& device_name);
371         void update_configuration_state ();
372
373         /* MIDI port connection management */
374
375         PBD::ScopedConnection port_connection;
376         void connection_handler (boost::weak_ptr<ARDOUR::Port>, std::string name1, boost::weak_ptr<ARDOUR::Port>, std::string name2, bool);
377
378         /* BUTTON HANDLING */
379
380         typedef std::set<uint32_t> DownButtonList;
381         typedef std::map<ARDOUR::AutomationType,DownButtonList> DownButtonMap;
382         DownButtonMap  _down_buttons;
383         DownButtonList _down_select_buttons;
384
385         void pull_stripable_range (DownButtonList&, ARDOUR::StripableList&);
386
387         /* implemented button handlers */
388         Mackie::LedState stop_press(Mackie::Button &);
389         Mackie::LedState stop_release(Mackie::Button &);
390         Mackie::LedState play_press(Mackie::Button &);
391         Mackie::LedState play_release(Mackie::Button &);
392         Mackie::LedState record_press(Mackie::Button &);
393         Mackie::LedState record_release(Mackie::Button &);
394         Mackie::LedState loop_press(Mackie::Button &);
395         Mackie::LedState loop_release(Mackie::Button &);
396         Mackie::LedState rewind_press(Mackie::Button & button);
397         Mackie::LedState rewind_release(Mackie::Button & button);
398         Mackie::LedState ffwd_press(Mackie::Button & button);
399         Mackie::LedState ffwd_release(Mackie::Button & button);
400         Mackie::LedState cursor_up_press (Mackie::Button &);
401         Mackie::LedState cursor_up_release (Mackie::Button &);
402         Mackie::LedState cursor_down_press (Mackie::Button &);
403         Mackie::LedState cursor_down_release (Mackie::Button &);
404         Mackie::LedState cursor_left_press (Mackie::Button &);
405         Mackie::LedState cursor_left_release (Mackie::Button &);
406         Mackie::LedState cursor_right_press (Mackie::Button &);
407         Mackie::LedState cursor_right_release (Mackie::Button &);
408         Mackie::LedState left_press(Mackie::Button &);
409         Mackie::LedState left_release(Mackie::Button &);
410         Mackie::LedState right_press(Mackie::Button &);
411         Mackie::LedState right_release(Mackie::Button &);
412         Mackie::LedState channel_left_press(Mackie::Button &);
413         Mackie::LedState channel_left_release(Mackie::Button &);
414         Mackie::LedState channel_right_press(Mackie::Button &);
415         Mackie::LedState channel_right_release(Mackie::Button &);
416         Mackie::LedState marker_press(Mackie::Button &);
417         Mackie::LedState marker_release(Mackie::Button &);
418         Mackie::LedState save_press(Mackie::Button &);
419         Mackie::LedState save_release(Mackie::Button &);
420         Mackie::LedState timecode_beats_press(Mackie::Button &);
421         Mackie::LedState timecode_beats_release(Mackie::Button &);
422         Mackie::LedState zoom_press(Mackie::Button &);
423         Mackie::LedState zoom_release(Mackie::Button &);
424         Mackie::LedState scrub_press(Mackie::Button &);
425         Mackie::LedState scrub_release(Mackie::Button &);
426         Mackie::LedState undo_press (Mackie::Button &);
427         Mackie::LedState undo_release (Mackie::Button &);
428         Mackie::LedState shift_press (Mackie::Button &);
429         Mackie::LedState shift_release (Mackie::Button &);
430         Mackie::LedState option_press (Mackie::Button &);
431         Mackie::LedState option_release (Mackie::Button &);
432         Mackie::LedState control_press (Mackie::Button &);
433         Mackie::LedState control_release (Mackie::Button &);
434         Mackie::LedState cmd_alt_press (Mackie::Button &);
435         Mackie::LedState cmd_alt_release (Mackie::Button &);
436
437         Mackie::LedState pan_press (Mackie::Button &);
438         Mackie::LedState pan_release (Mackie::Button &);
439         Mackie::LedState plugin_press (Mackie::Button &);
440         Mackie::LedState plugin_release (Mackie::Button &);
441         Mackie::LedState eq_press (Mackie::Button &);
442         Mackie::LedState eq_release (Mackie::Button &);
443         Mackie::LedState dyn_press (Mackie::Button &);
444         Mackie::LedState dyn_release (Mackie::Button &);
445         Mackie::LedState flip_press (Mackie::Button &);
446         Mackie::LedState flip_release (Mackie::Button &);
447         Mackie::LedState name_value_press (Mackie::Button &);
448         Mackie::LedState name_value_release (Mackie::Button &);
449         Mackie::LedState F1_press (Mackie::Button &);
450         Mackie::LedState F1_release (Mackie::Button &);
451         Mackie::LedState F2_press (Mackie::Button &);
452         Mackie::LedState F2_release (Mackie::Button &);
453         Mackie::LedState F3_press (Mackie::Button &);
454         Mackie::LedState F3_release (Mackie::Button &);
455         Mackie::LedState F4_press (Mackie::Button &);
456         Mackie::LedState F4_release (Mackie::Button &);
457         Mackie::LedState F5_press (Mackie::Button &);
458         Mackie::LedState F5_release (Mackie::Button &);
459         Mackie::LedState F6_press (Mackie::Button &);
460         Mackie::LedState F6_release (Mackie::Button &);
461         Mackie::LedState F7_press (Mackie::Button &);
462         Mackie::LedState F7_release (Mackie::Button &);
463         Mackie::LedState F8_press (Mackie::Button &);
464         Mackie::LedState F8_release (Mackie::Button &);
465         Mackie::LedState touch_press (Mackie::Button &);
466         Mackie::LedState touch_release (Mackie::Button &);
467         Mackie::LedState enter_press (Mackie::Button &);
468         Mackie::LedState enter_release (Mackie::Button &);
469         Mackie::LedState cancel_press (Mackie::Button &);
470         Mackie::LedState cancel_release (Mackie::Button &);
471         Mackie::LedState user_a_press (Mackie::Button &);
472         Mackie::LedState user_a_release (Mackie::Button &);
473         Mackie::LedState user_b_press (Mackie::Button &);
474         Mackie::LedState user_b_release (Mackie::Button &);
475         Mackie::LedState fader_touch_press (Mackie::Button &);
476         Mackie::LedState fader_touch_release (Mackie::Button &);
477         Mackie::LedState master_fader_touch_press (Mackie::Button &);
478         Mackie::LedState master_fader_touch_release (Mackie::Button &);
479
480         Mackie::LedState read_press (Mackie::Button&);
481         Mackie::LedState read_release (Mackie::Button&);
482         Mackie::LedState write_press (Mackie::Button&);
483         Mackie::LedState write_release (Mackie::Button&);
484         Mackie::LedState clearsolo_press (Mackie::Button&);
485         Mackie::LedState clearsolo_release (Mackie::Button&);
486         Mackie::LedState track_press (Mackie::Button&);
487         Mackie::LedState track_release (Mackie::Button&);
488         Mackie::LedState send_press (Mackie::Button&);
489         Mackie::LedState send_release (Mackie::Button&);
490         Mackie::LedState miditracks_press (Mackie::Button&);
491         Mackie::LedState miditracks_release (Mackie::Button&);
492         Mackie::LedState inputs_press (Mackie::Button&);
493         Mackie::LedState inputs_release (Mackie::Button&);
494         Mackie::LedState audiotracks_press (Mackie::Button&);
495         Mackie::LedState audiotracks_release (Mackie::Button&);
496         Mackie::LedState audioinstruments_press (Mackie::Button&);
497         Mackie::LedState audioinstruments_release (Mackie::Button&);
498         Mackie::LedState aux_press (Mackie::Button&);
499         Mackie::LedState aux_release (Mackie::Button&);
500         Mackie::LedState busses_press (Mackie::Button&);
501         Mackie::LedState busses_release (Mackie::Button&);
502         Mackie::LedState outputs_press (Mackie::Button&);
503         Mackie::LedState outputs_release (Mackie::Button&);
504         Mackie::LedState user_press (Mackie::Button&);
505         Mackie::LedState user_release (Mackie::Button&);
506         Mackie::LedState trim_press (Mackie::Button&);
507         Mackie::LedState trim_release (Mackie::Button&);
508         Mackie::LedState latch_press (Mackie::Button&);
509         Mackie::LedState latch_release (Mackie::Button&);
510         Mackie::LedState grp_press (Mackie::Button&);
511         Mackie::LedState grp_release (Mackie::Button&);
512         Mackie::LedState nudge_press (Mackie::Button&);
513         Mackie::LedState nudge_release (Mackie::Button&);
514         Mackie::LedState drop_press (Mackie::Button&);
515         Mackie::LedState drop_release (Mackie::Button&);
516         Mackie::LedState replace_press (Mackie::Button&);
517         Mackie::LedState replace_release (Mackie::Button&);
518         Mackie::LedState click_press (Mackie::Button&);
519         Mackie::LedState click_release (Mackie::Button&);
520         Mackie::LedState view_press (Mackie::Button&);
521         Mackie::LedState view_release (Mackie::Button&);
522
523         Mackie::LedState bank_release (Mackie::Button&, uint32_t bank_num);
524 };
525
526 } // namespace
527
528 #endif // ardour_mackie_control_protocol_h