+ break;
+ case PhaseAutomation:
+ control = r->phase_control ();
+ break;
+ default:
+ break;
+ }
+
+ if (control) {
+ float val = control->get_value();
+
+ /* Note: all of the displayed controllables require the display
+ * of their *actual* ("internal") value, not the version mapped
+ * into the normalized 0..1.0 ("interface") range.
+ */
+
+ do_parameter_display (type, val);
+ /* update pot/encoder */
+ _surface->write (_vpot->set (control->internal_to_interface (val), true, Pot::wrap));
+ }
+}
+
+void
+Strip::notify_eq_change (AutomationType type, uint32_t band, bool force_update)
+{
+ boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+
+ if (!r) {
+ /* not in subview mode */
+ return;
+ }
+
+ if (_surface->mcp().subview_mode() != MackieControlProtocol::EQ) {
+ /* no longer in EQ subview mode */
+ return;
+ }
+
+ boost::shared_ptr<AutomationControl> control;
+
+ switch (type) {
+ case EQGain:
+ control = r->eq_gain_controllable (band);
+ break;
+ case EQFrequency:
+ control = r->eq_freq_controllable (band);
+ break;
+ case EQQ:
+ control = r->eq_q_controllable (band);
+ break;
+ case EQShape:
+ control = r->eq_shape_controllable (band);
+ break;
+ case EQHPF:
+ control = r->eq_hpf_controllable ();
+ break;
+ case EQEnable:
+ control = r->eq_enable_controllable ();
+ break;
+ default:
+ break;
+ }
+
+ if (control) {
+ float val = control->get_value();
+ do_parameter_display (type, val);
+ /* update pot/encoder */
+ _surface->write (_vpot->set (control->internal_to_interface (val), true, Pot::wrap));
+ }
+}
+
+void
+Strip::notify_dyn_change (AutomationType type, bool force_update, bool propagate_mode)
+{
+ boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+
+ if (!r) {
+ /* not in subview mode */
+ return;
+ }
+
+ if (_surface->mcp().subview_mode() != MackieControlProtocol::Dynamics) {
+ /* no longer in EQ subview mode */
+ return;
+ }
+
+ boost::shared_ptr<AutomationControl> control;
+ bool reset_all = false;
+
+ switch (type) {
+ case CompThreshold:
+ control = r->comp_threshold_controllable ();
+ break;
+ case CompSpeed:
+ control = r->comp_speed_controllable ();
+ break;
+ case CompMode:
+ control = r->comp_mode_controllable ();
+ reset_all = true;
+ break;
+ case CompMakeup:
+ control = r->comp_makeup_controllable ();
+ break;
+ case CompRedux:
+ control = r->comp_redux_controllable ();
+ break;
+ case CompEnable:
+ control = r->comp_enable_controllable ();
+ break;
+ default:
+ break;
+ }
+
+ if (propagate_mode && reset_all) {
+ _surface->subview_mode_changed ();
+ }
+
+ if (control) {
+ float val = control->get_value();
+ do_parameter_display (type, val);
+ /* update pot/encoder */
+ _surface->write (_vpot->set (control->internal_to_interface (val), true, Pot::wrap));
+ }
+}
+
+void
+Strip::notify_panner_azi_changed (bool force_update)
+{
+ if (!_route) {
+ return;
+ }
+
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("pan change for strip %1\n", _index));
+
+ boost::shared_ptr<AutomationControl> pan_control = _route->pan_azimuth_control ();
+
+ if (!pan_control) {
+ /* basically impossible, since we're here because that control
+ * changed, but sure, whatever.
+ */
+ return;
+ }
+
+ if (_vpot->control() != pan_control) {
+ return;
+ }
+
+ double normalized_pos = pan_control->internal_to_interface (pan_control->get_value());
+ double internal_pos = pan_control->get_value();
+
+ if (force_update || (normalized_pos != _last_pan_azi_position_written)) {
+
+ _surface->write (_vpot->set (normalized_pos, true, Pot::dot));
+ /* show actual internal value to user */
+ do_parameter_display (PanAzimuthAutomation, internal_pos);
+
+ _last_pan_azi_position_written = normalized_pos;