+ }
+}
+
+void
+Strip::subview_mode_changed ()
+{
+ boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+
+ subview_connections.drop_connections ();
+
+ switch (_surface->mcp().subview_mode()) {
+ case MackieControlProtocol::None:
+ set_vpot_parameter (vpot_parameter);
+ /* need to show strip name again */
+ show_route_name ();
+ notify_metering_state_changed ();
+ eq_band = -1;
+ break;
+
+ case MackieControlProtocol::EQ:
+ if (r) {
+ setup_eq_vpot (r);
+ } else {
+ /* leave it as it was */
+ }
+ break;
+
+ case MackieControlProtocol::Dynamics:
+ if (r) {
+ setup_dyn_vpot (r);
+ } else {
+ /* leave it as it was */
+ }
+ eq_band = -1;
+ break;
+
+ case MackieControlProtocol::Sends:
+ if (r) {
+ setup_sends_vpot (r);
+ } else {
+ /* leave it as it was */
+ }
+ eq_band = -1;
+ break;
+ }
+}
+
+void
+Strip::setup_dyn_vpot (boost::shared_ptr<Route> r)
+{
+ if (!r) {
+ return;
+ }
+
+ boost::shared_ptr<AutomationControl> tc = r->comp_threshold_controllable ();
+ boost::shared_ptr<AutomationControl> sc = r->comp_speed_controllable ();
+ boost::shared_ptr<AutomationControl> mc = r->comp_mode_controllable ();
+ boost::shared_ptr<AutomationControl> kc = r->comp_makeup_controllable ();
+ boost::shared_ptr<AutomationControl> rc = r->comp_redux_controllable ();
+ boost::shared_ptr<AutomationControl> ec = r->comp_enable_controllable ();
+
+ uint32_t pos = _surface->mcp().global_index (*this);
+
+ /* we will control the pos-th available parameter, from the list in the
+ * order shown above.
+ */
+
+ vector<boost::shared_ptr<AutomationControl> > available;
+ vector<AutomationType> params;
+
+ if (tc) { available.push_back (tc); params.push_back (CompThreshold); }
+ if (sc) { available.push_back (sc); params.push_back (CompSpeed); }
+ if (mc) { available.push_back (mc); params.push_back (CompMode); }
+ if (kc) { available.push_back (kc); params.push_back (CompMakeup); }
+ if (rc) { available.push_back (rc); params.push_back (CompRedux); }
+ if (ec) { available.push_back (ec); params.push_back (CompEnable); }
+
+ if (pos >= available.size()) {
+ /* this knob is not needed to control the available parameters */
+ _vpot->set_control (boost::shared_ptr<AutomationControl>());
+ pending_display[0] = string();
+ pending_display[1] = string();
+ return;
+ }
+
+ boost::shared_ptr<AutomationControl> pc;
+ AutomationType param;
+
+ pc = available[pos];
+ param = params[pos];
+
+ pc->Changed.connect (subview_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_dyn_change, this, param, false, true), ui_context());
+ _vpot->set_control (pc);
+
+ string pot_id;
+
+ switch (param) {
+ case CompThreshold:
+ pot_id = "Thresh";
+ break;
+ case CompSpeed:
+ if (mc) {
+ pot_id = r->comp_speed_name (mc->get_value());
+ } else {
+ pot_id = "Speed";
+ }
+ break;
+ case CompMode:
+ pot_id = "Mode";
+ break;
+ case CompMakeup:
+ pot_id = "Makeup";
+ break;
+ case CompRedux:
+ pot_id = "Redux";
+ break;
+ case CompEnable:
+ pot_id = "on/off";
+ break;
+ default:
+ break;
+ }
+
+ if (!pot_id.empty()) {
+ pending_display[0] = pot_id;
+ } else {
+ pending_display[0] = string();
+ }
+
+ notify_dyn_change (param, true, false);
+}
+
+void
+Strip::setup_eq_vpot (boost::shared_ptr<Route> r)
+{
+ uint32_t bands = r->eq_band_cnt ();
+
+ if (bands == 0) {
+ /* should never get here */
+ return;
+ }
+
+ /* figure out how many params per band are available */
+
+ boost::shared_ptr<AutomationControl> pc;
+ uint32_t params_per_band = 0;
+
+ if ((pc = r->eq_gain_controllable (0))) {
+ params_per_band += 1;
+ }
+ if ((pc = r->eq_freq_controllable (0))) {
+ params_per_band += 1;
+ }
+ if ((pc = r->eq_q_controllable (0))) {
+ params_per_band += 1;
+ }
+ if ((pc = r->eq_shape_controllable (0))) {
+ params_per_band += 1;
+ }
+
+ /* pick the one for this strip, based on its global position across
+ * all surfaces
+ */
+
+ pc.reset ();
+
+ const uint32_t total_band_parameters = bands * params_per_band;
+ const uint32_t global_pos = _surface->mcp().global_index (*this);
+ AutomationType param = NullAutomation;
+ string band_name;
+
+ eq_band = -1;
+
+ if (global_pos < total_band_parameters) {
+
+ /* show a parameter for an EQ band */
+
+ const uint32_t parameter = global_pos % params_per_band;
+ eq_band = global_pos / params_per_band;
+ band_name = r->eq_band_name (eq_band);
+
+ switch (parameter) {
+ case 0:
+ pc = r->eq_gain_controllable (eq_band);
+ param = EQGain;
+ break;
+ case 1:
+ pc = r->eq_freq_controllable (eq_band);
+ param = EQFrequency;
+ break;
+ case 2:
+ pc = r->eq_q_controllable (eq_band);
+ param = EQQ;
+ break;
+ case 3:
+ pc = r->eq_shape_controllable (eq_band);
+ param = EQShape;
+ break;
+ }
+
+ } else {
+
+ /* show a non-band parameter (HPF or enable)
+ */
+
+ uint32_t parameter = global_pos - total_band_parameters;
+
+ switch (parameter) {
+ case 0: /* first control after band parameters */
+ pc = r->eq_hpf_controllable();
+ param = EQHPF;
+ break;
+ case 1: /* second control after band parameters */
+ pc = r->eq_enable_controllable();
+ param = EQEnable;
+ break;
+ default:
+ /* nothing to control */
+ _vpot->set_control (boost::shared_ptr<AutomationControl>());
+ pending_display[0] = string();
+ pending_display[1] = string();
+ /* done */