X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fsurfaces%2Fmackie%2Fsurface.cc;h=fdb4d666b0240873033ed5a83a490821e8a182c0;hb=d0668e55114be299cbf5e348c73588756e931cfe;hp=654cd60ac457df37d42316279f5a37f14ec309d0;hpb=5461b50cdb7a488ff7e5f38482067fecdd9129e0;p=ardour.git diff --git a/libs/surfaces/mackie/surface.cc b/libs/surfaces/mackie/surface.cc index 654cd60ac4..fdb4d666b0 100644 --- a/libs/surfaces/mackie/surface.cc +++ b/libs/surfaces/mackie/surface.cc @@ -25,6 +25,8 @@ #include +#include "pbd/stacktrace.h" + #include "midi++/port.h" #include "ardour/audioengine.h" @@ -33,6 +35,7 @@ #include "ardour/route.h" #include "ardour/panner.h" #include "ardour/panner_shell.h" +#include "ardour/profile.h" #include "ardour/rc_configuration.h" #include "ardour/session.h" #include "ardour/utils.h" @@ -64,7 +67,7 @@ using namespace std; using namespace PBD; using ARDOUR::Route; using ARDOUR::Panner; -using ARDOUR::Pannable; +using ARDOUR::Profile; using ARDOUR::AutomationControl; using namespace ArdourSurface; using namespace Mackie; @@ -363,6 +366,14 @@ Surface::init_strips (uint32_t n) } } +void +Surface::master_monitor_may_have_changed () +{ + if (_number == _mcp.device_info().master_position()) { + setup_master (); + } +} + void Surface::setup_master () { @@ -373,28 +384,37 @@ Surface::setup_master () } if (!m) { + _master_fader->set_control (boost::shared_ptr()); + master_connection.disconnect (); return; } - _master_fader = dynamic_cast (Fader::factory (*this, _mcp.device_info().strip_cnt(), "master", *groups["master"])); + if (!_master_fader) { + _master_fader = dynamic_cast (Fader::factory (*this, _mcp.device_info().strip_cnt(), "master", *groups["master"])); + + Groups::iterator group_it; + group_it = groups.find("master"); + + DeviceInfo device_info = _mcp.device_info(); + GlobalButtonInfo master_button = device_info.get_global_button(Button::MasterFaderTouch); + Button* bb = dynamic_cast (Button::factory ( + *this, + Button::MasterFaderTouch, + master_button.id, + master_button.label, + *(group_it->second) + )); + + DEBUG_TRACE (DEBUG::MackieControl, string_compose ("surface %1 Master Fader new button BID %2 id %3\n", + number(), Button::MasterFaderTouch, bb->id())); + } else { + master_connection.disconnect (); + } _master_fader->set_control (m->gain_control()); - m->gain_control()->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&Surface::master_gain_changed, this), ui_context()); - - Groups::iterator group_it; - group_it = groups.find("master"); - - DeviceInfo device_info = _mcp.device_info(); - GlobalButtonInfo master_button = device_info.get_global_button(Button::MasterFaderTouch); - Button* bb = dynamic_cast (Button::factory ( - *this, - Button::MasterFaderTouch, - master_button.id, - master_button.label, - *(group_it->second) -)); - DEBUG_TRACE (DEBUG::MackieControl, string_compose ("surface %1 Master Fader new button BID %2 id %3\n", - number(), Button::MasterFaderTouch, bb->id())); + m->gain_control()->Changed.connect (master_connection, MISSING_INVALIDATOR, boost::bind (&Surface::master_gain_changed, this), ui_context()); + _last_master_gain_written = FLT_MAX; /* some essentially impossible value */ + master_gain_changed (); } void @@ -509,14 +529,6 @@ Surface::handle_midi_pitchbend_message (MIDI::Parser&, MIDI::pitchbend_t pb, uin turn_it_on (); } - if (_mcp.main_modifier_state() & MackieControlProtocol::MODIFIER_SHIFT) { - /* user is doing a reset to unity gain but device sends a PB - * message in the middle of the touch on/off messages. Ignore - * it. - */ - return; - } - Fader* fader = faders[fader_id]; if (fader) { @@ -776,7 +788,7 @@ Surface::turn_it_on () (*s)->notify_all (); } - update_view_mode_display (); + update_view_mode_display (false); if (_mcp.device_info ().has_global_controls ()) { _mcp.update_global_button (Button::Read, _mcp.metering_active ()); @@ -925,8 +937,6 @@ Surface::map_routes (const vector >& routes) for (; s != strips.end(); ++s) { (*s)->set_route (boost::shared_ptr()); } - - } static char @@ -1009,11 +1019,11 @@ void Surface::update_flip_mode_display () { for (Strips::iterator s = strips.begin(); s != strips.end(); ++s) { - (*s)->flip_mode_changed (true); + (*s)->potmode_changed (true); } } - void +void Surface::update_potmode () { for (Strips::iterator s = strips.begin(); s != strips.end(); ++s) { @@ -1022,7 +1032,15 @@ Surface::update_potmode () } void -Surface::update_view_mode_display () +Surface::subview_mode_changed () +{ + for (Strips::iterator s = strips.begin(); s != strips.end(); ++s) { + (*s)->subview_mode_changed (); + } +} + +void +Surface::update_view_mode_display (bool with_helpful_text) { string text; int id = -1; @@ -1055,13 +1073,27 @@ Surface::update_view_mode_display () case MackieControlProtocol::Busses: show_two_char_display ("BS"); id = Button::Busses; - text = _("Busses"); + if (Profile->get_mixbus()) { + text = _("Mixbusses"); + } else { + text = _("Busses"); + } break; case MackieControlProtocol::Auxes: - show_two_char_display ("AB"); + show_two_char_display ("Au"); id = Button::Aux; text = _("Auxes"); break; + case MackieControlProtocol::Hidden: + show_two_char_display ("HI"); + id = Button::Outputs; + text = _("Hidden Tracks"); + break; + case MackieControlProtocol::Selected: + show_two_char_display ("SE"); + id = Button::User; + text = _("Selected Tracks"); + break; default: break; } @@ -1073,6 +1105,8 @@ Surface::update_view_mode_display () view_mode_buttons.push_back (Button::AudioTracks); view_mode_buttons.push_back (Button::MidiTracks); view_mode_buttons.push_back (Button::Aux); + view_mode_buttons.push_back (Button::Outputs); + view_mode_buttons.push_back (Button::User); if (id >= 0) { @@ -1091,7 +1125,7 @@ Surface::update_view_mode_display () } } - if (!text.empty()) { + if (with_helpful_text && !text.empty()) { display_message_for (text, 1000); } } @@ -1139,6 +1173,18 @@ Surface::route_is_locked_to_strip (boost::shared_ptr r) const return false; } +bool +Surface::route_is_mapped (boost::shared_ptr r) const +{ + for (Strips::const_iterator s = strips.begin(); s != strips.end(); ++s) { + if ((*s)->route() == r) { + return true; + } + } + + return false; +} + void Surface::notify_metering_state_changed() {