X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fsurfaces%2Fmackie%2Fstrip.cc;h=c43875028916d0c9ce9872f8d8bf372684b4738a;hb=a8d7b0fca3d11954f079e7216f0a8803b688b25c;hp=893c3903cdd67ddc0b7ff1c1c5ea1366d15d43fe;hpb=8df1baa659527610d2929a7bb5269b1f6d36e2a6;p=ardour.git diff --git a/libs/surfaces/mackie/strip.cc b/libs/surfaces/mackie/strip.cc index 893c3903cd..c438750289 100644 --- a/libs/surfaces/mackie/strip.cc +++ b/libs/surfaces/mackie/strip.cc @@ -37,14 +37,18 @@ #include "ardour/debug.h" #include "ardour/midi_ui.h" #include "ardour/meter.h" +#include "ardour/monitor_control.h" #include "ardour/plugin_insert.h" #include "ardour/pannable.h" #include "ardour/panner.h" #include "ardour/panner_shell.h" +#include "ardour/phase_control.h" #include "ardour/rc_configuration.h" +#include "ardour/record_enable_control.h" #include "ardour/route.h" #include "ardour/session.h" #include "ardour/send.h" +#include "ardour/solo_isolate_control.h" #include "ardour/track.h" #include "ardour/midi_track.h" #include "ardour/user_bundle.h" @@ -163,7 +167,7 @@ Strip::add (Control & control) } void -Strip::set_route (boost::shared_ptr r, bool /*with_messages*/) +Strip::set_stripable (boost::shared_ptr r, bool /*with_messages*/) { if (_controls_locked) { return; @@ -171,7 +175,7 @@ Strip::set_route (boost::shared_ptr r, bool /*with_messages*/) mb_pan_controllable.reset(); - route_connections.drop_connections (); + stripable_connections.drop_connections (); _solo->set_control (boost::shared_ptr()); _mute->set_control (boost::shared_ptr()); @@ -180,69 +184,68 @@ Strip::set_route (boost::shared_ptr r, bool /*with_messages*/) _fader->set_control (boost::shared_ptr()); _vpot->set_control (boost::shared_ptr()); - _route = r; + _stripable = r; reset_saved_values (); if (!r) { + DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Surface %1 Strip %2 mapped to null route\n", _surface->number(), _index)); zero (); return; } - DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Surface %1 strip %2 now mapping route %3\n", - _surface->number(), _index, _route->name())); + DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Surface %1 strip %2 now mapping stripable %3\n", + _surface->number(), _index, _stripable->name())); - _solo->set_control (_route->solo_control()); - _mute->set_control (_route->mute_control()); + _solo->set_control (_stripable->solo_control()); + _mute->set_control (_stripable->mute_control()); - _route->solo_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_solo_changed, this), ui_context()); - _route->listen_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_solo_changed, this), ui_context()); + _stripable->solo_control()->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_solo_changed, this), ui_context()); + _stripable->mute_control()->Changed.connect(stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_mute_changed, this), ui_context()); - _route->mute_control()->Changed.connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_mute_changed, this), ui_context()); - - boost::shared_ptr pan_control = _route->pan_azimuth_control(); + boost::shared_ptr pan_control = _stripable->pan_azimuth_control(); if (pan_control) { - pan_control->Changed.connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_panner_azi_changed, this, false), ui_context()); + pan_control->Changed.connect(stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_panner_azi_changed, this, false), ui_context()); } - pan_control = _route->pan_width_control(); + pan_control = _stripable->pan_width_control(); if (pan_control) { - pan_control->Changed.connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_panner_width_changed, this, false), ui_context()); + pan_control->Changed.connect(stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_panner_width_changed, this, false), ui_context()); } - _route->gain_control()->Changed.connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_gain_changed, this, false), ui_context()); - _route->PropertyChanged.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_property_changed, this, _1), ui_context()); + _stripable->gain_control()->Changed.connect(stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_gain_changed, this, false), ui_context()); + _stripable->PropertyChanged.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_property_changed, this, _1), ui_context()); + _stripable->presentation_info().PropertyChanged.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_property_changed, this, _1), ui_context()); - boost::shared_ptr trk = boost::dynamic_pointer_cast(_route); + boost::shared_ptr rec_enable_control = _stripable->rec_enable_control (); - if (trk) { - _recenable->set_control (trk->rec_enable_control()); - trk->rec_enable_control()->Changed .connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_record_enable_changed, this), ui_context()); + if (rec_enable_control) { + _recenable->set_control (rec_enable_control); + rec_enable_control->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_record_enable_changed, this), ui_context()); } - // TODO this works when a currently-banked route is made inactive, but not - // when a route is activated which should be currently banked. + // TODO this works when a currently-banked stripable is made inactive, but not + // when a stripable is activated which should be currently banked. - _route->active_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_active_changed, this), ui_context()); - _route->DropReferences.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_route_deleted, this), ui_context()); + _stripable->DropReferences.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_stripable_deleted, this), ui_context()); - /* setup legal VPot modes for this route */ + /* setup legal VPot modes for this stripable */ possible_pot_parameters.clear(); - if (_route->pan_azimuth_control()) { + if (_stripable->pan_azimuth_control()) { possible_pot_parameters.push_back (PanAzimuthAutomation); } - if (_route->pan_width_control()) { + if (_stripable->pan_width_control()) { possible_pot_parameters.push_back (PanWidthAutomation); } - if (_route->pan_elevation_control()) { + if (_stripable->pan_elevation_control()) { possible_pot_parameters.push_back (PanElevationAutomation); } - if (_route->pan_frontback_control()) { + if (_stripable->pan_frontback_control()) { possible_pot_parameters.push_back (PanFrontBackAutomation); } - if (_route->pan_lfe_control()) { + if (_stripable->pan_lfe_control()) { possible_pot_parameters.push_back (PanLFEAutomation); } @@ -252,7 +255,7 @@ Strip::set_route (boost::shared_ptr r, bool /*with_messages*/) set_vpot_parameter (_pan_mode); } - _fader->set_control (_route->gain_control()); + _fader->set_control (_stripable->gain_control()); notify_all (); } @@ -260,7 +263,7 @@ Strip::set_route (boost::shared_ptr r, bool /*with_messages*/) void Strip::notify_all() { - if (!_route) { + if (!_stripable) { zero (); return; } @@ -273,6 +276,7 @@ Strip::notify_all() notify_mute_changed (); notify_gain_changed (); notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::name)); + notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::selected)); notify_panner_azi_changed (); notify_panner_width_changed (); notify_record_enable_changed (); @@ -282,8 +286,8 @@ Strip::notify_all() void Strip::notify_solo_changed () { - if (_route && _solo) { - _surface->write (_solo->set_state ((_route->soloed() || _route->listening_via_monitor()) ? on : off)); + if (_stripable && _solo) { + _surface->write (_solo->set_state (_stripable->solo_control()->soloed() ? on : off)); } } @@ -291,42 +295,40 @@ void Strip::notify_mute_changed () { DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Strip %1 mute changed\n", _index)); - if (_route && _mute) { - DEBUG_TRACE (DEBUG::MackieControl, string_compose ("\troute muted ? %1\n", _route->muted())); - DEBUG_TRACE (DEBUG::MackieControl, string_compose ("mute message: %1\n", _mute->set_state (_route->muted() ? on : off))); + if (_stripable && _mute) { + DEBUG_TRACE (DEBUG::MackieControl, string_compose ("\tstripable muted ? %1\n", _stripable->mute_control()->muted())); + DEBUG_TRACE (DEBUG::MackieControl, string_compose ("mute message: %1\n", _mute->set_state (_stripable->mute_control()->muted() ? on : off))); - _surface->write (_mute->set_state (_route->muted() ? on : off)); + _surface->write (_mute->set_state (_stripable->mute_control()->muted() ? on : off)); } } void Strip::notify_record_enable_changed () { - if (_route && _recenable) { - _surface->write (_recenable->set_state (_route->record_enabled() ? on : off)); + if (_stripable && _recenable) { + boost::shared_ptr trk = boost::dynamic_pointer_cast (_stripable); + if (trk) { + _surface->write (_recenable->set_state (trk->rec_enable_control()->get_value() ? on : off)); + } } } void -Strip::notify_active_changed () -{ - _surface->mcp().refresh_current_bank(); -} - -void -Strip::notify_route_deleted () +Strip::notify_stripable_deleted () { + _surface->mcp().notify_stripable_removed (); _surface->mcp().refresh_current_bank(); } void Strip::notify_gain_changed (bool force_update) { - if (!_route) { + if (!_stripable) { return; } - boost::shared_ptr ac = _route->gain_control(); + boost::shared_ptr ac = _stripable->gain_control(); Control* control; if (!ac) { @@ -372,15 +374,20 @@ Strip::notify_processor_changed (bool force_update) void Strip::notify_property_changed (const PropertyChange& what_changed) { - if (!what_changed.contains (ARDOUR::Properties::name)) { - return; + if (what_changed.contains (ARDOUR::Properties::name)) { + show_stripable_name (); } - show_route_name (); + if (what_changed.contains (ARDOUR::Properties::selected)) { + if (_stripable) { + _surface->write (_select->set_state (_stripable->presentation_info().selected())); + _surface->mcp().update_selected (_stripable, _stripable->presentation_info().selected()); + } + } } void -Strip::show_route_name () +Strip::show_stripable_name () { MackieControlProtocol::SubViewMode svm = _surface->mcp().subview_mode(); @@ -390,29 +397,23 @@ Strip::show_route_name () } string fullname = string(); - if (!_route) { - // make sure first three strips get cleared of view mode - if (_index > 2) { - return; - } + if (!_stripable) { + fullname = string(); } else { - fullname = _route->name(); + fullname = _stripable->name(); } - string line1; if (fullname.length() <= 6) { - line1 = fullname; + pending_display[0] = fullname; } else { - line1 = PBD::short_version (fullname, 6); + pending_display[0] = PBD::short_version (fullname, 6); } - - pending_display[0] = line1; } void Strip::notify_send_level_change (AutomationType type, uint32_t send_num, bool force_update) { - boost::shared_ptr r = _surface->mcp().subview_route(); + boost::shared_ptr r = _surface->mcp().subview_stripable(); if (!r) { /* not in subview mode */ @@ -443,7 +444,7 @@ Strip::notify_send_level_change (AutomationType type, uint32_t send_num, bool fo void Strip::notify_trackview_change (AutomationType type, uint32_t send_num, bool force_update) { - boost::shared_ptr r = _surface->mcp().subview_route(); + boost::shared_ptr r = _surface->mcp().subview_stripable(); if (!r) { /* not in subview mode */ @@ -497,7 +498,7 @@ Strip::notify_trackview_change (AutomationType type, uint32_t send_num, bool for void Strip::notify_eq_change (AutomationType type, uint32_t band, bool force_update) { - boost::shared_ptr r = _surface->mcp().subview_route(); + boost::shared_ptr r = _surface->mcp().subview_stripable(); if (!r) { /* not in subview mode */ @@ -545,7 +546,7 @@ Strip::notify_eq_change (AutomationType type, uint32_t band, bool force_update) void Strip::notify_dyn_change (AutomationType type, bool force_update, bool propagate_mode) { - boost::shared_ptr r = _surface->mcp().subview_route(); + boost::shared_ptr r = _surface->mcp().subview_stripable(); if (!r) { /* not in subview mode */ @@ -599,13 +600,13 @@ Strip::notify_dyn_change (AutomationType type, bool force_update, bool propagate void Strip::notify_panner_azi_changed (bool force_update) { - if (!_route) { + if (!_stripable) { return; } DEBUG_TRACE (DEBUG::MackieControl, string_compose ("pan change for strip %1\n", _index)); - boost::shared_ptr pan_control = _route->pan_azimuth_control (); + boost::shared_ptr pan_control = _stripable->pan_azimuth_control (); if (!pan_control) { /* basically impossible, since we're here because that control @@ -634,13 +635,13 @@ Strip::notify_panner_azi_changed (bool force_update) void Strip::notify_panner_width_changed (bool force_update) { - if (!_route) { + if (!_stripable) { return; } DEBUG_TRACE (DEBUG::MackieControl, string_compose ("pan width change for strip %1\n", _index)); - boost::shared_ptr pan_control = _route->pan_width_control (); + boost::shared_ptr pan_control = _stripable->pan_width_control (); if (!pan_control) { /* basically impossible, since we're here because that control @@ -738,7 +739,7 @@ Strip::vselect_event (Button&, ButtonState bs) * explicitly. */ - boost::shared_ptr r = _surface->mcp().subview_route(); + boost::shared_ptr r = _surface->mcp().subview_stripable(); if (r) { @@ -763,7 +764,7 @@ Strip::vselect_event (Button&, ButtonState bs) } else { /* we just turned it on, show the level */ - control = _route->send_level_controllable (global_pos); + control = _stripable->send_level_controllable (global_pos); do_parameter_display (BusSendLevel, control->get_value()); } } @@ -792,8 +793,8 @@ Strip::vselect_event (Button&, ButtonState bs) } else { #ifdef MIXBUS - if (_route) { - boost::shared_ptr ac = _route->master_send_enable_controllable (); + if (_stripable) { + boost::shared_ptr ac = _stripable->master_send_enable_controllable (); if (ac) { Controllable::GroupControlDisposition gcd; @@ -918,7 +919,6 @@ Strip::do_parameter_display (AutomationType type, float val) switch (type) { case GainAutomation: - case BusSendLevel: if (val == 0.0) { pending_display[1] = " -inf "; } else { @@ -929,16 +929,33 @@ Strip::do_parameter_display (AutomationType type, float val) } break; + case BusSendLevel: + if (Profile->get_mixbus()) { //Mixbus sends are already stored in dB + snprintf (buf, sizeof (buf), "%2.1f", val); + pending_display[1] = buf; + screen_hold = true; + } else { + if (val == 0.0) { + pending_display[1] = " -inf "; + } else { + float dB = accurate_coefficient_to_dB (val); + snprintf (buf, sizeof (buf), "%6.1f", dB); + pending_display[1] = buf; + screen_hold = true; + } + } + break; + case PanAzimuthAutomation: if (Profile->get_mixbus()) { snprintf (buf, sizeof (buf), "%2.1f", val); pending_display[1] = buf; screen_hold = true; } else { - if (_route) { - boost::shared_ptr p = _route->pannable(); - if (p && _route->panner()) { - pending_display[1] =_route->panner()->value_as_string (p->pan_azimuth_control); + if (_stripable) { + boost::shared_ptr pa = _stripable->pan_azimuth_control(); + if (pa) { + pending_display[1] = pa->get_user_string (); screen_hold = true; } } @@ -946,7 +963,7 @@ Strip::do_parameter_display (AutomationType type, float val) break; case PanWidthAutomation: - if (_route) { + if (_stripable) { snprintf (buf, sizeof (buf), "%5ld%%", lrintf ((val * 200.0)-100)); pending_display[1] = buf; screen_hold = true; @@ -954,7 +971,7 @@ Strip::do_parameter_display (AutomationType type, float val) break; case TrimAutomation: - if (_route) { + if (_stripable) { float dB = accurate_coefficient_to_dB (val); snprintf (buf, sizeof (buf), "%6.1f", dB); pending_display[1] = buf; @@ -963,7 +980,7 @@ Strip::do_parameter_display (AutomationType type, float val) break; case PhaseAutomation: - if (_route) { + if (_stripable) { if (val < 0.5) { pending_display[1] = "Normal"; } else { @@ -995,8 +1012,8 @@ Strip::do_parameter_display (AutomationType type, float val) } break; case CompMode: - if (_surface->mcp().subview_route()) { - pending_display[1] = _surface->mcp().subview_route()->comp_mode_name (val); + if (_surface->mcp().subview_stripable()) { + pending_display[1] = _surface->mcp().subview_stripable()->comp_mode_name (val); } break; case SoloSafeAutomation: @@ -1177,17 +1194,17 @@ Strip::redisplay (ARDOUR::microseconds_t now, bool force) void Strip::update_automation () { - if (!_route) { + if (!_stripable) { return; } - ARDOUR::AutoState state = _route->gain_control()->automation_state(); + ARDOUR::AutoState state = _stripable->gain_control()->automation_state(); if (state == Touch || state == Play) { notify_gain_changed (false); } - boost::shared_ptr pan_control = _route->pan_azimuth_control (); + boost::shared_ptr pan_control = _stripable->pan_azimuth_control (); if (pan_control) { state = pan_control->automation_state (); if (state == Touch || state == Play) { @@ -1195,7 +1212,7 @@ Strip::update_automation () } } - pan_control = _route->pan_width_control (); + pan_control = _stripable->pan_width_control (); if (pan_control) { state = pan_control->automation_state (); if (state == Touch || state == Play) { @@ -1207,7 +1224,7 @@ Strip::update_automation () void Strip::update_meter () { - if (!_route) { + if (!_stripable) { return; } @@ -1215,8 +1232,8 @@ Strip::update_meter () return; } - if (_meter && _transport_is_rolling && _metering_active) { - float dB = const_cast (_route->peak_meter()).meter_level (0, MeterMCP); + if (_meter && _transport_is_rolling && _metering_active && _stripable->peak_meter()) { + float dB = _stripable->peak_meter()->meter_level (0, MeterMCP); _meter->send_update (*_surface, dB); return; } @@ -1296,19 +1313,6 @@ Strip::unlock_controls () _controls_locked = false; } -void -Strip::gui_selection_changed (const ARDOUR::StrongRouteNotificationList& rl) -{ - for (ARDOUR::StrongRouteNotificationList::const_iterator i = rl.begin(); i != rl.end(); ++i) { - if ((*i) == _route) { - _surface->write (_select->set_state (on)); - return; - } - } - - _surface->write (_select->set_state (off)); -} - string Strip::vpot_mode_string () { @@ -1349,24 +1353,26 @@ Strip::flip_mode_changed () boost::shared_ptr fader_control = _fader->control(); if (pot_control && fader_control) { + _vpot->set_control (fader_control); _fader->set_control (pot_control); - } - if (_surface->mcp().flip_mode() == MackieControlProtocol::Normal) { - do_parameter_display (GainAutomation, fader_control->get_value()); - } else { - do_parameter_display (BusSendLevel, fader_control->get_value()); - } + /* update fader with pot value */ - /* update fader */ + _surface->write (_fader->set_position (pot_control->internal_to_interface (pot_control->get_value ()))); - _surface->write (_fader->set_position (pot_control->internal_to_interface (pot_control->get_value ()))); + /* update pot with fader value */ - /* update pot */ + _surface->write (_vpot->set (fader_control->internal_to_interface (fader_control->get_value()), true, Pot::wrap)); - _surface->write (_vpot->set (fader_control->internal_to_interface (fader_control->get_value()), true, Pot::wrap)); + if (_surface->mcp().flip_mode() == MackieControlProtocol::Normal) { + do_parameter_display (GainAutomation, fader_control->get_value()); + } else { + do_parameter_display (BusSendLevel, pot_control->get_value()); + } + + } } else { /* do nothing */ @@ -1395,7 +1401,7 @@ Strip::return_to_vpot_mode_display () if (_surface->mcp().subview_mode() != MackieControlProtocol::None) { /* do nothing - second line shows value of current subview parameter */ return; - } else if (_route) { + } else if (_stripable) { pending_display[1] = vpot_mode_string(); } else { pending_display[1] = string(); @@ -1455,7 +1461,7 @@ Strip::next_pot_mode () void Strip::subview_mode_changed () { - boost::shared_ptr r = _surface->mcp().subview_route(); + boost::shared_ptr r = _surface->mcp().subview_stripable(); subview_connections.drop_connections (); @@ -1463,7 +1469,11 @@ Strip::subview_mode_changed () case MackieControlProtocol::None: set_vpot_parameter (_pan_mode); /* need to show strip name again */ - show_route_name (); + show_stripable_name (); + if (!_stripable) { + _surface->write (_vpot->set (0, true, Pot::wrap)); + _surface->write (_fader->set_position (0.0)); + } notify_metering_state_changed (); eq_band = -1; break; @@ -1505,7 +1515,7 @@ Strip::subview_mode_changed () } void -Strip::setup_dyn_vpot (boost::shared_ptr r) +Strip::setup_dyn_vpot (boost::shared_ptr r) { if (!r) { return; @@ -1590,7 +1600,7 @@ Strip::setup_dyn_vpot (boost::shared_ptr r) } void -Strip::setup_eq_vpot (boost::shared_ptr r) +Strip::setup_eq_vpot (boost::shared_ptr r) { uint32_t bands = r->eq_band_cnt (); @@ -1725,7 +1735,7 @@ Strip::setup_eq_vpot (boost::shared_ptr r) } void -Strip::setup_sends_vpot (boost::shared_ptr r) +Strip::setup_sends_vpot (boost::shared_ptr r) { if (!r) { return; @@ -1744,13 +1754,13 @@ Strip::setup_sends_vpot (boost::shared_ptr r) pc->Changed.connect (subview_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_send_level_change, this, BusSendLevel, global_pos, false), ui_context()); _vpot->set_control (pc); - pending_display[0] = r->send_name (global_pos); + pending_display[0] = PBD::short_version (r->send_name (global_pos), 6); notify_send_level_change (BusSendLevel, global_pos, true); } void -Strip::setup_trackview_vpot (boost::shared_ptr r) +Strip::setup_trackview_vpot (boost::shared_ptr r) { if (!r) { return; @@ -1834,7 +1844,7 @@ Strip::setup_trackview_vpot (boost::shared_ptr r) void Strip::set_vpot_parameter (AutomationType p) { - if (!_route || (p == NullAutomation)) { + if (!_stripable || (p == NullAutomation)) { _vpot->set_control (boost::shared_ptr()); pending_display[1] = string(); return; @@ -1848,10 +1858,10 @@ Strip::set_vpot_parameter (AutomationType p) switch (p) { case PanAzimuthAutomation: - pan_control = _route->pan_azimuth_control (); + pan_control = _stripable->pan_azimuth_control (); break; case PanWidthAutomation: - pan_control = _route->pan_width_control (); + pan_control = _stripable->pan_width_control (); break; case PanElevationAutomation: break; @@ -1874,7 +1884,7 @@ Strip::set_vpot_parameter (AutomationType p) bool Strip::is_midi_track () const { - return boost::dynamic_pointer_cast(_route) != 0; + return boost::dynamic_pointer_cast(_stripable) != 0; } void @@ -1894,7 +1904,7 @@ Strip::notify_metering_state_changed() return; } - if (!_route || !_meter) { + if (!_stripable || !_meter) { return; }