summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-01-28 16:27:33 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2016-01-28 16:27:33 -0500
commit54c3c9e494acc7a9a9bdb7b26d39248aa0612a05 (patch)
tree4430c7d9552eee292f54d091c9822a25f890a5af
parentea895efb970246ff2bc5d8fae1dbb269aa86ac52 (diff)
prevent bank/channel switching past the end of the available routes; do nothing when a view mode finds no matching routes
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.cc40
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.h2
-rw-r--r--libs/surfaces/mackie/mcp_buttons.cc21
3 files changed, 36 insertions, 27 deletions
diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc
index da74660477..a2f31c1d90 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.cc
+++ b/libs/surfaces/mackie/mackie_control_protocol.cc
@@ -374,31 +374,38 @@ MackieControlProtocol::n_strips (bool with_locked_strips) const
return strip_count;
}
-void
+int
MackieControlProtocol::switch_banks (uint32_t initial, bool force)
{
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("switch banking to start at %1 force ? %2 current = %3\n", initial, force, _current_initial_bank));
if (initial == _current_initial_bank && !force) {
- return;
+ /* everything is as it should be */
+ return 0;
}
Sorted sorted = get_sorted_routes();
uint32_t strip_cnt = n_strips (false); // do not include locked strips
// in this count
+ if (initial >= sorted.size()) {
+ /* too high, we can't get there */
+ return -1;
+ }
+
if (sorted.size() <= strip_cnt && _current_initial_bank == 0 && !force) {
/* no banking - not enough routes to fill all strips and we're
* not at the first one.
*/
- return;
+ return -1;
}
+
_current_initial_bank = initial;
_current_selected_track = -1;
// Map current bank of routes onto each surface(+strip)
- if (_current_initial_bank <= sorted.size()) {
+ if (_current_initial_bank < sorted.size()) {
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("switch to %1, %2, available routes %3 on %4 surfaces\n",
_current_initial_bank, strip_cnt, sorted.size(),
@@ -422,6 +429,9 @@ MackieControlProtocol::switch_banks (uint32_t initial, bool force)
(*si)->map_routes (routes);
}
+
+ } else {
+ return -1;
}
/* make sure selection is correct */
@@ -430,6 +440,8 @@ MackieControlProtocol::switch_banks (uint32_t initial, bool force)
/* current bank has not been saved */
session->set_dirty();
+
+ return 0;
}
int
@@ -653,7 +665,7 @@ MackieControlProtocol::update_surfaces()
// do the initial bank switch to connect signals
// _current_initial_bank is initialised by set_state
- switch_banks (_current_initial_bank, true);
+ (void) switch_banks (_current_initial_bank, true);
DEBUG_TRACE (DEBUG::MackieControl, "MackieControlProtocol::update_surfaces() finished\n");
}
@@ -1069,7 +1081,7 @@ MackieControlProtocol::set_state (const XMLNode & node, int version)
state_version = version;
}
- switch_banks (bank, true);
+ (void) switch_banks (bank, true);
DEBUG_TRACE (DEBUG::MackieControl, "MackieControlProtocol::set_state done\n");
@@ -1276,9 +1288,9 @@ MackieControlProtocol::notify_remote_id_changed()
if (sorted.size() - _current_initial_bank < sz) {
// but don't shift backwards past the zeroth channel
if (sorted.size() < sz) { // avoid unsigned math mistake below
- switch_banks(0, true);
+ (void) switch_banks(0, true);
} else {
- switch_banks (max((Sorted::size_type) 0, sorted.size() - sz), true);
+ (void) switch_banks (max((Sorted::size_type) 0, sorted.size() - sz), true);
}
} else {
// Otherwise just refresh the current bank
@@ -1777,14 +1789,18 @@ MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route
void
MackieControlProtocol::set_view_mode (ViewMode m)
{
- _last_bank[_view_mode] = _current_initial_bank;
+ ViewMode old_view_mode = _view_mode;
_view_mode = m;
+ if (switch_banks(_last_bank[m], true)) {
+ _view_mode = old_view_mode;
+ return;
+ }
+
+ _last_bank[_view_mode] = _current_initial_bank;
/* leave subview mode, whatever it was */
set_subview_mode (None, boost::shared_ptr<Route>());
-
- switch_banks(_last_bank[_view_mode], true);
display_view_mode ();
}
@@ -2182,7 +2198,7 @@ MackieControlProtocol::ipmidi_restart ()
if (create_surfaces ()) {
return -1;
}
- switch_banks (_current_initial_bank, true);
+ (void) switch_banks (_current_initial_bank, true);
needs_ipmidi_restart = false;
return 0;
}
diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h
index 8871002424..e1f7ec06d1 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.h
+++ b/libs/surfaces/mackie/mackie_control_protocol.h
@@ -282,7 +282,7 @@ class MackieControlProtocol
Sorted get_sorted_routes();
// bank switching
- void switch_banks (uint32_t first_remote_id, bool force = false);
+ int switch_banks (uint32_t first_remote_id, bool force = false);
void prev_track ();
void next_track ();
diff --git a/libs/surfaces/mackie/mcp_buttons.cc b/libs/surfaces/mackie/mcp_buttons.cc
index 60de07480e..abce7429fa 100644
--- a/libs/surfaces/mackie/mcp_buttons.cc
+++ b/libs/surfaces/mackie/mcp_buttons.cc
@@ -108,9 +108,9 @@ MackieControlProtocol::left_press (Button &)
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("bank left with current initial = %1 nstrips = %2 tracks/busses = %3\n",
_current_initial_bank, strip_cnt, sorted.size()));
if (_current_initial_bank > 0) {
- switch_banks ((_current_initial_bank - 1) / strip_cnt * strip_cnt);
+ (void) switch_banks ((_current_initial_bank - 1) / strip_cnt * strip_cnt);
} else {
- switch_banks (0);
+ (void) switch_banks (0);
}
@@ -120,7 +120,7 @@ MackieControlProtocol::left_press (Button &)
LedState
MackieControlProtocol::left_release (Button &)
{
- return off;
+ return none;
}
LedState
@@ -141,23 +141,16 @@ MackieControlProtocol::right_press (Button &)
if (_current_initial_bank < max_bank) {
uint32_t new_initial = (_current_initial_bank / strip_cnt * strip_cnt) + strip_cnt;
-
- switch_banks (new_initial);
- } else {
- switch_banks (max_bank);
+ (void) switch_banks (new_initial);
}
- return on;
+ return none;
}
LedState
MackieControlProtocol::right_release (Button &)
{
- if (zoom_mode()) {
-
- }
-
- return off;
+ return none;
}
LedState
@@ -581,7 +574,7 @@ MackieControlProtocol::bank_release (Button& b, uint32_t basic_bank_num)
bank_num = 8 + basic_bank_num;
}
- switch_banks (n_strips() * bank_num);
+ (void) switch_banks (n_strips() * bank_num);
return on;
}