2 Copyright (C) 2006,2007 John Anderson
3 Copyright (C) 2012 Paul Davis
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.
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.
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.
20 #include "pbd/memento_command.h"
22 #include "ardour/debug.h"
23 #include "ardour/session.h"
24 #include "ardour/route.h"
25 #include "ardour/location.h"
26 #include "ardour/rc_configuration.h"
28 #include "mackie_control_protocol.h"
33 /* handlers for all buttons, broken into a separate file to avoid clutter in
34 * mackie_control_protocol.cc
37 using namespace Mackie;
38 using namespace ARDOUR;
43 MackieControlProtocol::shift_press (Button &)
45 _modifier_state |= MODIFIER_SHIFT;
49 MackieControlProtocol::shift_release (Button &)
51 _modifier_state &= ~MODIFIER_SHIFT;
55 MackieControlProtocol::option_press (Button &)
57 _modifier_state |= MODIFIER_OPTION;
61 MackieControlProtocol::option_release (Button &)
63 _modifier_state &= ~MODIFIER_OPTION;
67 MackieControlProtocol::control_press (Button &)
69 _modifier_state |= MODIFIER_CONTROL;
73 MackieControlProtocol::control_release (Button &)
75 _modifier_state &= ~MODIFIER_CONTROL;
79 MackieControlProtocol::cmd_alt_press (Button &)
81 _modifier_state |= MODIFIER_CMDALT;
85 MackieControlProtocol::cmd_alt_release (Button &)
87 _modifier_state &= ~MODIFIER_CMDALT;
92 MackieControlProtocol::left_press (Button &)
94 Sorted sorted = get_sorted_routes();
95 uint32_t strip_cnt = n_strips ();
97 DEBUG_TRACE (DEBUG::MackieControl, string_compose ("bank left with current initial = %1 nstrips = %2 tracks/busses = %3\n",
98 _current_initial_bank, strip_cnt, sorted.size()));
100 if (sorted.size() > strip_cnt) {
101 int new_initial = _current_initial_bank - strip_cnt;
102 if (new_initial < 0) {
106 if (new_initial != int (_current_initial_bank)) {
107 switch_banks (new_initial);
117 MackieControlProtocol::left_release (Button &)
123 MackieControlProtocol::right_press (Button &)
125 Sorted sorted = get_sorted_routes();
126 uint32_t strip_cnt = n_strips();
128 DEBUG_TRACE (DEBUG::MackieControl, string_compose ("bank right with current initial = %1 nstrips = %2 tracks/busses = %3\n",
129 _current_initial_bank, strip_cnt, sorted.size()));
131 if (sorted.size() > strip_cnt) {
132 uint32_t delta = sorted.size() - (strip_cnt + _current_initial_bank);
134 if (delta > strip_cnt) {
139 switch_banks (_current_initial_bank + delta);
150 MackieControlProtocol::right_release (Button &)
160 MackieControlProtocol::cursor_left_press (Button& )
164 if (_modifier_state & MODIFIER_OPTION) {
165 /* reset selected tracks to default vertical zoom */
167 ZoomOut (); /* EMIT SIGNAL */
171 if (_modifier_state == MODIFIER_CONTROL) {
173 } else if (_modifier_state == MODIFIER_OPTION) {
175 } else if (_modifier_state == MODIFIER_SHIFT) {
178 page_fraction = 0.25;
181 ScrollTimeline (-page_fraction);
188 MackieControlProtocol::cursor_left_release (Button&)
194 MackieControlProtocol::cursor_right_press (Button& )
198 if (_modifier_state & MODIFIER_OPTION) {
199 /* reset selected tracks to default vertical zoom */
201 ZoomIn (); /* EMIT SIGNAL */
205 if (_modifier_state == MODIFIER_CONTROL) {
207 } else if (_modifier_state == MODIFIER_OPTION) {
209 } else if (_modifier_state == MODIFIER_SHIFT) {
212 page_fraction = 0.25;
215 ScrollTimeline (page_fraction);
222 MackieControlProtocol::cursor_right_release (Button&)
228 MackieControlProtocol::cursor_up_press (Button&)
232 if (_modifier_state & MODIFIER_OPTION) {
233 VerticalZoomInSelected (); /* EMIT SIGNAL */
235 VerticalZoomInAll (); /* EMIT SIGNAL */
242 MackieControlProtocol::cursor_up_release (Button&)
248 MackieControlProtocol::cursor_down_press (Button&)
251 if (_modifier_state & MODIFIER_OPTION) {
252 VerticalZoomOutSelected (); /* EMIT SIGNAL */
254 VerticalZoomOutAll (); /* EMIT SIGNAL */
261 MackieControlProtocol::cursor_down_release (Button&)
267 MackieControlProtocol::channel_left_press (Button &)
269 Sorted sorted = get_sorted_routes();
270 if (sorted.size() > n_strips()) {
279 MackieControlProtocol::channel_left_release (Button &)
285 MackieControlProtocol::channel_right_press (Button &)
287 Sorted sorted = get_sorted_routes();
288 if (sorted.size() > n_strips()) {
297 MackieControlProtocol::channel_right_release (Button &)
303 MackieControlProtocol::zoom_press (Mackie::Button &)
305 _zoom_mode = !_zoom_mode;
306 return (_zoom_mode ? on : off);
310 MackieControlProtocol::zoom_release (Mackie::Button &)
312 return (_zoom_mode ? on : off);
316 MackieControlProtocol::scrub_press (Mackie::Button &)
318 _scrub_mode = !_scrub_mode;
319 return (_scrub_mode ? on : off);
323 MackieControlProtocol::scrub_release (Mackie::Button &)
325 return (_scrub_mode ? on : off);
329 MackieControlProtocol::undo_press (Button&)
331 if (_modifier_state & MODIFIER_SHIFT) {
332 Redo(); /* EMIT SIGNAL */
334 Undo(); /* EMIT SIGNAL */
340 MackieControlProtocol::undo_release (Button&)
346 MackieControlProtocol::redo_press (Button&)
348 Redo(); /* EMIT SIGNAL */
353 MackieControlProtocol::redo_release (Button&)
359 MackieControlProtocol::drop_press (Button &)
361 session->remove_last_capture();
366 MackieControlProtocol::drop_release (Button &)
372 MackieControlProtocol::save_press (Button &)
374 session->save_state ("");
379 MackieControlProtocol::save_release (Button &)
385 MackieControlProtocol::timecode_beats_press (Button &)
387 switch (_timecode_type) {
388 case ARDOUR::AnyTime::BBT:
389 _timecode_type = ARDOUR::AnyTime::Timecode;
391 case ARDOUR::AnyTime::Timecode:
392 _timecode_type = ARDOUR::AnyTime::BBT;
398 update_timecode_beats_led();
404 MackieControlProtocol::timecode_beats_release (Button &)
409 /////////////////////////////////////
411 /////////////////////////////////////
413 MackieControlProtocol::marker_press (Button &)
417 session->locations()->next_available_name (markername,"mcu");
418 add_marker (markername);
424 MackieControlProtocol::marker_release (Button &)
429 /////////////////////////////////////
431 /////////////////////////////////////
434 MackieControlProtocol::frm_left_press (Button &)
436 // can use first_mark_before/after as well
437 unsigned long elapsed = _frm_left_last.restart();
439 Location * loc = session->locations()->first_location_before (
440 session->transport_frame()
443 // allow a quick double to go past a previous mark
444 if (session->transport_rolling() && elapsed < 500 && loc != 0) {
445 Location * loc_two_back = session->locations()->first_location_before (loc->start());
446 if (loc_two_back != 0)
452 // move to the location, if it's valid
454 session->request_locate (loc->start(), session->transport_rolling());
461 MackieControlProtocol::frm_left_release (Button &)
467 MackieControlProtocol::frm_right_press (Button &)
469 // can use first_mark_before/after as well
470 Location * loc = session->locations()->first_location_after (session->transport_frame());
473 session->request_locate (loc->start(), session->transport_rolling());
480 MackieControlProtocol::frm_right_release (Button &)
486 MackieControlProtocol::stop_press (Button &)
493 MackieControlProtocol::stop_release (Button &)
495 return session->transport_stopped();
499 MackieControlProtocol::play_press (Button &)
501 /* if we're already rolling, and we're pressed
502 again, jump back to where we started last time
505 transport_play (session->transport_rolling());
510 MackieControlProtocol::play_release (Button &)
516 MackieControlProtocol::record_press (Button &)
518 rec_enable_toggle ();
523 MackieControlProtocol::record_release (Button &)
529 MackieControlProtocol::rewind_press (Button &)
531 DEBUG_TRACE (DEBUG::MackieControl, "REWIND PRESS\n");
537 MackieControlProtocol::rewind_release (Button &)
543 MackieControlProtocol::ffwd_press (Button &)
550 MackieControlProtocol::ffwd_release (Button &)
556 MackieControlProtocol::loop_press (Button &)
558 if (_modifier_state & MODIFIER_CONTROL) {
559 set_view_mode (Loop);
562 session->request_play_loop (!session->get_play_loop());
568 MackieControlProtocol::loop_release (Button &)
574 MackieControlProtocol::punch_in_press (Button &)
576 bool const state = !session->config.get_punch_in();
577 session->config.set_punch_in (state);
582 MackieControlProtocol::punch_in_release (Button &)
584 return session->config.get_punch_in();
588 MackieControlProtocol::punch_out_press (Button &)
590 bool const state = !session->config.get_punch_out();
591 session->config.set_punch_out (state);
596 MackieControlProtocol::punch_out_release (Button &)
598 return session->config.get_punch_out();
602 MackieControlProtocol::home_press (Button &)
604 session->goto_start();
609 MackieControlProtocol::home_release (Button &)
615 MackieControlProtocol::end_press (Button &)
622 MackieControlProtocol::end_release (Button &)
628 MackieControlProtocol::clicking_press (Button &)
630 bool state = !Config->get_clicking();
631 Config->set_clicking (state);
636 MackieControlProtocol::clicking_release (Button &)
638 return Config->get_clicking();
641 LedState MackieControlProtocol::global_solo_press (Button &)
643 bool state = !session->soloing();
644 session->set_solo (session->get_routes(), state);
648 LedState MackieControlProtocol::global_solo_release (Button &)
650 return session->soloing();
654 MackieControlProtocol::enter_press (Button &)
656 Enter(); /* EMIT SIGNAL */
661 MackieControlProtocol::enter_release (Button &)
666 MackieControlProtocol::F1_press (Button &)
672 MackieControlProtocol::F1_release (Button &)
677 MackieControlProtocol::F2_press (Button &)
683 MackieControlProtocol::F2_release (Button &)
688 MackieControlProtocol::F3_press (Button &)
694 MackieControlProtocol::F3_release (Button &)
699 MackieControlProtocol::F4_press (Button &)
705 MackieControlProtocol::F4_release (Button &)
710 MackieControlProtocol::F5_press (Button &)
716 MackieControlProtocol::F5_release (Button &)
721 MackieControlProtocol::F6_press (Button &)
727 MackieControlProtocol::F6_release (Button &)
732 MackieControlProtocol::F7_press (Button &)
738 MackieControlProtocol::F7_release (Button &)
743 MackieControlProtocol::F8_press (Button &)
745 CloseDialog (); /* EMIT SIGNAL */
749 MackieControlProtocol::F8_release (Button &)
757 MackieControlProtocol::io_press (Button &)
762 MackieControlProtocol::io_release (Button &)
767 MackieControlProtocol::sends_press (Button &)
769 set_view_mode (Sends);
773 MackieControlProtocol::sends_release (Button &)
778 MackieControlProtocol::pan_press (Button &)
783 MackieControlProtocol::pan_release (Button &)
788 MackieControlProtocol::plugin_press (Button &)
793 MackieControlProtocol::plugin_release (Button &)
798 MackieControlProtocol::eq_press (Button &)
804 MackieControlProtocol::eq_release (Button &)
809 MackieControlProtocol::dyn_press (Button &)
811 set_view_mode (Dynamics);
815 MackieControlProtocol::dyn_release (Button &)
820 MackieControlProtocol::flip_press (Button &)
822 if (_modifier_state == 0) {
823 if (_flip_mode != Normal) {
828 } else if (_modifier_state & MODIFIER_CONTROL) {
832 return (_flip_mode != Normal ? on : off);
835 MackieControlProtocol::flip_release (Button &)
840 MackieControlProtocol::edit_press (Button &)
845 MackieControlProtocol::edit_release (Button &)
850 MackieControlProtocol::name_value_press (Button &)
855 MackieControlProtocol::name_value_release (Button &)
860 MackieControlProtocol::F9_press (Button &)
865 MackieControlProtocol::F9_release (Button &)
870 MackieControlProtocol::F10_press (Button &)
875 MackieControlProtocol::F10_release (Button &)
880 MackieControlProtocol::F11_press (Button &)
885 MackieControlProtocol::F11_release (Button &)
890 MackieControlProtocol::F12_press (Button &)
895 MackieControlProtocol::F12_release (Button &)
900 MackieControlProtocol::F13_press (Button &)
905 MackieControlProtocol::F13_release (Button &)
910 MackieControlProtocol::F14_press (Button &)
915 MackieControlProtocol::F14_release (Button &)
920 MackieControlProtocol::F15_press (Button &)
925 MackieControlProtocol::F15_release (Button &)
930 MackieControlProtocol::F16_press (Button &)
935 MackieControlProtocol::F16_release (Button &)
940 MackieControlProtocol::on_press (Button &)
945 MackieControlProtocol::on_release (Button &)
950 MackieControlProtocol::rec_ready_press (Button &)
955 MackieControlProtocol::rec_ready_release (Button &)
960 MackieControlProtocol::touch_press (Button &)
965 MackieControlProtocol::touch_release (Button &)
970 MackieControlProtocol::cancel_press (Button &)
975 MackieControlProtocol::cancel_release (Button &)
980 MackieControlProtocol::mixer_press (Button &)
985 MackieControlProtocol::mixer_release (Button &)
990 MackieControlProtocol::user_a_press (Button &)
995 MackieControlProtocol::user_a_release (Button &)
1000 MackieControlProtocol::user_b_press (Button &)
1005 MackieControlProtocol::user_b_release (Button &)