MCP: change refresh interval for meters + automation + timecode to 100msec
[ardour.git] / libs / surfaces / mackie / surface.cc
1 #include <sstream>
2 #include <iomanip>
3 #include <iostream>
4 #include <cstdio>
5
6 #include "ardour/debug.h"
7
8 #include "mackie_button_handler.h"
9 #include "surface_port.h"
10 #include "surface.h"
11
12 using namespace std;
13 using namespace PBD;
14 using namespace Mackie;
15
16 Surface::Surface (uint32_t max_strips, uint32_t unit_strips)
17         : _max_strips (max_strips)
18         , _unit_strips( unit_strips )
19 {
20 }
21
22 void Surface::init ()
23 {
24         DEBUG_TRACE (DEBUG::MackieControl, "Surface::init\n");
25
26         strips.resize (_max_strips);
27         init_controls ();
28         init_strips ();
29
30         DEBUG_TRACE (DEBUG::MackieControl, "Surface::init finish\n");
31 }
32
33 Surface::~Surface ()
34 {
35         // delete groups
36         for (Groups::iterator it = groups.begin(); it != groups.end(); ++it) {
37                 delete it->second;
38         }
39         
40         // delete controls
41         for (Controls::iterator it = controls.begin(); it != controls.end(); ++it) {
42                 delete *it;
43         }
44 }
45
46 static GlobalControlDefinition mackie_global_controls[] = {
47         { "jog", 0x3c, Jog::factory, "none" },
48         { "external", 0x2e, Pot::factory, "none" },
49         { "io", 0x28, Button::factory, "assignment" },
50         { "sends", 0x29, Button::factory, "assignment" },
51         { "pan", 0x2a, Button::factory, "assignment" },
52         { "plugin", 0x2b, Button::factory, "assignment" },
53         { "eq", 0x2c, Button::factory, "assignment" },
54         { "dyn", 0x2d, Button::factory, "assignment" },
55         { "left", 0x2e, Button::factory, "bank" },
56         { "right", 0x2f, Button::factory, "bank" },
57         { "channel_left", 0x30, Button::factory, "bank" },
58         { "channel_right", 0x31, Button::factory, "bank" },
59         { "flip", 0x32, Button::factory, "none" },
60         { "edit", 0x33, Button::factory, "none" },
61         { "name_value", 0x34, Button::factory, "display" },
62         { "timecode_beats", 0x35, Button::factory, "display" },
63         { "F1", 0x36, Button::factory, "none" },
64         { "F2", 0x37, Button::factory, "none" },
65         { "F3", 0x38, Button::factory, "none" },
66         { "F4", 0x39, Button::factory, "none" },
67         { "F5", 0x3a, Button::factory, "none" },
68         { "F6", 0x3b, Button::factory, "none" },
69         { "F7", 0x3c, Button::factory, "none" },
70         { "F8", 0x3d, Button::factory, "none" },
71         { "F9", 0x3e, Button::factory, "none" },
72         { "F10", 0x3f, Button::factory, "none" },
73         { "F11", 0x40, Button::factory, "none" },
74         { "F12", 0x41, Button::factory, "none" },
75         { "F13", 0x42, Button::factory, "none" },
76         { "F14", 0x43, Button::factory, "none" },
77         { "F15", 0x44, Button::factory, "none" },
78         { "F16", 0x45, Button::factory, "none" },
79         { "shift", 0x46, Button::factory, "modifiers" },
80         { "option", 0x47, Button::factory, "modifiers" },
81         { "control", 0x48, Button::factory, "modifiers" },
82         { "cmd_alt", 0x49, Button::factory, "modifiers" },
83         { "on", 0x4a, Button::factory, "automation" },
84         { "rec_ready", 0x4b, Button::factory, "automation" },
85         { "undo", 0x4c, Button::factory, "functions" },
86         { "snapshot", 0x4d, Button::factory, "automation" },
87         { "touch", 0x4e, Button::factory, "automation" },
88         { "redo", 0x4f, Button::factory, "functions" },
89         { "marker", 0x50, Button::factory, "functions" },
90         { "enter", 0x51, Button::factory, "functions" },
91         { "cancel", 0x52, Button::factory, "functions" },
92         { "mixer", 0x53, Button::factory, "functions" },
93         { "frm_left", 0x54, Button::factory, "transport" },
94         { "frm_right", 0x55, Button::factory, "transport" },
95         { "loop", 0x56, Button::factory, "transport" },
96         { "punch_in", 0x57, Button::factory, "transport" },
97         { "punch_out", 0x58, Button::factory, "transport" },
98         { "home", 0x59, Button::factory, "transport" },
99         { "end", 0x5a, Button::factory, "transport" },
100         { "rewind", 0x5b, Button::factory, "transport" },
101         { "ffwd", 0x5c, Button::factory, "transport" },
102         { "stop", 0x5d, Button::factory, "transport" },
103         { "play", 0x5e, Button::factory, "transport" },
104         { "record", 0x5f, Button::factory, "transport" },
105         { "cursor_up", 0x60, Button::factory, "cursor" },
106         { "cursor_down", 0x61, Button::factory, "cursor" },
107         { "cursor_left", 0x62, Button::factory, "cursor" },
108         { "cursor_right", 0x63, Button::factory, "cursor" },
109         { "zoom", 0x64, Button::factory, "none" },
110         { "scrub", 0x65, Button::factory, "none" },
111         { "user_a", 0x66, Button::factory, "user" },
112         { "user_b", 0x67, Button::factory, "user" },
113         { "fader_touch", 0x70, Led::factory, "master" },
114         { "timecode", 0x71, Led::factory, "none" },
115         { "beats", 0x72, Led::factory, "none" },
116         { "solo", 0x73, Led::factory, "none" },
117         { "relay_click", 0x73, Led::factory, "none" },
118         { "", 0, Button::factory, "" }
119 };
120         
121 void 
122 Surface::init_controls()
123 {
124         Group* group;
125
126         groups["assignment"] = new Group  ("assignment");
127         groups["automation"] = new Group  ("automation");
128         groups["bank"] = new Group  ("bank");
129         groups["cursor"] = new Group  ("cursor");
130         groups["display"] = new Group  ("display");
131         groups["functions"] = new Group  ("functions");
132         groups["modifiers"] = new Group  ("modifiers");
133         groups["none"] = new Group  ("none");
134         groups["transport"] = new Group  ("transport");
135         groups["user"] = new Group  ("user");
136
137         group = new MasterStrip  ("master", 0);
138         groups["master"] = group;
139         strips[0] = dynamic_cast<Strip*> (group);
140
141         for (uint32_t n = 0; mackie_global_controls[n].name[0]; ++n) {
142                 group = groups[mackie_global_controls[n].group_name];
143                 Control* control = mackie_global_controls[n].factory (*this, mackie_global_controls[n].id, 1, mackie_global_controls[n].name, *group);
144                 controls_by_name[mackie_global_controls[n].name] = control;
145                 group->add (*control);
146         }
147 }
148
149 static StripControlDefinition mackie_strip_controls[] = {
150         { "gain", Control::fader_base_id, Fader::factory, },
151         { "vpot", Control::pot_base_id, Pot::factory, },
152         { "recenable", Control::recenable_button_base_id, Button::factory, },
153         { "solo", Control::solo_button_base_id, Button::factory, },
154         { "mute", Control::mute_button_base_id, Button::factory, },
155         { "select", Control::select_button_base_id, Button::factory, },
156         { "vselect", Control::vselect_button_base_id, Button::factory, },
157         { "fader_touch", Control::fader_touch_button_base_id, Button::factory, },
158         { "meter", 0, Meter::factory, },
159         { "", 0, Button::factory, }
160 };
161
162 void 
163 Surface::init_strips ()
164 {
165         for (uint32_t i = 0; i < _max_strips; ++i) {
166
167                 char name[32];
168                 
169                 uint32_t unit_index = i % _unit_strips;
170                 
171                 snprintf (name, sizeof (name), "strip_%d", unit_index+1);
172                 
173                 Strip* strip = new Strip (*this, name, i, unit_index, mackie_strip_controls);
174                 
175                 groups[name] = strip;
176                 strips[i] = strip;
177         }
178 }
179
180 void 
181 Surface::handle_button (MackieButtonHandler & mbh, ButtonState bs, Button & button)
182 {
183         if  (bs != press && bs != release) {
184                 mbh.update_led (button, none);
185                 return;
186         }
187         
188         LedState ls;
189         switch  (button.id()) {
190         case 0x9028: // io
191                 switch  (bs) {
192                 case press: ls = mbh.io_press (button); break;
193                 case release: ls = mbh.io_release (button); break;
194                 case neither: break;
195                 }
196                 break;
197                 
198         case 0x9029: // sends
199                 switch  (bs) {
200                 case press: ls = mbh.sends_press (button); break;
201                 case release: ls = mbh.sends_release (button); break;
202                 case neither: break;
203                 }
204                 break;
205                 
206         case 0x902a: // pan
207                 switch  (bs) {
208                 case press: ls = mbh.pan_press (button); break;
209                 case release: ls = mbh.pan_release (button); break;
210                 case neither: break;
211                 }
212                 break;
213                 
214         case 0x902b: // plugin
215                 switch  (bs) {
216                 case press: ls = mbh.plugin_press (button); break;
217                 case release: ls = mbh.plugin_release (button); break;
218                 case neither: break;
219                 }
220                 break;
221                 
222         case 0x902c: // eq
223                 switch  (bs) {
224                 case press: ls = mbh.eq_press (button); break;
225                 case release: ls = mbh.eq_release (button); break;
226                 case neither: break;
227                 }
228                 break;
229                 
230         case 0x902d: // dyn
231                 switch  (bs) {
232                 case press: ls = mbh.dyn_press (button); break;
233                 case release: ls = mbh.dyn_release (button); break;
234                 case neither: break;
235                 }
236                 break;
237                 
238         case 0x902e: // left
239                 switch  (bs) {
240                 case press: ls = mbh.left_press (button); break;
241                 case release: ls = mbh.left_release (button); break;
242                 case neither: break;
243                 }
244                 break;
245                 
246         case 0x902f: // right
247                 switch  (bs) {
248                 case press: ls = mbh.right_press (button); break;
249                 case release: ls = mbh.right_release (button); break;
250                 case neither: break;
251                 }
252                 break;
253                 
254         case 0x9030: // channel_left
255                 switch  (bs) {
256                 case press: ls = mbh.channel_left_press (button); break;
257                 case release: ls = mbh.channel_left_release (button); break;
258                 case neither: break;
259                 }
260                 break;
261                 
262         case 0x9031: // channel_right
263                 switch  (bs) {
264                 case press: ls = mbh.channel_right_press (button); break;
265                 case release: ls = mbh.channel_right_release (button); break;
266                 case neither: break;
267                 }
268                 break;
269                 
270         case 0x9032: // flip
271                 switch  (bs) {
272                 case press: ls = mbh.flip_press (button); break;
273                 case release: ls = mbh.flip_release (button); break;
274                 case neither: break;
275                 }
276                 break;
277
278         case 0x9033: // edit
279                 switch  (bs) {
280                 case press: ls = mbh.edit_press (button); break;
281                 case release: ls = mbh.edit_release (button); break;
282                 case neither: break;
283                 }
284                 break;
285
286         case 0x9034: // name_value
287                 switch  (bs) {
288                 case press: ls = mbh.name_value_press (button); break;
289                 case release: ls = mbh.name_value_release (button); break;
290                 case neither: break;
291                 }
292                 break;
293
294         case 0x9035: // timecode_beats
295                 switch  (bs) {
296                 case press: ls = mbh.timecode_beats_press (button); break;
297                 case release: ls = mbh.timecode_beats_release (button); break;
298                 case neither: break;
299                 }
300                 break;
301
302         case 0x9036: // F1
303                 switch  (bs) {
304                 case press: ls = mbh.F1_press (button); break;
305                 case release: ls = mbh.F1_release (button); break;
306                 case neither: break;
307                 }
308                 break;
309
310         case 0x9037: // F2
311                 switch  (bs) {
312                 case press: ls = mbh.F2_press (button); break;
313                 case release: ls = mbh.F2_release (button); break;
314                 case neither: break;
315                 }
316                 break;
317
318         case 0x9038: // F3
319                 switch  (bs) {
320                 case press: ls = mbh.F3_press (button); break;
321                 case release: ls = mbh.F3_release (button); break;
322                 case neither: break;
323                 }
324                 break;
325
326         case 0x9039: // F4
327                 switch  (bs) {
328                 case press: ls = mbh.F4_press (button); break;
329                 case release: ls = mbh.F4_release (button); break;
330                 case neither: break;
331                 }
332                 break;
333
334         case 0x903a: // F5
335                 switch  (bs) {
336                 case press: ls = mbh.F5_press (button); break;
337                 case release: ls = mbh.F5_release (button); break;
338                 case neither: break;
339                 }
340                 break;
341
342         case 0x903b: // F6
343                 switch  (bs) {
344                 case press: ls = mbh.F6_press (button); break;
345                 case release: ls = mbh.F6_release (button); break;
346                 case neither: break;
347                 }
348                 break;
349
350         case 0x903c: // F7
351                 switch  (bs) {
352                 case press: ls = mbh.F7_press (button); break;
353                 case release: ls = mbh.F7_release (button); break;
354                 case neither: break;
355                 }
356                 break;
357
358         case 0x903d: // F8
359                 switch  (bs) {
360                 case press: ls = mbh.F8_press (button); break;
361                 case release: ls = mbh.F8_release (button); break;
362                 case neither: break;
363                 }
364                 break;
365
366         case 0x903e: // F9
367                 switch  (bs) {
368                 case press: ls = mbh.F9_press (button); break;
369                 case release: ls = mbh.F9_release (button); break;
370                 case neither: break;
371                 }
372                 break;
373
374         case 0x903f: // F10
375                 switch  (bs) {
376                 case press: ls = mbh.F10_press (button); break;
377                 case release: ls = mbh.F10_release (button); break;
378                 case neither: break;
379                 }
380                 break;
381
382         case 0x9040: // F11
383                 switch  (bs) {
384                 case press: ls = mbh.F11_press (button); break;
385                 case release: ls = mbh.F11_release (button); break;
386                 case neither: break;
387                 }
388                 break;
389
390         case 0x9041: // F12
391                 switch  (bs) {
392                 case press: ls = mbh.F12_press (button); break;
393                 case release: ls = mbh.F12_release (button); break;
394                 case neither: break;
395                 }
396                 break;
397
398         case 0x9042: // F13
399                 switch  (bs) {
400                 case press: ls = mbh.F13_press (button); break;
401                 case release: ls = mbh.F13_release (button); break;
402                 case neither: break;
403                 }
404                 break;
405
406         case 0x9043: // F14
407                 switch  (bs) {
408                 case press: ls = mbh.F14_press (button); break;
409                 case release: ls = mbh.F14_release (button); break;
410                 case neither: break;
411                 }
412                 break;
413
414         case 0x9044: // F15
415                 switch  (bs) {
416                 case press: ls = mbh.F15_press (button); break;
417                 case release: ls = mbh.F15_release (button); break;
418                 case neither: break;
419                 }
420                 break;
421
422         case 0x9045: // F16
423                 switch  (bs) {
424                 case press: ls = mbh.F16_press (button); break;
425                 case release: ls = mbh.F16_release (button); break;
426                 case neither: break;
427                 }
428                 break;
429
430         case 0x9046: // shift
431                 switch  (bs) {
432                 case press: ls = mbh.shift_press (button); break;
433                 case release: ls = mbh.shift_release (button); break;
434                 case neither: break;
435                 }
436                 break;
437
438         case 0x9047: // option
439                 switch  (bs) {
440                 case press: ls = mbh.option_press (button); break;
441                 case release: ls = mbh.option_release (button); break;
442                 case neither: break;
443                 }
444                 break;
445
446         case 0x9048: // control
447                 switch  (bs) {
448                 case press: ls = mbh.control_press (button); break;
449                 case release: ls = mbh.control_release (button); break;
450                 case neither: break;
451                 }
452                 break;
453
454         case 0x9049: // cmd_alt
455                 switch  (bs) {
456                 case press: ls = mbh.cmd_alt_press (button); break;
457                 case release: ls = mbh.cmd_alt_release (button); break;
458                 case neither: break;
459                 }
460                 break;
461
462         case 0x904a: // on
463                 switch  (bs) {
464                 case press: ls = mbh.on_press (button); break;
465                 case release: ls = mbh.on_release (button); break;
466                 case neither: break;
467                 }
468                 break;
469
470         case 0x904b: // rec_ready
471                 switch  (bs) {
472                 case press: ls = mbh.rec_ready_press (button); break;
473                 case release: ls = mbh.rec_ready_release (button); break;
474                 case neither: break;
475                 }
476                 break;
477
478         case 0x904c: // undo
479                 switch  (bs) {
480                 case press: ls = mbh.undo_press (button); break;
481                 case release: ls = mbh.undo_release (button); break;
482                 case neither: break;
483                 }
484                 break;
485
486         case 0x904d: // snapshot
487                 switch  (bs) {
488                 case press: ls = mbh.snapshot_press (button); break;
489                 case release: ls = mbh.snapshot_release (button); break;
490                 case neither: break;
491                 }
492                 break;
493
494         case 0x904e: // touch
495                 switch  (bs) {
496                 case press: ls = mbh.touch_press (button); break;
497                 case release: ls = mbh.touch_release (button); break;
498                 case neither: break;
499                 }
500                 break;
501
502         case 0x904f: // redo
503                 switch  (bs) {
504                 case press: ls = mbh.redo_press (button); break;
505                 case release: ls = mbh.redo_release (button); break;
506                 case neither: break;
507                 }
508                 break;
509
510         case 0x9050: // marker
511                 switch  (bs) {
512                 case press: ls = mbh.marker_press (button); break;
513                 case release: ls = mbh.marker_release (button); break;
514                 case neither: break;
515                 }
516                 break;
517
518         case 0x9051: // enter
519                 switch  (bs) {
520                 case press: ls = mbh.enter_press (button); break;
521                 case release: ls = mbh.enter_release (button); break;
522                 case neither: break;
523                 }
524                 break;
525
526         case 0x9052: // cancel
527                 switch  (bs) {
528                 case press: ls = mbh.cancel_press (button); break;
529                 case release: ls = mbh.cancel_release (button); break;
530                 case neither: break;
531                 }
532                 break;
533
534         case 0x9053: // mixer
535                 switch  (bs) {
536                 case press: ls = mbh.mixer_press (button); break;
537                 case release: ls = mbh.mixer_release (button); break;
538                 case neither: break;
539                 }
540                 break;
541
542         case 0x9054: // frm_left
543                 switch  (bs) {
544                 case press: ls = mbh.frm_left_press (button); break;
545                 case release: ls = mbh.frm_left_release (button); break;
546                 case neither: break;
547                 }
548                 break;
549
550         case 0x9055: // frm_right
551                 switch  (bs) {
552                 case press: ls = mbh.frm_right_press (button); break;
553                 case release: ls = mbh.frm_right_release (button); break;
554                 case neither: break;
555                 }
556                 break;
557
558         case 0x9056: // loop
559                 switch  (bs) {
560                 case press: ls = mbh.loop_press (button); break;
561                 case release: ls = mbh.loop_release (button); break;
562                 case neither: break;
563                 }
564                 break;
565
566         case 0x9057: // punch_in
567                 switch  (bs) {
568                 case press: ls = mbh.punch_in_press (button); break;
569                 case release: ls = mbh.punch_in_release (button); break;
570                 case neither: break;
571                 }
572                 break;
573
574         case 0x9058: // punch_out
575                 switch  (bs) {
576                 case press: ls = mbh.punch_out_press (button); break;
577                 case release: ls = mbh.punch_out_release (button); break;
578                 case neither: break;
579                 }
580                 break;
581
582         case 0x9059: // home
583                 switch  (bs) {
584                 case press: ls = mbh.home_press (button); break;
585                 case release: ls = mbh.home_release (button); break;
586                 case neither: break;
587                 }
588                 break;
589
590         case 0x905a: // end
591                 switch  (bs) {
592                 case press: ls = mbh.end_press (button); break;
593                 case release: ls = mbh.end_release (button); break;
594                 case neither: break;
595                 }
596                 break;
597
598         case 0x905b: // rewind
599                 switch  (bs) {
600                 case press: ls = mbh.rewind_press (button); break;
601                 case release: ls = mbh.rewind_release (button); break;
602                 case neither: break;
603                 }
604                 break;
605
606         case 0x905c: // ffwd
607                 switch  (bs) {
608                 case press: ls = mbh.ffwd_press (button); break;
609                 case release: ls = mbh.ffwd_release (button); break;
610                 case neither: break;
611                 }
612                 break;
613
614         case 0x905d: // stop
615                 switch  (bs) {
616                 case press: ls = mbh.stop_press (button); break;
617                 case release: ls = mbh.stop_release (button); break;
618                 case neither: break;
619                 }
620                 break;
621
622         case 0x905e: // play
623                 switch  (bs) {
624                 case press: ls = mbh.play_press (button); break;
625                 case release: ls = mbh.play_release (button); break;
626                 case neither: break;
627                 }
628                 break;
629
630         case 0x905f: // record
631                 switch  (bs) {
632                 case press: ls = mbh.record_press (button); break;
633                 case release: ls = mbh.record_release (button); break;
634                 case neither: break;
635                 }
636                 break;
637
638         case 0x9060: // cursor_up
639                 switch  (bs) {
640                 case press: ls = mbh.cursor_up_press (button); break;
641                 case release: ls = mbh.cursor_up_release (button); break;
642                 case neither: break;
643                 }
644                 break;
645
646         case 0x9061: // cursor_down
647                 switch  (bs) {
648                 case press: ls = mbh.cursor_down_press (button); break;
649                 case release: ls = mbh.cursor_down_release (button); break;
650                 case neither: break;
651                 }
652                 break;
653
654         case 0x9062: // cursor_left
655                 switch  (bs) {
656                 case press: ls = mbh.cursor_left_press (button); break;
657                 case release: ls = mbh.cursor_left_release (button); break;
658                 case neither: break;
659                 }
660                 break;
661
662         case 0x9063: // cursor_right
663                 switch  (bs) {
664                 case press: ls = mbh.cursor_right_press (button); break;
665                 case release: ls = mbh.cursor_right_release (button); break;
666                 case neither: break;
667                 }
668                 break;
669
670         case 0x9064: // zoom
671                 switch  (bs) {
672                 case press: ls = mbh.zoom_press (button); break;
673                 case release: ls = mbh.zoom_release (button); break;
674                 case neither: break;
675                 }
676                 break;
677
678         case 0x9065: // scrub
679                 switch  (bs) {
680                 case press: ls = mbh.scrub_press (button); break;
681                 case release: ls = mbh.scrub_release (button); break;
682                 case neither: break;
683                 }
684                 break;
685
686         case 0x9066: // user_a
687                 switch  (bs) {
688                 case press: ls = mbh.user_a_press (button); break;
689                 case release: ls = mbh.user_a_release (button); break;
690                 case neither: break;
691                 }
692                 break;
693
694         case 0x9067: // user_b
695                 switch  (bs) {
696                 case press: ls = mbh.user_b_press (button); break;
697                 case release: ls = mbh.user_b_release (button); break;
698                 case neither: break;
699                 }
700                 break;
701
702         }
703         mbh.update_led (button, ls);
704 }