diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc index 8ad9db142e..94d110398d 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.cc +++ b/libs/surfaces/mackie/mackie_control_protocol.cc @@ -298,7 +298,7 @@ MackieControlProtocol::switch_banks (int initial) DEBUG_TRACE (DEBUG::MackieControl, string_compose ("remote id %1 connecting %2 to %3 with port %4\n", route->remote_control_id(), route->name(), strip.name(), port_for_id(i))); - set_route_table (1, route); + set_route_table (i, route); RouteSignal * rs = new RouteSignal (route, *this, strip, port_for_id(i)); route_signals.push_back (rs); // update strip from route @@ -438,7 +438,7 @@ MackieControlProtocol::handle_strip_button (SurfacePort & port, Control & contro /* BCF faders don't support touch, so add a timeout to reset their `in_use' state. */ - port.add_in_use_timeout (control.strip().gain(), &control.strip().fader_touch()); + add_in_use_timeout (port, control.strip().gain(), &control.strip().fader_touch()); } } @@ -800,7 +800,7 @@ MackieControlProtocol::handle_control_event (SurfacePort & port, Control & contr if (ARDOUR::Config->get_mackie_emulation() == "bcf") { /* reset the timeout while we're still moving the fader */ - port.add_in_use_timeout (control, control.in_use_touch_control); + add_in_use_timeout (port, control, control.in_use_touch_control); } // must echo bytes back to slider now, because @@ -1741,3 +1741,41 @@ MackieControlProtocol::stop () return 0; } + +/** Add a timeout so that a control's in_use flag will be reset some time in the future. + * @param in_use_control the control whose in_use flag to reset. + * @param touch_control a touch control to emit an event for, or 0. + */ +void +MackieControlProtocol::add_in_use_timeout (SurfacePort& port, Control& in_use_control, Control* touch_control) +{ + Glib::RefPtr timeout (Glib::TimeoutSource::create (250)); // milliseconds + + in_use_control.in_use_connection.disconnect (); + in_use_control.in_use_connection = timeout->connect ( + sigc::bind (sigc::mem_fun (*this, &MackieControlProtocol::control_in_use_timeout), &port, &in_use_control, touch_control)); + in_use_control.in_use_touch_control = touch_control; + + timeout->attach (main_loop()->get_context()); +} + +/** Handle timeouts to reset in_use for controls that can't + * do this by themselves (e.g. pots, and faders without touch support). + * @param in_use_control the control whose in_use flag to reset. + * @param touch_control a touch control to emit an event for, or 0. + */ +bool +MackieControlProtocol::control_in_use_timeout (SurfacePort* port, Control* in_use_control, Control* touch_control) +{ + in_use_control->set_in_use (false); + + if (touch_control) { + // empty control_state + ControlState control_state; + handle_control_event (*port, *touch_control, control_state); + } + + // only call this method once from the timer + return false; +} + diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h index b42dbae258..1df583d15b 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.h +++ b/libs/surfaces/mackie/mackie_control_protocol.h @@ -48,6 +48,8 @@ namespace MIDI { namespace Mackie { class Surface; + class Control; + class SurfacePort; } /** @@ -220,6 +222,8 @@ class MackieControlProtocol Mackie::SurfacePort & mcu_port(); ARDOUR::Session & get_session() { return *session; } + void add_in_use_timeout (Mackie::SurfacePort& port, Mackie::Control& in_use_control, Mackie::Control* touch_control); + protected: // create instances of MackiePort, depending on what's found in ardour.rc void create_ports(); @@ -307,10 +311,11 @@ class MackieControlProtocol void do_request (MackieControlUIRequest*); int stop (); - + private: void port_connected_or_disconnected (std::string, std::string, bool); + bool control_in_use_timeout (Mackie::SurfacePort*, Mackie::Control *, Mackie::Control *); boost::shared_ptr master_route_signal; diff --git a/libs/surfaces/mackie/mackie_port.cc b/libs/surfaces/mackie/mackie_port.cc index 772b668a75..f725407b02 100644 --- a/libs/surfaces/mackie/mackie_port.cc +++ b/libs/surfaces/mackie/mackie_port.cc @@ -383,8 +383,7 @@ MackiePort::handle_midi_controller_message (MIDI::Parser &, MIDI::EventTwoBytes* */ control->set_in_use (true); - add_in_use_timeout (*control, control); - + _mcp.add_in_use_timeout (*this, *control, control); control_event (*this, *control, state); } break; diff --git a/libs/surfaces/mackie/surface_port.cc b/libs/surfaces/mackie/surface_port.cc index ca04a4214f..5a336447c8 100644 --- a/libs/surfaces/mackie/surface_port.cc +++ b/libs/surfaces/mackie/surface_port.cc @@ -198,42 +198,3 @@ ostream & Mackie::operator << (ostream & os, const SurfacePort & port) return os; } -/** Handle timeouts to reset in_use for controls that can't - * do this by themselves (e.g. pots, and faders without touch support). - * @param in_use_control the control whose in_use flag to reset. - * @param touch_control a touch control to emit an event for, or 0. - */ -bool -SurfacePort::control_in_use_timeout (Control* in_use_control, Control* touch_control) -{ - in_use_control->set_in_use (false); - - if (touch_control) { - // empty control_state - ControlState control_state; - control_event (*this, *touch_control, control_state); - } - - // only call this method once from the timer - return false; -} - -/** Add a timeout so that a control's in_use flag will be reset some time in the future. - * @param in_use_control the control whose in_use flag to reset. - * @param touch_control a touch control to emit an event for, or 0. - */ -void -SurfacePort::add_in_use_timeout (Control& in_use_control, Control* touch_control) -{ - in_use_control.in_use_connection.disconnect (); - - Glib::RefPtr timeout (Glib::TimeoutSource::create (250)); - - /* timeout after 250ms */ - in_use_control.in_use_connection = timeout->connect ( - sigc::bind (sigc::mem_fun (*this, &SurfacePort::control_in_use_timeout), &in_use_control, touch_control)); - - /* XXX need to access main event loop of MackieControlProtocol */ - - in_use_control.in_use_touch_control = touch_control; -} diff --git a/libs/surfaces/mackie/surface_port.h b/libs/surfaces/mackie/surface_port.h index 350ee561f6..63966c6f3a 100644 --- a/libs/surfaces/mackie/surface_port.h +++ b/libs/surfaces/mackie/surface_port.h @@ -93,8 +93,6 @@ protected: virtual void control_event (SurfacePort &, Control &, const ControlState &) {} private: - bool control_in_use_timeout (Control *, Control *); - MIDI::Port * _input_port; MIDI::Port * _output_port; int _number;