diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2015-10-13 15:34:53 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2015-10-13 15:34:53 -0400 |
commit | 53a28c230adc1182f5b22ea6975aef9e12859511 (patch) | |
tree | eb57c8f770b114ebed257553d8ed92a870330edd | |
parent | 2d270094100dd3ec18a552cc9f40057706c3d519 (diff) |
mackie support omnibus patch
Fixes all kinds of miscellaneous issues with MCP. Also removes several theoretical pan modes, replace "Tracks"
pan mode with "Trim", and takes a tiny step towards view modes
-rw-r--r-- | libs/surfaces/mackie/device_info.cc | 6 | ||||
-rw-r--r-- | libs/surfaces/mackie/mackie_control_protocol.cc | 85 | ||||
-rw-r--r-- | libs/surfaces/mackie/mackie_control_protocol.h | 8 | ||||
-rw-r--r-- | libs/surfaces/mackie/mcp_buttons.cc | 44 | ||||
-rw-r--r-- | libs/surfaces/mackie/strip.cc | 17 | ||||
-rw-r--r-- | libs/surfaces/mackie/strip.h | 2 | ||||
-rw-r--r-- | libs/surfaces/mackie/surface.cc | 53 |
7 files changed, 129 insertions, 86 deletions
diff --git a/libs/surfaces/mackie/device_info.cc b/libs/surfaces/mackie/device_info.cc index 2fcd5abf06..b94cb05544 100644 --- a/libs/surfaces/mackie/device_info.cc +++ b/libs/surfaces/mackie/device_info.cc @@ -449,6 +449,12 @@ DeviceInfo::has_meters() const } bool +DeviceInfo::has_separate_meters() const +{ + return _has_meters; +} + +bool DeviceInfo::has_two_character_display() const { return _has_two_character_display; diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc index 5f35dda080..9e1a2bbce7 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.cc +++ b/libs/surfaces/mackie/mackie_control_protocol.cc @@ -279,10 +279,7 @@ MackieControlProtocol::get_sorted_routes() if (route_is_locked_to_strip(route)) { continue; } - /* This next section which is not used yet, looks wrong to me - The first four belong here but the bottom five are not a selection - of routes and belong elsewhere as they are v-pot modes. - */ + switch (_view_mode) { case Mixer: break; @@ -292,7 +289,9 @@ MackieControlProtocol::get_sorted_routes() break; case MidiTracks: break; - case Loop: + case Plugins: + break; + case Auxes: break; } @@ -531,17 +530,21 @@ MackieControlProtocol::update_timecode_beats_led() void MackieControlProtocol::update_global_button (int id, LedState ls) { - Glib::Threads::Mutex::Lock lm (surfaces_lock); + boost::shared_ptr<Surface> surface; - if (surfaces.empty()) { - return; - } + { + Glib::Threads::Mutex::Lock lm (surfaces_lock); - if (!_device_info.has_global_controls()) { - return; + if (surfaces.empty()) { + return; + } + + if (!_device_info.has_global_controls()) { + return; + } + // surface needs to be master surface + surface = _master_surface; } - // surface needs to be master surface - boost::shared_ptr<Surface> surface = _master_surface; map<int,Control*>::iterator x = surface->controls_by_device_independent_id.find (id); if (x != surface->controls_by_device_independent_id.end()) { @@ -704,7 +707,12 @@ MackieControlProtocol::set_device (const string& device_name, bool force) we will have its state available. */ - update_configuration_state (); + { + Glib::Threads::Mutex::Lock lm (surfaces_lock); + if (!surfaces.empty()) { + update_configuration_state (); + } + } if (set_device_info (device_name)) { return -1; @@ -807,9 +815,9 @@ MackieControlProtocol::create_surfaces () } } if (this_device) { - XMLNode* surfaces = this_device->child (X_("Surfaces")); - if (surfaces) { - surface->set_state (*surfaces, state_version); + XMLNode* snode = this_device->child (X_("Surfaces")); + if (snode) { + surface->set_state (*snode, state_version); } } } @@ -911,6 +919,8 @@ MackieControlProtocol::close() void MackieControlProtocol::update_configuration_state () { + /* CALLER MUST HOLD SURFACES LOCK */ + if (!configuration_state) { configuration_state = new XMLNode (X_("Configurations")); } @@ -922,14 +932,12 @@ MackieControlProtocol::update_configuration_state () configuration_state->add_child_nocopy (*devnode); XMLNode* snode = new XMLNode (X_("Surfaces")); - devnode->add_child_nocopy (*snode); - { - Glib::Threads::Mutex::Lock lm (surfaces_lock); - for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) { - snode->add_child_nocopy ((*s)->get_state()); - } + for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) { + snode->add_child_nocopy ((*s)->get_state()); } + + devnode->add_child_nocopy (*snode); } XMLNode& @@ -951,7 +959,10 @@ MackieControlProtocol::get_state() node.add_property (X_("device-profile"), _device_profile.name()); node.add_property (X_("device-name"), _device_info.name()); - update_configuration_state (); + { + Glib::Threads::Mutex::Lock lm (surfaces_lock); + update_configuration_state (); + } /* force a copy of the _surfaces_state node, because we want to retain ownership */ node.add_child_copy (*configuration_state); @@ -1552,15 +1563,33 @@ MackieControlProtocol::set_flip_mode (FlipMode fm) void MackieControlProtocol::set_pot_mode (PotMode m) { - Glib::Threads::Mutex::Lock lm (surfaces_lock); - _pot_mode = m; - for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) { - (*s)->update_potmode (); + { + Glib::Threads::Mutex::Lock lm (surfaces_lock); + for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) { + (*s)->update_potmode (); + + } } + switch (_pot_mode) { + case Trim: + update_global_button (Button::Track, on); + update_global_button (Button::Send, off); + update_global_button (Button::Pan, off); + break; + case Send: + update_global_button (Button::Track, off); + update_global_button (Button::Send, on); + update_global_button (Button::Pan, off); + break; + case Pan: + update_global_button (Button::Track, off); + update_global_button (Button::Send, off); + update_global_button (Button::Pan, on); + }; } void diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h index 530f328951..6e58f07946 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.h +++ b/libs/surfaces/mackie/mackie_control_protocol.h @@ -103,19 +103,17 @@ class MackieControlProtocol enum ViewMode { Mixer, - Loop, AudioTracks, MidiTracks, Busses, + Auxes, + Plugins, }; enum PotMode { - Tracks, + Trim, Send, Pan, - PlugIn, - EQ, - Instrument, }; enum FlipMode { diff --git a/libs/surfaces/mackie/mcp_buttons.cc b/libs/surfaces/mackie/mcp_buttons.cc index 781370a79e..a2bcdf7f4c 100644 --- a/libs/surfaces/mackie/mcp_buttons.cc +++ b/libs/surfaces/mackie/mcp_buttons.cc @@ -504,13 +504,9 @@ MackieControlProtocol::ffwd_release (Button &) LedState MackieControlProtocol::loop_press (Button &) { - if (main_modifier_state() & MODIFIER_CONTROL) { - set_view_mode (Loop); - return on; - } else { - session->request_play_loop (!session->get_play_loop()); - return none; - } + bool was_on = session->get_play_loop(); + session->request_play_loop (!was_on); + return was_on ? off : on; } LedState @@ -660,13 +656,7 @@ LedState MackieControlProtocol::pan_press (Button &) { set_pot_mode (Pan); - update_global_button (Button::Track, off); - update_global_button (Button::Send, off); - update_global_button (Button::Plugin, off); - update_global_button (Button::Eq, off); - update_global_button (Button::Dyn, off); - return on; - + return none; } LedState MackieControlProtocol::pan_release (Button &) @@ -681,7 +671,8 @@ MackieControlProtocol::plugin_press (Button &) LedState MackieControlProtocol::plugin_release (Button &) { - return none; + set_view_mode (Plugins); + return none; /* LED state set by set_view_mode */ } LedState MackieControlProtocol::eq_press (Button &) @@ -837,14 +828,8 @@ MackieControlProtocol::clearsolo_release (Mackie::Button&) Mackie::LedState MackieControlProtocol::track_press (Mackie::Button&) { - set_pot_mode (Tracks); - update_global_button (Button::Pan, off); - update_global_button (Button::Send, off); - update_global_button (Button::Plugin, off); - update_global_button (Button::Eq, off); - update_global_button (Button::Dyn, off); - return on; - + set_pot_mode (Trim); + return none; } Mackie::LedState MackieControlProtocol::track_release (Mackie::Button&) @@ -854,15 +839,10 @@ MackieControlProtocol::track_release (Mackie::Button&) Mackie::LedState MackieControlProtocol::send_press (Mackie::Button&) { - return off; + return none; // remove above line when sends implemented set_pot_mode (Send); - update_global_button (Button::Track, off); - update_global_button (Button::Pan, off); - update_global_button (Button::Plugin, off); - update_global_button (Button::Eq, off); - update_global_button (Button::Dyn, off); - return on; + return none; } Mackie::LedState MackieControlProtocol::send_release (Mackie::Button&) @@ -877,6 +857,7 @@ MackieControlProtocol::miditracks_press (Mackie::Button&) Mackie::LedState MackieControlProtocol::miditracks_release (Mackie::Button&) { + set_view_mode (MidiTracks); return none; } Mackie::LedState @@ -897,6 +878,7 @@ MackieControlProtocol::audiotracks_press (Mackie::Button&) Mackie::LedState MackieControlProtocol::audiotracks_release (Mackie::Button&) { + set_view_mode (AudioTracks); return none; } Mackie::LedState @@ -917,6 +899,7 @@ MackieControlProtocol::aux_press (Mackie::Button&) Mackie::LedState MackieControlProtocol::aux_release (Mackie::Button&) { + set_view_mode (Auxes); return none; } Mackie::LedState @@ -927,6 +910,7 @@ MackieControlProtocol::busses_press (Mackie::Button&) Mackie::LedState MackieControlProtocol::busses_release (Mackie::Button&) { + set_view_mode (Busses); return none; } Mackie::LedState diff --git a/libs/surfaces/mackie/strip.cc b/libs/surfaces/mackie/strip.cc index bf9e33d1b4..7f4cda8d19 100644 --- a/libs/surfaces/mackie/strip.cc +++ b/libs/surfaces/mackie/strip.cc @@ -797,7 +797,9 @@ Strip::periodic (ARDOUR::microseconds_t now) } if (_block_screen_redisplay_until >= now) { - + if (_surface->mcp().device_info().has_separate_meters()) { + goto meters; + } /* no drawing here, for now */ return; @@ -832,6 +834,7 @@ Strip::periodic (ARDOUR::microseconds_t now) update_automation (); } + meters: update_meter (); } @@ -1014,25 +1017,23 @@ Strip::potmode_changed (bool notify) block_vpot_mode_display_for (1000); return; } + // WIP int pm = _surface->mcp().pot_mode(); switch (pm) { case MackieControlProtocol::Pan: // This needs to set current pan mode (azimuth or width... or whatever) set_vpot_parameter (_pan_mode); - DEBUG_TRACE (DEBUG::MackieControl, "Assign pot to Pan mode.\n"); + DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Assign pot to Pan mode %1\n", enum_2_string (_pan_mode))); break; - case MackieControlProtocol::Tracks: // should change the Tracks to Trim + case MackieControlProtocol::Trim: DEBUG_TRACE (DEBUG::MackieControl, "Assign pot to Trim mode.\n"); - set_vpot_parameter (TrimAutomation); - break; + set_vpot_parameter (TrimAutomation); + break; case MackieControlProtocol::Send: DEBUG_TRACE (DEBUG::MackieControl, "Assign pot to Send mode.\n"); // set to current send break; - default: - cerr << "Pot mode " << pm << " not yet handled\n"; - break; } if (notify) { diff --git a/libs/surfaces/mackie/strip.h b/libs/surfaces/mackie/strip.h index f0c972aa73..29920b8aba 100644 --- a/libs/surfaces/mackie/strip.h +++ b/libs/surfaces/mackie/strip.h @@ -109,7 +109,7 @@ private: boost::shared_ptr<ARDOUR::Route> _route; PBD::ScopedConnectionList route_connections; - int _pan_mode; + ARDOUR::AutomationType _pan_mode; float _last_gain_position_written; float _last_pan_azi_position_written; diff --git a/libs/surfaces/mackie/surface.cc b/libs/surfaces/mackie/surface.cc index 1ef37672c6..8c4c10a336 100644 --- a/libs/surfaces/mackie/surface.cc +++ b/libs/surfaces/mackie/surface.cc @@ -1032,40 +1032,65 @@ Surface::update_view_mode_display () switch (_mcp.view_mode()) { case MackieControlProtocol::Mixer: show_two_char_display ("Mx"); - //id = Button::Pan; - break; - case MackieControlProtocol::Loop: - show_two_char_display ("LP"); - id = Button::Loop; + id = Button::Track; + text = _("Mixer View"); break; case MackieControlProtocol::AudioTracks: show_two_char_display ("AT"); + id = Button::AudioTracks; + text = _("Audio Tracks"); break; case MackieControlProtocol::MidiTracks: show_two_char_display ("MT"); + id = Button::MidiTracks; + text = _("MIDI Tracks"); + break; + case MackieControlProtocol::Plugins: + show_two_char_display ("PL"); + id = Button::Plugin; + text = _("Plugins"); + break; + case MackieControlProtocol::Busses: + show_two_char_display ("BS"); + id = Button::Busses; + text = _("Busses"); + break; + case MackieControlProtocol::Auxes: + show_two_char_display ("AB"); + id = Button::Aux; + text = _("Auxes"); break; default: break; } + vector<int> view_mode_buttons; + view_mode_buttons.push_back (Button::Track); + view_mode_buttons.push_back (Button::Busses); + view_mode_buttons.push_back (Button::Plugin); + view_mode_buttons.push_back (Button::AudioTracks); + view_mode_buttons.push_back (Button::MidiTracks); + view_mode_buttons.push_back (Button::Aux); + if (id >= 0) { - /* we are attempting to turn a global button/LED on */ + for (vector<int>::iterator i = view_mode_buttons.begin(); i != view_mode_buttons.end(); ++i) { + map<int,Control*>::iterator x = controls_by_device_independent_id.find (id); - map<int,Control*>::iterator x = controls_by_device_independent_id.find (id); + if (x != controls_by_device_independent_id.end()) { + Button* button = dynamic_cast<Button*> (x->second); + if (button) { + bool onoff; + onoff = (*i) == id; - if (x != controls_by_device_independent_id.end()) { - Button* button = dynamic_cast<Button*> (x->second); - if (button) { - _port->write (button->set_state (on)); + _port->write (button->set_state (onoff)); + } } } } if (!text.empty()) { - for (Strips::iterator s = strips.begin(); s != strips.end(); ++s) { - _port->write ((*s)->display (1, text)); - } + display_message_for (text, 1000); } } |