diff --git a/libs/surfaces/control_protocol/basic_ui.cc b/libs/surfaces/control_protocol/basic_ui.cc index ebef517d8a..0019efb918 100644 --- a/libs/surfaces/control_protocol/basic_ui.cc +++ b/libs/surfaces/control_protocol/basic_ui.cc @@ -100,7 +100,7 @@ BasicUI::add_marker () void BasicUI::rewind () { - session->request_transport_speed (session->transport_speed() * 1.5); + session->request_transport_speed (session->transport_speed() - 1.5); } void diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc index 78587fe690..d2823b6a9e 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.cc +++ b/libs/surfaces/mackie/mackie_control_protocol.cc @@ -1095,3 +1095,33 @@ MackieControlProtocol::set_view_mode (ViewMode m) } } + +void +MackieControlProtocol::set_master_on_surface_strip (uint32_t surface, uint32_t strip_number) +{ + force_special_route_to_strip (session->master_out(), surface, strip_number); +} + +void +MackieControlProtocol::set_monitor_on_surface_strip (uint32_t surface, uint32_t strip_number) +{ + force_special_route_to_strip (session->monitor_out(), surface, strip_number); +} + +void +MackieControlProtocol::force_special_route_to_strip (boost::shared_ptr r, uint32_t surface, uint32_t strip_number) +{ + if (!r) { + return; + } + + for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) { + if ((*s)->number() == surface) { + Strip* strip = (*s)->nth_strip (strip_number); + if (strip) { + strip->set_route (session->master_out()); + strip->lock_route (); + } + } + } +} diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h index 910be0921c..2168bff82a 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.h +++ b/libs/surfaces/mackie/mackie_control_protocol.h @@ -129,6 +129,9 @@ class MackieControlProtocol std::list > bundles (); + void set_master_on_surface_strip (uint32_t surface, uint32_t strip); + void set_monitor_on_surface_strip (uint32_t surface, uint32_t strip); + uint32_t n_strips () const; bool has_editor () const { return true; } @@ -267,6 +270,12 @@ class MackieControlProtocol bool midi_input_handler (Glib::IOCondition ioc, MIDI::Port* port); void clear_ports (); + std::vector _f_actions; + + void force_special_route_to_strip (boost::shared_ptr r, uint32_t surface, uint32_t strip_number); + + /* BUTTON HANDLING */ + struct ButtonHandlers { Mackie::LedState (MackieControlProtocol::*press) (Mackie::Button&); Mackie::LedState (MackieControlProtocol::*release) (Mackie::Button&); @@ -282,8 +291,6 @@ class MackieControlProtocol void build_button_map (); - std::vector _f_actions; - /* implemented button handlers */ Mackie::LedState frm_left_press(Mackie::Button &); Mackie::LedState frm_left_release(Mackie::Button &); diff --git a/libs/surfaces/mackie/strip.cc b/libs/surfaces/mackie/strip.cc index 2b9a7ee99c..42954fae80 100644 --- a/libs/surfaces/mackie/strip.cc +++ b/libs/surfaces/mackie/strip.cc @@ -69,6 +69,7 @@ Strip::Strip (Surface& s, const std::string& name, int index, StripControlDefini , _gain (0) , _index (index) , _surface (&s) + , _route_locked (false) { /* build the controls for this track, which will automatically add them to the Group @@ -250,6 +251,10 @@ std::ostream & Mackie::operator << (std::ostream & os, const Strip & strip) void Strip::set_route (boost::shared_ptr r) { + if (_route_locked) { + return; + } + route_connections.drop_connections (); _route = r; @@ -466,7 +471,13 @@ Strip::handle_button (Button& button, ButtonState bs) } else if (button.id() >= Button::select_base_id && button.id() < Button::select_base_id + 8) { - _surface->mcp().select_track (_route); + int lock_mod = (MackieControlProtocol::MODIFIER_CONTROL|MackieControlProtocol::MODIFIER_SHIFT); + + if ((_surface->mcp().modifier_state() & lock_mod) == lock_mod) { + _route_locked = !_route_locked; + } else { + _surface->mcp().select_track (_route); + } } else if (button.id() >= Button::vselect_base_id && button.id() < Button::vselect_base_id + 8) { @@ -651,3 +662,15 @@ Strip::display (uint32_t line_number, const std::string& line) return retval; } + +void +Strip::lock_route () +{ + _route_locked = true; +} + +void +Strip::unlock_route () +{ + _route_locked = false; +} diff --git a/libs/surfaces/mackie/strip.h b/libs/surfaces/mackie/strip.h index cb2fe67d51..228daf753f 100644 --- a/libs/surfaces/mackie/strip.h +++ b/libs/surfaces/mackie/strip.h @@ -87,6 +87,9 @@ public: MidiByteArray blank_display (uint32_t line_number); MidiByteArray zero (); + void lock_route (); + void unlock_route (); + private: Button* _solo; Button* _recenable; @@ -99,6 +102,7 @@ private: Meter* _meter; int _index; Surface* _surface; + bool _route_locked; boost::shared_ptr _route; PBD::ScopedConnectionList route_connections;