#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"
}
void
-Strip::set_route (boost::shared_ptr<Route> r, bool /*with_messages*/)
+Strip::set_stripable (boost::shared_ptr<Stripable> r, bool /*with_messages*/)
{
if (_controls_locked) {
return;
mb_pan_controllable.reset();
- route_connections.drop_connections ();
+ stripable_connections.drop_connections ();
_solo->set_control (boost::shared_ptr<AutomationControl>());
_mute->set_control (boost::shared_ptr<AutomationControl>());
_fader->set_control (boost::shared_ptr<AutomationControl>());
_vpot->set_control (boost::shared_ptr<AutomationControl>());
- _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<AutomationControl> pan_control = _route->pan_azimuth_control();
+ boost::shared_ptr<AutomationControl> 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<Track> trk = boost::dynamic_pointer_cast<ARDOUR::Track>(_route);
+ boost::shared_ptr<AutomationControl> 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);
}
set_vpot_parameter (_pan_mode);
}
- _fader->set_control (_route->gain_control());
+ _fader->set_control (_stripable->gain_control());
notify_all ();
}
void
Strip::notify_all()
{
- if (!_route) {
+ if (!_stripable) {
zero ();
return;
}
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 ();
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));
}
}
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<Track> trk = boost::dynamic_pointer_cast<Track> (_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<AutomationControl> ac = _route->gain_control();
+ boost::shared_ptr<AutomationControl> ac = _stripable->gain_control();
Control* control;
if (!ac) {
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();
}
string fullname = string();
- if (!_route) {
+ 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<Route> r = _surface->mcp().subview_route();
+ boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
if (!r) {
/* not in subview mode */
void
Strip::notify_trackview_change (AutomationType type, uint32_t send_num, bool force_update)
{
- boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+ boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
if (!r) {
/* not in subview mode */
void
Strip::notify_eq_change (AutomationType type, uint32_t band, bool force_update)
{
- boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+ boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
if (!r) {
/* not in subview mode */
void
Strip::notify_dyn_change (AutomationType type, bool force_update, bool propagate_mode)
{
- boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+ boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
if (!r) {
/* not in subview mode */
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<AutomationControl> pan_control = _route->pan_azimuth_control ();
+ boost::shared_ptr<AutomationControl> pan_control = _stripable->pan_azimuth_control ();
if (!pan_control) {
/* basically impossible, since we're here because that control
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<AutomationControl> pan_control = _route->pan_width_control ();
+ boost::shared_ptr<AutomationControl> pan_control = _stripable->pan_width_control ();
if (!pan_control) {
/* basically impossible, since we're here because that control
* explicitly.
*/
- boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+ boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
if (r) {
} 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());
}
}
} else {
#ifdef MIXBUS
- if (_route) {
- boost::shared_ptr<AutomationControl> ac = _route->master_send_enable_controllable ();
+ if (_stripable) {
+ boost::shared_ptr<AutomationControl> ac = _stripable->master_send_enable_controllable ();
if (ac) {
Controllable::GroupControlDisposition gcd;
switch (type) {
case GainAutomation:
+ 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 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 (_route) {
- boost::shared_ptr<Pannable> p = _route->pannable();
- if (p && _route->panner()) {
- pending_display[1] =_route->panner()->value_as_string (p->pan_azimuth_control);
+ if (_stripable) {
+ boost::shared_ptr<AutomationControl> pa = _stripable->pan_azimuth_control();
+ if (pa) {
+ pending_display[1] = pa->get_user_string ();
screen_hold = true;
}
}
break;
case PanWidthAutomation:
- if (_route) {
+ if (_stripable) {
snprintf (buf, sizeof (buf), "%5ld%%", lrintf ((val * 200.0)-100));
pending_display[1] = buf;
screen_hold = true;
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;
break;
case PhaseAutomation:
- if (_route) {
+ if (_stripable) {
if (val < 0.5) {
pending_display[1] = "Normal";
} else {
}
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:
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<AutomationControl> pan_control = _route->pan_azimuth_control ();
+ boost::shared_ptr<AutomationControl> pan_control = _stripable->pan_azimuth_control ();
if (pan_control) {
state = pan_control->automation_state ();
if (state == Touch || state == Play) {
}
}
- 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) {
void
Strip::update_meter ()
{
- if (!_route) {
+ if (!_stripable) {
return;
}
return;
}
- if (_meter && _transport_is_rolling && _metering_active) {
- float dB = const_cast<PeakMeter&> (_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;
}
_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 ()
{
boost::shared_ptr<AutomationControl> 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 */
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();
void
Strip::subview_mode_changed ()
{
- boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+ boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
subview_connections.drop_connections ();
case MackieControlProtocol::None:
set_vpot_parameter (_pan_mode);
/* need to show strip name again */
- show_route_name ();
- if (!_route) {
+ show_stripable_name ();
+ if (!_stripable) {
_surface->write (_vpot->set (0, true, Pot::wrap));
_surface->write (_fader->set_position (0.0));
}
}
void
-Strip::setup_dyn_vpot (boost::shared_ptr<Route> r)
+Strip::setup_dyn_vpot (boost::shared_ptr<Stripable> r)
{
if (!r) {
return;
}
void
-Strip::setup_eq_vpot (boost::shared_ptr<Route> r)
+Strip::setup_eq_vpot (boost::shared_ptr<Stripable> r)
{
uint32_t bands = r->eq_band_cnt ();
}
void
-Strip::setup_sends_vpot (boost::shared_ptr<Route> r)
+Strip::setup_sends_vpot (boost::shared_ptr<Stripable> r)
{
if (!r) {
return;
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<Route> r)
+Strip::setup_trackview_vpot (boost::shared_ptr<Stripable> r)
{
if (!r) {
return;
void
Strip::set_vpot_parameter (AutomationType p)
{
- if (!_route || (p == NullAutomation)) {
+ if (!_stripable || (p == NullAutomation)) {
_vpot->set_control (boost::shared_ptr<AutomationControl>());
pending_display[1] = string();
return;
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;
bool
Strip::is_midi_track () const
{
- return boost::dynamic_pointer_cast<MidiTrack>(_route) != 0;
+ return boost::dynamic_pointer_cast<MidiTrack>(_stripable) != 0;
}
void
return;
}
- if (!_route || !_meter) {
+ if (!_stripable || !_meter) {
return;
}