diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2015-12-15 11:10:35 -0500 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2015-12-16 06:01:55 -0500 |
commit | 93d5fe83c8dfe794683b5009e78c390f28e6eca2 (patch) | |
tree | 64830ad9e769c68a7afe1b109f9286896dc1d49a /libs | |
parent | a9a4cfb1668ca7e74e33234ddbc7b7ab55ff0016 (diff) |
mackie: properly track lifetime of subview route; fix subview/potmode LED state mgmt
Diffstat (limited to 'libs')
-rw-r--r-- | libs/surfaces/mackie/mackie_control_protocol.cc | 56 | ||||
-rw-r--r-- | libs/surfaces/mackie/mackie_control_protocol.h | 2 | ||||
-rw-r--r-- | libs/surfaces/mackie/mcp_buttons.cc | 4 |
3 files changed, 49 insertions, 13 deletions
diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc index bdfe2b6b71..98285a87e6 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.cc +++ b/libs/surfaces/mackie/mackie_control_protocol.cc @@ -1619,17 +1619,34 @@ MackieControlProtocol::clear_ports () } void +MackieControlProtocol::notify_subview_route_deleted () +{ + /* return to global/mixer view */ + _subview_route.reset (); + set_view_mode (Mixer); +} + +void MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route> r) { - SubViewMode old = _subview_mode; + SubViewMode old_mode = _subview_mode; + boost::shared_ptr<Route> old_route = _subview_route; _subview_mode = sm; if (r) { - _subview_route = r; + /* retain _subview_route even if it is reset to null implicitly */ + _subview_route = r; } - if (_subview_mode != old) { + if ((_subview_mode != old_mode) || (_subview_route != old_route)) { + + if (r != old_route) { + subview_route_connections.drop_connections (); + if (_subview_route) { + _subview_route->DropReferences.connect (subview_route_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_subview_route_deleted, this), this); + } + } /* subview mode did actually change */ @@ -1642,18 +1659,35 @@ MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route } for (Surfaces::iterator s = copy.begin(); s != copy.end(); ++s) { - (*s)->subview_mode_changed (); + (*s)->subview_mode_changed (); } } - /* turn buttons related to vpot mode on or off as required */ + if (_subview_mode != old_mode) { - if (_subview_mode != None) { - update_global_button (Button::Trim, off); - update_global_button (Button::Send, off); - update_global_button (Button::Pan, off); - } else { - pot_mode_globals (); + /* turn buttons related to vpot mode on or off as required */ + + switch (_subview_mode) { + case MackieControlProtocol::None: + pot_mode_globals (); + break; + case MackieControlProtocol::EQ: + update_global_button (Button::Eq, on); + update_global_button (Button::Dyn, off); + update_global_button (Button::AudioInstruments, off); /* faking up Dyn */ + update_global_button (Button::Trim, off); + update_global_button (Button::Send, off); + update_global_button (Button::Pan, off); + break; + case MackieControlProtocol::Dynamics: + update_global_button (Button::Eq, off); + update_global_button (Button::Dyn, on); + update_global_button (Button::AudioInstruments, on); /* faking up Dyn */ + update_global_button (Button::Trim, off); + update_global_button (Button::Send, off); + update_global_button (Button::Pan, off); + break; + } } } } diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h index b8940d650c..a1cee8ec7f 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.h +++ b/libs/surfaces/mackie/mackie_control_protocol.h @@ -201,6 +201,7 @@ class MackieControlProtocol void handle_button_event (Mackie::Surface&, Mackie::Button& button, Mackie::ButtonState); + void notify_subview_route_deleted (); void notify_route_added_or_removed (); void notify_route_added (ARDOUR::RouteList &); void notify_remote_id_changed(); @@ -318,6 +319,7 @@ class MackieControlProtocol PBD::ScopedConnectionList audio_engine_connections; PBD::ScopedConnectionList session_connections; PBD::ScopedConnectionList route_connections; + PBD::ScopedConnectionList subview_route_connections; PBD::ScopedConnectionList gui_connections; // timer for two quick marker left presses Mackie::Timer _frm_left_last; diff --git a/libs/surfaces/mackie/mcp_buttons.cc b/libs/surfaces/mackie/mcp_buttons.cc index f2f2b0f27b..b2fd79bcdf 100644 --- a/libs/surfaces/mackie/mcp_buttons.cc +++ b/libs/surfaces/mackie/mcp_buttons.cc @@ -711,7 +711,7 @@ MackieControlProtocol::eq_press (Button &) boost::shared_ptr<Route> r = first_selected_route (); if (r && r->eq_band_cnt() > 0) { set_subview_mode (EQ, r); - return on; + return none; /* led state handled by set_subview_mode() */ } } return none; @@ -730,7 +730,7 @@ MackieControlProtocol::dyn_press (Button &) if (r) { set_subview_mode (Dynamics, r); - return on; + return none; /* led state handled by set_subview_mode() */ } } |