From d5a8825ce87e80a3873b6603370ce7ac30e196d0 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 29 Jan 2016 18:37:03 -0500 Subject: mackie: basically (fully?) operation fader automatio control for first selected route --- libs/surfaces/mackie/mackie_control_protocol.cc | 104 +++++++++++++++++++++--- libs/surfaces/mackie/mackie_control_protocol.h | 4 +- libs/surfaces/mackie/mcp_buttons.cc | 9 +- 3 files changed, 102 insertions(+), 15 deletions(-) diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc index 921d12e7b6..a234118226 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.cc +++ b/libs/surfaces/mackie/mackie_control_protocol.cc @@ -123,7 +123,6 @@ MackieControlProtocol::MackieControlProtocol (Session& session) , _initialized (false) , configuration_state (0) , state_version (0) - , _group_on (false) { DEBUG_TRACE (DEBUG::MackieControl, "MackieControlProtocol::MackieControlProtocol\n"); @@ -615,6 +614,10 @@ MackieControlProtocol::update_global_button (int id, LedState ls) if (x != surface->controls_by_device_independent_id.end()) { Button * button = dynamic_cast (x->second); surface->write (button->set_state (ls)); + + if (ls == on) { + // blinkers.erase (id); + } } else { DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Button %1 not found\n", id)); } @@ -1962,6 +1965,8 @@ MackieControlProtocol::_gui_track_selection_changed (ARDOUR::RouteNotificationLi if (gui_selection_did_change) { + check_fader_automation_state (); + /* note: this method is also called when we switch banks. * But ... we don't allow bank switching when in subview mode. * @@ -1981,6 +1986,82 @@ MackieControlProtocol::_gui_track_selection_changed (ARDOUR::RouteNotificationLi } } +void +MackieControlProtocol::check_fader_automation_state () +{ + fader_automation_connections.drop_connections (); + + boost::shared_ptr r = first_selected_route (); + + if (!r) { + update_global_button (Button::Read, off); + update_global_button (Button::Write, off); + update_global_button (Button::Touch, off); + update_global_button (Button::Trim, off); + update_global_button (Button::Latch, off); + update_global_button (Button::Grp, on); + return; + } + + r->gain_control()->alist()->automation_state_changed.connect (fader_automation_connections, + MISSING_INVALIDATOR, + boost::bind (&MackieControlProtocol::update_fader_automation_state, this), + this); + + update_fader_automation_state (); +} + +void +MackieControlProtocol::update_fader_automation_state () +{ + boost::shared_ptr r = first_selected_route (); + + if (!r) { + update_global_button (Button::Read, off); + update_global_button (Button::Write, off); + update_global_button (Button::Touch, off); + update_global_button (Button::Trim, off); + update_global_button (Button::Latch, off); + update_global_button (Button::Grp, on); + return; + } + + switch (r->gain_control()->automation_state()) { + case Off: + update_global_button (Button::Read, off); + update_global_button (Button::Write, off); + update_global_button (Button::Touch, off); + update_global_button (Button::Trim, off); + update_global_button (Button::Latch, off); + update_global_button (Button::Grp, on); + break; + case Play: + update_global_button (Button::Read, on); + update_global_button (Button::Write, off); + update_global_button (Button::Touch, off); + update_global_button (Button::Trim, off); + update_global_button (Button::Latch, off); + update_global_button (Button::Grp, off); + break; + case Write: + update_global_button (Button::Read, off); + update_global_button (Button::Write, on); + update_global_button (Button::Touch, off); + update_global_button (Button::Trim, off); + update_global_button (Button::Latch, off); + update_global_button (Button::Grp, off); + break; + case Touch: + update_global_button (Button::Read, off); + update_global_button (Button::Write, off); + update_global_button (Button::Touch, on); + update_global_button (Button::Trim, off); + update_global_button (Button::Latch, off); + update_global_button (Button::Grp, off); + break; + } +} + framepos_t MackieControlProtocol::transport_frame() const { @@ -2420,16 +2501,17 @@ MackieControlProtocol::request_factory (uint32_t num_requests) void MackieControlProtocol::set_automation_state (AutoState as) { - for (RouteNotificationList::iterator wr = _last_selected_routes.begin(); wr != _last_selected_routes.end(); ++wr) { - boost::shared_ptr r = (*wr).lock(); - if (!r) { - continue; - } - boost::shared_ptr ac = r->gain_control(); - if (!ac) { - continue; - } + boost::shared_ptr r = first_selected_route (); - ac->set_automation_state (as); + if (!r) { + return; } + + boost::shared_ptr ac = r->gain_control(); + + if (!ac) { + return; + } + + ac->set_automation_state (as); } diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h index 4831dc2e79..61d5bf3811 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.h +++ b/libs/surfaces/mackie/mackie_control_protocol.h @@ -166,6 +166,8 @@ class MackieControlProtocol bool is_mapped (boost::shared_ptr) const; boost::shared_ptr first_selected_route () const; + void check_fader_automation_state (); + void update_fader_automation_state (); void set_automation_state (ARDOUR::AutoState); void set_view_mode (ViewMode); @@ -328,6 +330,7 @@ class MackieControlProtocol PBD::ScopedConnectionList route_connections; PBD::ScopedConnectionList subview_route_connections; PBD::ScopedConnectionList gui_connections; + PBD::ScopedConnectionList fader_automation_connections; // timer for two quick marker left presses Mackie::Timer _frm_left_last; // last written timecode string @@ -357,7 +360,6 @@ class MackieControlProtocol XMLNode* configuration_state; int state_version; int _last_bank[9]; - bool _group_on; boost::shared_ptr _master_surface; diff --git a/libs/surfaces/mackie/mcp_buttons.cc b/libs/surfaces/mackie/mcp_buttons.cc index ba857f9bc4..c9ba34c18a 100644 --- a/libs/surfaces/mackie/mcp_buttons.cc +++ b/libs/surfaces/mackie/mcp_buttons.cc @@ -817,7 +817,7 @@ MackieControlProtocol::read_press (Mackie::Button&) Mackie::LedState MackieControlProtocol::read_release (Mackie::Button&) { - set_automation_state (ARDOUR::Off); + set_automation_state (ARDOUR::Play); return none; } Mackie::LedState @@ -987,8 +987,11 @@ MackieControlProtocol::grp_press (Mackie::Button&) Mackie::LedState MackieControlProtocol::grp_release (Mackie::Button&) { - _group_on = !_group_on; - return _group_on; + /* There is no "Off" button for automation, + so we use Group for this purpose. + */ + set_automation_state (Off); + return none; } Mackie::LedState MackieControlProtocol::nudge_press (Mackie::Button&) -- cgit v1.2.3