From 9e3299f97da874a48f67dc5ff0e0f87a6a54768a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 2 Jan 2016 04:58:23 -0500 Subject: change Controllable::set_value() API to include grouped control consideration. This also removes Route::group_gain_control() and associated machinery. Not yet tested with Mackie or other surfaces. More work to done to start using the group capabilities, and also potentially to add or derive more controls as RouteAutomationControls --- libs/ardour/amp.cc | 6 +- libs/ardour/ardour/amp.h | 2 +- libs/ardour/ardour/automation_control.h | 8 +- libs/ardour/ardour/midi_track.h | 2 +- libs/ardour/ardour/monitor_processor.h | 2 +- libs/ardour/ardour/pan_controllable.h | 6 +- libs/ardour/ardour/plugin_insert.h | 5 +- libs/ardour/ardour/proxy_controllable.h | 6 +- libs/ardour/ardour/route.h | 59 ++++++----- libs/ardour/ardour/track.h | 2 +- libs/ardour/automation_control.cc | 4 +- libs/ardour/midi_track.cc | 6 +- libs/ardour/monitor_processor.cc | 2 +- libs/ardour/pan_controllable.cc | 6 +- libs/ardour/pannable.cc | 10 +- libs/ardour/plugin_insert.cc | 12 +-- libs/ardour/route.cc | 129 ++++++++++++++----------- libs/ardour/session.cc | 6 +- libs/ardour/track.cc | 2 +- libs/gtkmm2ext/motionfeedback.cc | 25 ++--- libs/panners/1in2out/panner_1in2out.cc | 4 +- libs/panners/2in2out/panner_2in2out.cc | 8 +- libs/panners/stereobalance/panner_balance.cc | 4 +- libs/panners/vbap/vbap.cc | 6 +- libs/pbd/controllable.cc | 2 +- libs/pbd/pbd/controllable.h | 31 +++++- libs/surfaces/faderport/operations.cc | 5 +- libs/surfaces/generic_midi/midicontrollable.cc | 40 ++++---- libs/surfaces/mackie/controls.cc | 2 +- libs/surfaces/mackie/strip.cc | 32 +++--- libs/surfaces/osc/osc.cc | 2 +- 31 files changed, 244 insertions(+), 192 deletions(-) (limited to 'libs') diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index 955dd13ccc..924a77e666 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -368,7 +368,7 @@ Amp::inc_gain (gain_t factor, void *src) void Amp::set_gain (gain_t val, void *) { - _gain_control->set_value (val); + _gain_control->set_value (val, Controllable::NoGroup); } XMLNode& @@ -396,7 +396,7 @@ Amp::set_state (const XMLNode& node, int version) } void -Amp::GainControl::set_value (double val) +Amp::GainControl::set_value (double val, PBD::Controllable::GroupControlDisposition /* group_override */) { if (writable()) { set_value_unchecked (val); @@ -406,7 +406,7 @@ Amp::GainControl::set_value (double val) void Amp::GainControl::set_value_unchecked (double val) { - AutomationControl::set_value (std::max (std::min (val, (double)_desc.upper), (double)_desc.lower)); + AutomationControl::set_value (std::max (std::min (val, (double)_desc.upper), (double)_desc.lower), Controllable::NoGroup); _amp->session().set_dirty (); } diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h index e8445c4853..c92edcc5fc 100644 --- a/libs/ardour/ardour/amp.h +++ b/libs/ardour/ardour/amp.h @@ -92,7 +92,7 @@ public: range_db = accurate_coefficient_to_dB (_desc.upper) - lower_db; } - void set_value (double val); + void set_value (double val, PBD::Controllable::GroupControlDisposition group_override); void set_value_unchecked (double); double internal_to_interface (double) const; diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h index b26d781e2f..0d065686e2 100644 --- a/libs/ardour/ardour/automation_control.h +++ b/libs/ardour/ardour/automation_control.h @@ -85,9 +85,12 @@ public: * Derived classes MUST call ::writable() to verify * that writing to the parameter is legal at that time. */ - void set_value (double); double get_value () const; - + /* inherited from PBD::Controllable. + * Derived classes MUST call ::writable() to verify + * that writing to the parameter is legal at that time. + */ + void set_value (double value, PBD::Controllable::GroupControlDisposition group_override); /* automation related value setting */ virtual bool writable () const; /* Call to ::set_value() with no test for writable() because @@ -110,7 +113,6 @@ public: void commit_transaction (bool did_write); protected: - ARDOUR::Session& _session; const ParameterDescriptor _desc; diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h index 80bb743b10..ba418082f8 100644 --- a/libs/ardour/ardour/midi_track.h +++ b/libs/ardour/ardour/midi_track.h @@ -89,7 +89,7 @@ public: , _route (route) {} - void set_value (double val); + void set_value (double val, PBD::Controllable::GroupControlDisposition group_override); void set_value_unchecked (double); bool writable() const { return true; } diff --git a/libs/ardour/ardour/monitor_processor.h b/libs/ardour/ardour/monitor_processor.h index c7d73dca00..ffee1fbbd2 100644 --- a/libs/ardour/ardour/monitor_processor.h +++ b/libs/ardour/ardour/monitor_processor.h @@ -54,7 +54,7 @@ public: /* Controllable API */ - void set_value (double v) { + void set_value (double v, PBD::Controllable::GroupControlDisposition group_override) { T newval = (T) v; if (newval != _value) { _value = std::max (_lower, std::min (_upper, newval)); diff --git a/libs/ardour/ardour/pan_controllable.h b/libs/ardour/ardour/pan_controllable.h index ff00d8119f..77acbee04f 100644 --- a/libs/ardour/ardour/pan_controllable.h +++ b/libs/ardour/ardour/pan_controllable.h @@ -36,7 +36,7 @@ class Pannable; class LIBARDOUR_API PanControllable : public AutomationControl { -public: + public: PanControllable (Session& s, std::string name, Pannable* o, Evoral::Parameter param) : AutomationControl (s, param, @@ -47,10 +47,10 @@ public: {} double lower () const; - void set_value (double); + void set_value (double, PBD::Controllable::GroupControlDisposition group_override); void set_value_unchecked (double); -private: + private: Pannable* owner; }; diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h index 0873825c02..6b434bef7f 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -95,7 +95,7 @@ class LIBARDOUR_API PluginInsert : public Processor const ParameterDescriptor& desc, boost::shared_ptr list=boost::shared_ptr()); - void set_value (double val); + void set_value (double val, PBD::Controllable::GroupControlDisposition group_override); void set_value_unchecked (double); double get_value (void) const; void catch_up_with_external_value (double val); @@ -113,8 +113,7 @@ class LIBARDOUR_API PluginInsert : public Processor const ParameterDescriptor& desc, boost::shared_ptr list=boost::shared_ptr()); - void set_value (const Variant& val); - void set_value (double val); + void set_value (double val, PBD::Controllable::GroupControlDisposition group_override); void set_value_unchecked (double); double get_value (void) const; XMLNode& get_state(); diff --git a/libs/ardour/ardour/proxy_controllable.h b/libs/ardour/ardour/proxy_controllable.h index b2f230ec87..c60f5f1b74 100644 --- a/libs/ardour/ardour/proxy_controllable.h +++ b/libs/ardour/ardour/proxy_controllable.h @@ -31,7 +31,7 @@ namespace ARDOUR { */ class LIBARDOUR_API ProxyControllable : public PBD::Controllable { -public: + public: ProxyControllable (const std::string& name, PBD::Controllable::Flag flags, boost::function1 setter, boost::function0 getter) @@ -40,7 +40,7 @@ public: , _getter (getter) {} - void set_value (double v) { if (_setter (v)) { Changed(); /* EMIT SIGNAL */ } } + void set_value (double v, PBD::Controllable::GroupControlDisposition /*group_override*/) { if (_setter (v)) { Changed(); /* EMIT SIGNAL */ } } double get_value () const { return _getter (); } double internal_to_user (double i) const { return accurate_coefficient_to_dB (i);} @@ -51,7 +51,7 @@ public: return std::string(theBuf); } -private: + private: boost::function1 _setter; boost::function0 _getter; }; diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 0ef063b29c..2086f32119 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -383,23 +383,44 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou /* Controls (not all directly owned by the Route */ + class RouteAutomationControl : public AutomationControl { + public: + RouteAutomationControl (const std::string& name, + AutomationType atype, + boost::shared_ptr alist, + boost::shared_ptr route); + + void set_value (double val, PBD::Controllable::GroupControlDisposition group_override) { + boost::shared_ptr r = _route.lock(); + if (r) { + r->set_control (*this, val, group_override); + } + } + + protected: + friend class Route; + + void route_set_value (double val) { + AutomationControl::set_value (val, Controllable::NoGroup); + } + + boost::weak_ptr _route; + }; + boost::shared_ptr get_control (const Evoral::Parameter& param); - class SoloControllable : public AutomationControl { + class SoloControllable : public RouteAutomationControl { public: SoloControllable (std::string name, boost::shared_ptr); - void set_value (double); + void set_value (double, PBD::Controllable::GroupControlDisposition group_override); void set_value_unchecked (double); double get_value () const; - - private: - boost::weak_ptr _route; }; - struct MuteControllable : public AutomationControl { + struct MuteControllable : public RouteAutomationControl { public: MuteControllable (std::string name, boost::shared_ptr); - void set_value (double); + void set_value (double, PBD::Controllable::GroupControlDisposition group_override); void set_value_unchecked (double); double get_value () const; @@ -410,27 +431,18 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou boost::weak_ptr _route; }; - class LIBARDOUR_API PhaseControllable : public AutomationControl { + class LIBARDOUR_API PhaseControllable : public RouteAutomationControl { public: PhaseControllable (std::string name, boost::shared_ptr); - void set_value (double); + void set_value (double, PBD::Controllable::GroupControlDisposition group_override); void set_channel (uint32_t); double get_value () const; uint32_t channel() const; - private: - boost::weak_ptr _route; uint32_t _current_phase; }; - class LIBARDOUR_API GroupGainControllable : public AutomationControl { - public: - GroupGainControllable (std::string name, boost::shared_ptr); - void set_value (double); - double get_value () const; - private: - boost::weak_ptr _route; - }; + void set_control (RouteAutomationControl&, double val, PBD::Controllable::GroupControlDisposition group_override); boost::shared_ptr solo_control() const { return _solo_control; @@ -448,10 +460,6 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou return _phase_control; } - boost::shared_ptr group_gain_control() const { - return _group_gain_control; - } - /* Route doesn't own these items, but sub-objects that it does own have them and to make UI code a bit simpler, we provide direct access to them here. @@ -544,7 +552,7 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou bool has_external_redirects() const; /* can only be executed by a route for which is_monitor() is true - (i.e. the monitor out) + (i.e. the monitor out) */ void monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick); @@ -635,7 +643,6 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou boost::shared_ptr _mute_control; boost::shared_ptr _mute_master; boost::shared_ptr _phase_control; - boost::shared_ptr _group_gain_control; virtual void act_on_mute () {} @@ -679,7 +686,7 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou int set_state_2X (const XMLNode&, int); void set_processor_state_2X (XMLNodeList const &, int); - uint32_t _order_key; + uint32_t _order_key; bool _has_order_key; uint32_t _remote_control_id; diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h index fa7b1f30bb..5bf887f517 100644 --- a/libs/ardour/ardour/track.h +++ b/libs/ardour/ardour/track.h @@ -206,7 +206,7 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream struct RecEnableControl : public AutomationControl { RecEnableControl (boost::shared_ptr t); - void set_value (double); + void set_value (double, PBD::Controllable::GroupControlDisposition); void set_value_unchecked (double); double get_value (void) const; diff --git a/libs/ardour/automation_control.cc b/libs/ardour/automation_control.cc index 1f507b7015..583f38807d 100644 --- a/libs/ardour/automation_control.cc +++ b/libs/ardour/automation_control.cc @@ -72,7 +72,7 @@ AutomationControl::get_value() const * @param value `user' value */ void -AutomationControl::set_value (double value) +AutomationControl::set_value (double value, PBD::Controllable::GroupControlDisposition /* group_override */) { bool to_list = _list && ((AutomationList*)_list.get())->automation_write(); @@ -135,7 +135,7 @@ AutomationControl::start_touch(double when) if (alist()->automation_state() == Touch) { /* subtle. aligns the user value with the playback */ - set_value (get_value ()); + set_value (get_value (), Controllable::NoGroup); alist()->start_touch (when); if (!_desc.toggled) { AutomationWatch::instance().add_automation_watch (shared_from_this()); diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index 03ba42b6af..69d10c44e0 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -543,7 +543,7 @@ MidiTrack::non_realtime_locate (framepos_t pos) (rcontrol = region->control(tcontrol->parameter()))) { const Evoral::Beats pos_beats = bfc.from(pos - origin); if (rcontrol->list()->size() > 0) { - tcontrol->set_value(rcontrol->list()->eval(pos_beats.to_double())); + tcontrol->set_value(rcontrol->list()->eval(pos_beats.to_double()), Controllable::NoGroup); } } } @@ -725,7 +725,7 @@ MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState st } void -MidiTrack::MidiControl::set_value(double val) +MidiTrack::MidiControl::set_value (double val, PBD::Controllable::GroupControlDisposition /* group_override */) { if (writable()) { set_value_unchecked (val); @@ -790,7 +790,7 @@ MidiTrack::MidiControl::set_value_unchecked(double val) _route->write_immediate_event(size, ev); } - AutomationControl::set_value(val); + AutomationControl::set_value(val, Controllable::NoGroup); } void diff --git a/libs/ardour/monitor_processor.cc b/libs/ardour/monitor_processor.cc index 92beed547c..4264ee7793 100644 --- a/libs/ardour/monitor_processor.cc +++ b/libs/ardour/monitor_processor.cc @@ -37,7 +37,7 @@ using namespace std; /* specialize for bool because of set_value() semantics */ namespace ARDOUR { - template<> void MPControl::set_value (double v) { + template<> void MPControl::set_value (double v, PBD::Controllable::GroupControlDisposition /*group_override*/) { bool newval = fabs (v) >= 0.5; if (newval != _value) { _value = newval; diff --git a/libs/ardour/pan_controllable.cc b/libs/ardour/pan_controllable.cc index 71c8a9f62f..faf04cc8d7 100644 --- a/libs/ardour/pan_controllable.cc +++ b/libs/ardour/pan_controllable.cc @@ -35,7 +35,7 @@ PanControllable::lower () const } void -PanControllable::set_value (double v) +PanControllable::set_value (double v, PBD::Controllable::GroupControlDisposition /* group_override */) { if (writable()) { set_value_unchecked (v); @@ -49,7 +49,7 @@ PanControllable::set_value_unchecked (double v) if (!p) { /* no panner: just do it */ - AutomationControl::set_value (v); + AutomationControl::set_value (v, Controllable::NoGroup); return; } @@ -70,7 +70,7 @@ PanControllable::set_value_unchecked (double v) } if (can_set) { - AutomationControl::set_value (v); + AutomationControl::set_value (v, Controllable::NoGroup); } } diff --git a/libs/ardour/pannable.cc b/libs/ardour/pannable.cc index 247397d415..f589024435 100644 --- a/libs/ardour/pannable.cc +++ b/libs/ardour/pannable.cc @@ -242,27 +242,27 @@ Pannable::set_state (const XMLNode& root, int version) if ((*niter)->name() == X_("azimuth")) { prop = (*niter)->property (X_("value")); if (prop) { - pan_azimuth_control->set_value (atof (prop->value())); + pan_azimuth_control->set_value (atof (prop->value()), Controllable::NoGroup); } } else if ((*niter)->name() == X_("width")) { prop = (*niter)->property (X_("value")); if (prop) { - pan_width_control->set_value (atof (prop->value())); + pan_width_control->set_value (atof (prop->value()), Controllable::NoGroup); } } else if ((*niter)->name() == X_("elevation")) { prop = (*niter)->property (X_("value")); if (prop) { - pan_elevation_control->set_value (atof (prop->value())); + pan_elevation_control->set_value (atof (prop->value()), Controllable::NoGroup); } } else if ((*niter)->name() == X_("frontback")) { prop = (*niter)->property (X_("value")); if (prop) { - pan_frontback_control->set_value (atof (prop->value())); + pan_frontback_control->set_value (atof (prop->value()), Controllable::NoGroup); } } else if ((*niter)->name() == X_("lfe")) { prop = (*niter)->property (X_("value")); if (prop) { - pan_lfe_control->set_value (atof (prop->value())); + pan_lfe_control->set_value (atof (prop->value()), Controllable::NoGroup); } } } diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 827e6d19f4..77a223880e 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -660,7 +660,7 @@ PluginInsert::reset_parameters_to_default () continue; } - ac->set_value (dflt); + ac->set_value (dflt, Controllable::NoGroup); } return all; } @@ -1337,7 +1337,7 @@ PluginInsert::PluginControl::PluginControl (PluginInsert* p, /** @param val `user' value */ void -PluginInsert::PluginControl::set_value (double user_val) +PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override */) { if (writable()) { set_value_unchecked (user_val); @@ -1358,13 +1358,13 @@ PluginInsert::PluginControl::set_value_unchecked (double user_val) iasp->set_parameter (_list->parameter().id(), user_val); } - AutomationControl::set_value (user_val); + AutomationControl::set_value (user_val, Controllable::NoGroup); } void PluginInsert::PluginControl::catch_up_with_external_value (double user_val) { - AutomationControl::set_value (user_val); + AutomationControl::set_value (user_val, Controllable::NoGroup); } XMLNode& @@ -1410,7 +1410,7 @@ PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* } void -PluginInsert::PluginPropertyControl::set_value (double user_val) +PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/) { if (writable()) { set_value_unchecked (user_val); @@ -1434,7 +1434,7 @@ PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val) } _value = value; - AutomationControl::set_value(user_val); + AutomationControl::set_value (user_val, Controllable::NoGroup); } XMLNode& diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index fef1ea14a3..5abe96b263 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -178,11 +178,6 @@ Route::init () _amp->set_display_name ("Monitor"); } - // amp should exist before amp controls - _group_gain_control.reset (new GroupGainControllable (X_("groupgain"), shared_from_this ())); - _group_gain_control->set_flags (Controllable::Flag (_group_gain_control->flags() | Controllable::GainLike)); - add_control (_group_gain_control); - /* and input trim */ _trim.reset (new Amp (_session, "trim")); _trim->set_display_to_user (false); @@ -2804,7 +2799,7 @@ Route::set_state_2X (const XMLNode& node, int version) gain_t val; if (sscanf (prop->value().c_str(), "%f", &val) == 1) { - _amp->gain_control()->set_value (val); + _amp->gain_control()->set_value (val, Controllable::NoGroup); } } @@ -3885,12 +3880,76 @@ Route::set_latency_compensation (framecnt_t longest_session_latency) } } -Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr r) - : AutomationControl (r->session(), - Evoral::Parameter (SoloAutomation), - ParameterDescriptor(Evoral::Parameter (SoloAutomation)), - boost::shared_ptr(), name) +void +Route::set_control (RouteAutomationControl& control, double val, PBD::Controllable::GroupControlDisposition /*group_override*/) +{ + boost::shared_ptr rl; + + switch (control.parameter().type()) { + case GainAutomation: + /* route must mediate group control */ + set_gain (val, this); /* any "src" argument will do other than our route group */ + return; + break; + + case RecEnableAutomation: + /* session must mediate group control */ + rl.reset (new RouteList); + rl->push_back (shared_from_this()); + _session.set_record_enabled (rl, val >= 0.5 ? true : false); + return; + break; + + case SoloAutomation: + /* session must mediate group control */ + rl.reset (new RouteList); + rl->push_back (shared_from_this()); + if (Config->get_solo_control_is_listen_control()) { + _session.set_listen (rl, val >= 0.5 ? true : false); + } else { + _session.set_solo (rl, val >= 0.5 ? true : false); + } + + return; + break; + + case MuteAutomation: + /* session must mediate group control */ + rl.reset (new RouteList); + rl->push_back (shared_from_this()); + _session.set_mute (rl, !muted()); + return; + break; + + case PanAzimuthAutomation: + case PanElevationAutomation: + case PanWidthAutomation: + case PanFrontBackAutomation: + case PanLFEAutomation: + break; + + default: + /* Not a route automation control */ + return; + } + + control.route_set_value (val); +} + + +Route::RouteAutomationControl::RouteAutomationControl (const std::string& name, + AutomationType atype, + boost::shared_ptr alist, + boost::shared_ptr r) + : AutomationControl (r->session(), Evoral::Parameter (atype), + ParameterDescriptor (Evoral::Parameter (atype)), + alist, name) , _route (r) +{ +} + +Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr r) + : RouteAutomationControl (name, SoloAutomation, boost::shared_ptr(), r) { boost::shared_ptr gl(new AutomationList(Evoral::Parameter(SoloAutomation))); gl->set_interpolation(Evoral::ControlList::Discrete); @@ -3898,7 +3957,7 @@ Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr r) - : AutomationControl (r->session(), - Evoral::Parameter (MuteAutomation), - ParameterDescriptor (Evoral::Parameter (MuteAutomation)), - boost::shared_ptr(), - name) + : RouteAutomationControl (name, MuteAutomation, boost::shared_ptr(), r) , _route (r) { boost::shared_ptr gl(new AutomationList(Evoral::Parameter(MuteAutomation))); @@ -3979,7 +4034,7 @@ Route::MuteControllable::set_superficial_value(bool muted) } void -Route::MuteControllable::set_value (double val) +Route::MuteControllable::set_value (double val, PBD::Controllable::GroupControlDisposition /* group_override */) { if (writable()) { set_value_unchecked (val); @@ -4022,42 +4077,8 @@ Route::MuteControllable::get_value () const return (r && r->muted()) ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO; } -Route::GroupGainControllable::GroupGainControllable (std::string name, boost::shared_ptr r) - : AutomationControl (r->session(), - Evoral::Parameter (GainAutomation), - ParameterDescriptor (Evoral::Parameter (GainAutomation)), - boost::shared_ptr(), - name) - , _route (r) -{ - boost::shared_ptr gl(new AutomationList(Evoral::Parameter(GainAutomation))); - gl->set_interpolation(Evoral::ControlList::Discrete); - set_list (gl); -} - -void -Route::GroupGainControllable::set_value (double val) -{ - boost::shared_ptr r = _route.lock (); - // I am not sure why I need the * .5 to make this work - float normalized_position = r->gain_control()->interface_to_internal (val * 0.5); - r->set_gain ((gain_t)normalized_position, this); -} - -double -Route::GroupGainControllable::get_value () const -{ - boost::shared_ptr r = _route.lock (); - return 2.0 * r->gain_control()->internal_to_interface (r->gain_control()->get_value ()); -} - Route::PhaseControllable::PhaseControllable (std::string name, boost::shared_ptr r) - : AutomationControl (r->session(), - Evoral::Parameter (PhaseAutomation), - ParameterDescriptor (Evoral::Parameter (PhaseAutomation)), - boost::shared_ptr(), - name) - , _route (r) + : RouteAutomationControl (name, PhaseAutomation, boost::shared_ptr(), r) { boost::shared_ptr gl(new AutomationList(Evoral::Parameter(PhaseAutomation))); gl->set_interpolation(Evoral::ControlList::Discrete); @@ -4065,7 +4086,7 @@ Route::PhaseControllable::PhaseControllable (std::string name, boost::shared_ptr } void -Route::PhaseControllable::set_value (double v) +Route::PhaseControllable::set_value (double v, PBD::Controllable::GroupControlDisposition /* group_override */) { boost::shared_ptr r = _route.lock (); if (r->phase_invert().size()) { diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 1c7410002d..2e93d5d167 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -3335,7 +3335,7 @@ Session::globally_set_send_gains_to_zero (boost::shared_ptr dest) for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { if ((s = (*i)->internal_send_for (dest)) != 0) { - s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO); + s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO, Controllable::NoGroup); } } } @@ -3348,7 +3348,7 @@ Session::globally_set_send_gains_to_unity (boost::shared_ptr dest) for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { if ((s = (*i)->internal_send_for (dest)) != 0) { - s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY); + s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY, Controllable::NoGroup); } } } @@ -3361,7 +3361,7 @@ Session::globally_set_send_gains_from_track(boost::shared_ptr dest) for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { if ((s = (*i)->internal_send_for (dest)) != 0) { - s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value()); + s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value(), Controllable::NoGroup); } } } diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index c4c82808bd..21256b09ce 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -190,7 +190,7 @@ Track::RecEnableControl::RecEnableControl (boost::shared_ptr t) } void -Track::RecEnableControl::set_value (double val) +Track::RecEnableControl::set_value (double val, Controllable::GroupControlDisposition /* group_override */) { if (writable()) { set_value_unchecked (val); diff --git a/libs/gtkmm2ext/motionfeedback.cc b/libs/gtkmm2ext/motionfeedback.cc index 0c1a325bb7..0dccdabc2f 100644 --- a/libs/gtkmm2ext/motionfeedback.cc +++ b/libs/gtkmm2ext/motionfeedback.cc @@ -46,6 +46,7 @@ using namespace Gtkmm2ext; using namespace sigc; using PBD::error; +using PBD::Controllable; Gdk::Color* MotionFeedback::base_color; @@ -191,11 +192,11 @@ MotionFeedback::pixwin_button_release_event (GdkEventButton *ev) } if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { /* shift click back to the default */ - _controllable->set_value (default_value); + _controllable->set_value (default_value, Controllable::NoGroup); return true; } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { /* ctrl click back to the minimum value */ - _controllable->set_value (_controllable->lower ()); + _controllable->set_value (_controllable->lower (), Controllable::NoGroup); } break; @@ -246,7 +247,7 @@ MotionFeedback::pixwin_motion_notify_event (GdkEventMotion *ev) y_delta *= multiplier; y_delta /= 10; - _controllable->set_value (adjust ((grab_is_fine ? step_inc : page_inc) * y_delta)); + _controllable->set_value (adjust ((grab_is_fine ? step_inc : page_inc) * y_delta), Controllable::NoGroup); } else if (ev->state & Gdk::BUTTON2_MASK) { @@ -263,7 +264,7 @@ MotionFeedback::pixwin_motion_notify_event (GdkEventMotion *ev) angle = -(2.0/3.0) * (angle - 1.25); angle *= multiplier; - _controllable->set_value (to_control_value (angle)); + _controllable->set_value (to_control_value (angle), Controllable::NoGroup); } @@ -301,32 +302,32 @@ MotionFeedback::pixwin_key_press_event (GdkEventKey *ev) switch (ev->keyval) { case GDK_Page_Up: retval = true; - _controllable->set_value (adjust (multiplier * page_inc)); + _controllable->set_value (adjust (multiplier * page_inc), Controllable::NoGroup); break; case GDK_Page_Down: retval = true; - _controllable->set_value (adjust (-multiplier * page_inc)); + _controllable->set_value (adjust (-multiplier * page_inc), Controllable::NoGroup); break; case GDK_Up: retval = true; - _controllable->set_value (adjust (multiplier * step_inc)); + _controllable->set_value (adjust (multiplier * step_inc), Controllable::NoGroup); break; case GDK_Down: retval = true; - _controllable->set_value (adjust (-multiplier * step_inc)); + _controllable->set_value (adjust (-multiplier * step_inc), Controllable::NoGroup); break; case GDK_Home: retval = true; - _controllable->set_value (_controllable->lower()); + _controllable->set_value (_controllable->lower(), Controllable::NoGroup); break; case GDK_End: retval = true; - _controllable->set_value (_controllable->upper()); + _controllable->set_value (_controllable->upper(), Controllable::NoGroup); break; } @@ -406,12 +407,12 @@ MotionFeedback::pixwin_scroll_event (GdkEventScroll* ev) switch (ev->direction) { case GDK_SCROLL_UP: case GDK_SCROLL_RIGHT: - _controllable->set_value (adjust (scale * page_inc)); + _controllable->set_value (adjust (scale * page_inc), Controllable::NoGroup); break; case GDK_SCROLL_DOWN: case GDK_SCROLL_LEFT: - _controllable->set_value (adjust (-scale * page_inc)); + _controllable->set_value (adjust (-scale * page_inc), Controllable::NoGroup); break; } diff --git a/libs/panners/1in2out/panner_1in2out.cc b/libs/panners/1in2out/panner_1in2out.cc index 022f4d680c..b522d65054 100644 --- a/libs/panners/1in2out/panner_1in2out.cc +++ b/libs/panners/1in2out/panner_1in2out.cc @@ -76,7 +76,7 @@ Panner1in2out::Panner1in2out (boost::shared_ptr p) { if (!Profile->get_trx () ) { if (!_pannable->has_state ()) { - _pannable->pan_azimuth_control->set_value (0.5); + _pannable->pan_azimuth_control->set_value (0.5, Controllable::NoGroup); } } @@ -112,7 +112,7 @@ void Panner1in2out::set_position (double p) { if (clamp_position (p)) { - _pannable->pan_azimuth_control->set_value (p); + _pannable->pan_azimuth_control->set_value (p, Controllable::NoGroup); } } diff --git a/libs/panners/2in2out/panner_2in2out.cc b/libs/panners/2in2out/panner_2in2out.cc index 611f13db9a..d8a7428c4c 100644 --- a/libs/panners/2in2out/panner_2in2out.cc +++ b/libs/panners/2in2out/panner_2in2out.cc @@ -74,8 +74,8 @@ Panner2in2out::Panner2in2out (boost::shared_ptr p) : Panner (p) { if (!_pannable->has_state()) { - _pannable->pan_azimuth_control->set_value (0.5); - _pannable->pan_width_control->set_value (1.0); + _pannable->pan_azimuth_control->set_value (0.5, Controllable::NoGroup); + _pannable->pan_width_control->set_value (1.0, Controllable::NoGroup); } double const w = width(); @@ -119,7 +119,7 @@ void Panner2in2out::set_position (double p) { if (clamp_position (p)) { - _pannable->pan_azimuth_control->set_value (p); + _pannable->pan_azimuth_control->set_value (p, Controllable::NoGroup); } } @@ -127,7 +127,7 @@ void Panner2in2out::set_width (double p) { if (clamp_width (p)) { - _pannable->pan_width_control->set_value (p); + _pannable->pan_width_control->set_value (p, Controllable::NoGroup); } } diff --git a/libs/panners/stereobalance/panner_balance.cc b/libs/panners/stereobalance/panner_balance.cc index 281ea4b272..b2efb0f150 100644 --- a/libs/panners/stereobalance/panner_balance.cc +++ b/libs/panners/stereobalance/panner_balance.cc @@ -75,7 +75,7 @@ Pannerbalance::Pannerbalance (boost::shared_ptr p) : Panner (p) { if (!_pannable->has_state()) { - _pannable->pan_azimuth_control->set_value (0.5); + _pannable->pan_azimuth_control->set_value (0.5, Controllable::NoGroup); } update (); @@ -102,7 +102,7 @@ Pannerbalance::position () const Pannerbalance::set_position (double p) { if (clamp_position (p)) { - _pannable->pan_azimuth_control->set_value (p); + _pannable->pan_azimuth_control->set_value (p, Controllable::NoGroup); } } diff --git a/libs/panners/vbap/vbap.cc b/libs/panners/vbap/vbap.cc index f890b50324..df34ddd514 100644 --- a/libs/panners/vbap/vbap.cc +++ b/libs/panners/vbap/vbap.cc @@ -463,19 +463,19 @@ VBAPanner::set_position (double p) int over = p; over -= (p >= 0) ? 0 : 1; p -= (double)over; - _pannable->pan_azimuth_control->set_value (p); + _pannable->pan_azimuth_control->set_value (p, Controllable::NoGroup); } void VBAPanner::set_width (double w) { - _pannable->pan_width_control->set_value (min (1.0, max (-1.0, w))); + _pannable->pan_width_control->set_value (min (1.0, max (-1.0, w)), Controllable::NoGroup); } void VBAPanner::set_elevation (double e) { - _pannable->pan_elevation_control->set_value (min (1.0, max (0.0, e))); + _pannable->pan_elevation_control->set_value (min (1.0, max (0.0, e)), Controllable::NoGroup); } void diff --git a/libs/pbd/controllable.cc b/libs/pbd/controllable.cc index 17b81334f0..58ae731fbe 100644 --- a/libs/pbd/controllable.cc +++ b/libs/pbd/controllable.cc @@ -143,7 +143,7 @@ Controllable::set_state (const XMLNode& node, int /*version*/) float val; if (sscanf (prop->value().c_str(), "%f", &val) == 1) { - set_value (val); + set_value (val, NoGroup); } } diff --git a/libs/pbd/pbd/controllable.h b/libs/pbd/pbd/controllable.h index a0cffdfcd6..727153a277 100644 --- a/libs/pbd/pbd/controllable.h +++ b/libs/pbd/pbd/controllable.h @@ -47,6 +47,7 @@ namespace PBD { * * Without overriding upper() and lower(), a derived class will function * as a control whose value can range between 0 and 1.0. + * */ class LIBPBD_API Controllable : public PBD::StatefulDestructible { @@ -75,8 +76,27 @@ class LIBPBD_API Controllable : public PBD::StatefulDestructible { * but passed to the processor as a linear quantity. */ - /** Get and Set `internal' value */ - virtual void set_value (double) = 0; + /* Within an application, various Controllables might be considered to + * be "grouped" in a way that implies that setting 1 of them also + * modifies others in the group. + */ + + enum GroupControlDisposition { + WholeGroup, /* set all controls in the same "group" as this one */ + NoGroup, /* set only this control */ + UseGroup /* use group settings to decide which group controls are altered */ + }; + + /** Get and Set `internal' value + * + * All derived classes must implement this. + * + * Basic derived classes will ignore @param group_override, + * but more sophisticated children, notably those that + * proxy the value setting logic via an object that is aware of group + * relationships between this control and others, will find it useful. + */ + virtual void set_value (double, GroupControlDisposition group_override) = 0; virtual double get_value (void) const = 0; /** Conversions between `internal', 'interface', and 'user' values */ @@ -87,11 +107,11 @@ class LIBPBD_API Controllable : public PBD::StatefulDestructible { /** Get and Set `interface' value (typically, fraction of knob travel) */ virtual float get_interface() const { return (internal_to_interface(get_value())); } - virtual void set_interface (float fraction) { fraction = min( max(0.0f, fraction), 1.0f); set_value(interface_to_internal(fraction)); } + virtual void set_interface (float fraction) { fraction = min( max(0.0f, fraction), 1.0f); set_value(interface_to_internal(fraction), NoGroup); } /** Get and Set `user' value ( dB or milliseconds, etc. This MIGHT be the same as the internal value, but in a few cases it is not ) */ virtual float get_user() const { return (internal_to_user(get_value())); } - virtual void set_user (float user_v) { set_value(user_to_internal(user_v)); } + virtual void set_user (float user_v) { set_value(user_to_internal(user_v), NoGroup); } virtual std::string get_user_string() const { return std::string(); } PBD::Signal0 LearningFinished; @@ -126,6 +146,7 @@ class LIBPBD_API Controllable : public PBD::StatefulDestructible { static Controllable* by_id (const PBD::ID&); static Controllable* by_name (const std::string&); static const std::string xml_node_name; + private: std::string _name; std::string _units; @@ -150,7 +171,7 @@ class LIBPBD_API IgnorableControllable : public Controllable IgnorableControllable () : PBD::Controllable ("ignoreMe") {} ~IgnorableControllable () {} - void set_value (double /*v*/) {} + void set_value (double /*v*/, PBD::Controllable::GroupControlDisposition /* group_override */) {} double get_value () const { return 0.0; } }; diff --git a/libs/surfaces/faderport/operations.cc b/libs/surfaces/faderport/operations.cc index e7f8284527..1fed68566f 100644 --- a/libs/surfaces/faderport/operations.cc +++ b/libs/surfaces/faderport/operations.cc @@ -30,6 +30,7 @@ using namespace ARDOUR; using namespace ArdourSurface; +using namespace PBD; /* this value is chosen to given smooth motion from 0..1.0 in about 270 degrees * of encoder rotation. @@ -232,7 +233,7 @@ FaderPort::ardour_pan_azimuth (int delta) return; } - azimuth->set_value (azimuth->interface_to_internal (azimuth->internal_to_interface (azimuth->get_value()) + (delta / encoder_divider))); + azimuth->set_value (azimuth->interface_to_internal (azimuth->internal_to_interface (azimuth->get_value()) + (delta / encoder_divider)), Controllable::NoGroup); } @@ -255,7 +256,7 @@ FaderPort::ardour_pan_width(int delta) return; } - width->set_value (width->interface_to_internal (width->internal_to_interface (width->get_value()) + (delta / encoder_divider))); + width->set_value (width->interface_to_internal (width->internal_to_interface (width->get_value()) + (delta / encoder_divider)), Controllable::NoGroup); } void diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc index f4025b591f..8945463e97 100644 --- a/libs/surfaces/generic_midi/midicontrollable.cc +++ b/libs/surfaces/generic_midi/midicontrollable.cc @@ -280,13 +280,13 @@ MIDIControllable::midi_sense_note (Parser &, EventTwoBytes *msg, bool /*is_on*/) if (!controllable->is_toggle()) { if (control_additional == msg->note_number) { - controllable->set_value (midi_to_control (msg->velocity)); + controllable->set_value (midi_to_control (msg->velocity), Controllable::NoGroup); DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Note %1 value %2 %3\n", (int) msg->note_number, (float) midi_to_control (msg->velocity), current_uri() )); } } else { if (control_additional == msg->note_number) { float new_value = controllable->get_value() > 0.5f ? 0.0f : 1.0f; - controllable->set_value (new_value); + controllable->set_value (new_value, Controllable::NoGroup); DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Note %1 Value %2 %3\n", (int) msg->note_number, (float) new_value, current_uri())); } } @@ -331,7 +331,7 @@ MIDIControllable::midi_sense_controller (Parser &, EventTwoBytes *msg) */ if (in_sync || _surface->motorised ()) { - controllable->set_value (midi_to_control (new_value)); + controllable->set_value (midi_to_control (new_value), Controllable::NoGroup); } DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("MIDI CC %1 value %2 %3\n", (int) msg->controller_number, (float) midi_to_control(new_value), current_uri() )); @@ -341,30 +341,30 @@ MIDIControllable::midi_sense_controller (Parser &, EventTwoBytes *msg) switch (get_encoder()) { case Enc_L: if (msg->value > 0x40) { - controllable->set_value (midi_to_control (last_value - offset + 1)); + controllable->set_value (midi_to_control (last_value - offset + 1), Controllable::NoGroup); } else { - controllable->set_value (midi_to_control (last_value + offset + 1)); + controllable->set_value (midi_to_control (last_value + offset + 1), Controllable::NoGroup); } break; case Enc_R: if (msg->value > 0x40) { - controllable->set_value (midi_to_control (last_value + offset + 1)); + controllable->set_value (midi_to_control (last_value + offset + 1), Controllable::NoGroup); } else { - controllable->set_value (midi_to_control (last_value - offset + 1)); + controllable->set_value (midi_to_control (last_value - offset + 1), Controllable::NoGroup); } break; case Enc_2: if (msg->value > 0x40) { - controllable->set_value (midi_to_control (last_value - (0x7f - msg->value) + 1)); + controllable->set_value (midi_to_control (last_value - (0x7f - msg->value) + 1), Controllable::NoGroup); } else { - controllable->set_value (midi_to_control (last_value + offset + 1)); + controllable->set_value (midi_to_control (last_value + offset + 1), Controllable::NoGroup); } break; case Enc_B: if (msg->value > 0x40) { - controllable->set_value (midi_to_control (last_value + offset + 1)); + controllable->set_value (midi_to_control (last_value + offset + 1), Controllable::NoGroup); } else { - controllable->set_value (midi_to_control (last_value - (0x40 - offset))); + controllable->set_value (midi_to_control (last_value - (0x40 - offset)), Controllable::NoGroup); } break; default: @@ -375,10 +375,10 @@ MIDIControllable::midi_sense_controller (Parser &, EventTwoBytes *msg) } } else { if (msg->value > 64.0f) { - controllable->set_value (1); + controllable->set_value (1, Controllable::NoGroup); DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Midi CC %1 value 1 %2\n", (int) msg->controller_number, current_uri())); } else { - controllable->set_value (0); + controllable->set_value (0, Controllable::NoGroup); DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Midi CC %1 value 0 %2\n", (int) msg->controller_number, current_uri())); } } @@ -398,11 +398,11 @@ MIDIControllable::midi_sense_program_change (Parser &, MIDI::byte msg) if (msg == control_additional) { if (!controllable->is_toggle()) { - controllable->set_value (1.0); + controllable->set_value (1.0, Controllable::NoGroup); DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("MIDI program %1 value 1.0 %3\n", (int) msg, current_uri() )); } else { float new_value = controllable->get_value() > 0.5f ? 0.0f : 1.0f; - controllable->set_value (new_value); + controllable->set_value (new_value, Controllable::NoGroup); DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("MIDI program %1 value %2 %3\n", (int) msg, (float) new_value, current_uri())); } } @@ -420,14 +420,14 @@ MIDIControllable::midi_sense_pitchbend (Parser &, pitchbend_t pb) } if (!controllable->is_toggle()) { - controllable->set_value (midi_to_control (pb)); + controllable->set_value (midi_to_control (pb), Controllable::NoGroup); DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("MIDI pitchbend %1 value %2 %3\n", (int) control_channel, (float) midi_to_control (pb), current_uri() )); } else { if (pb > 8065.0f) { - controllable->set_value (1); + controllable->set_value (1, Controllable::NoGroup); DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Midi pitchbend %1 value 1 %2\n", (int) control_channel, current_uri())); } else { - controllable->set_value (0); + controllable->set_value (0, Controllable::NoGroup); DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Midi pitchbend %1 value 0 %2\n", (int) control_channel, current_uri())); } } @@ -457,7 +457,7 @@ MIDIControllable::rpn_value_change (Parser&, uint16_t rpn, float val) { if (control_rpn == rpn) { if (controllable) { - controllable->set_value (val); + controllable->set_value (val, Controllable::NoGroup); } } } @@ -467,7 +467,7 @@ MIDIControllable::nrpn_value_change (Parser&, uint16_t nrpn, float val) { if (control_nrpn == nrpn) { if (controllable) { - controllable->set_value (val); + controllable->set_value (val, Controllable::NoGroup); } } } diff --git a/libs/surfaces/mackie/controls.cc b/libs/surfaces/mackie/controls.cc index bbe1029f30..8ed0bad311 100644 --- a/libs/surfaces/mackie/controls.cc +++ b/libs/surfaces/mackie/controls.cc @@ -81,7 +81,7 @@ void Control::set_value (float val) { if (normal_ac) { - normal_ac->set_value (normal_ac->interface_to_internal (val)); + normal_ac->set_value (normal_ac->interface_to_internal (val), PBD::Controllable::NoGroup); } } diff --git a/libs/surfaces/mackie/strip.cc b/libs/surfaces/mackie/strip.cc index 59d99fb711..f2c56d80de 100644 --- a/libs/surfaces/mackie/strip.cc +++ b/libs/surfaces/mackie/strip.cc @@ -756,7 +756,7 @@ Strip::select_event (Button&, ButtonState bs) /* reset to default */ boost::shared_ptr ac = _fader->control (); if (ac) { - ac->set_value (ac->normal()); + ac->set_value (ac->normal(), Controllable::NoGroup); } return; } @@ -789,7 +789,7 @@ Strip::vselect_event (Button&, ButtonState bs) if (control->toggled()) { if (control->toggled()) { - control->set_value (!control->get_value()); + control->set_value (!control->get_value(), Controllable::NoGroup); } } @@ -807,7 +807,7 @@ Strip::vselect_event (Button&, ButtonState bs) if (ac) { /* reset to default/normal value */ - ac->set_value (ac->normal()); + ac->set_value (ac->normal(), Controllable::NoGroup); } } else { @@ -830,7 +830,7 @@ Strip::fader_touch_event (Button&, ButtonState bs) if (_surface->mcp().main_modifier_state() & MackieControlProtocol::MODIFIER_SHIFT) { if (ac) { - ac->set_value (ac->normal()); + ac->set_value (ac->normal(), Controllable::NoGroup); } } else { @@ -907,7 +907,7 @@ Strip::handle_button (Button& button, ButtonState bs) /* apply change */ for (MackieControlProtocol::ControlList::iterator c = controls.begin(); c != controls.end(); ++c) { - (*c)->set_value (new_value); + (*c)->set_value (new_value, Controllable::NoGroup); } } else { @@ -1778,7 +1778,7 @@ Strip::set_vpot_parameter (AutomationType p) _pan_mode = PanAzimuthAutomation; if (_surface->mcp().flip_mode() != MackieControlProtocol::Normal) { /* gain to vpot, pan azi to fader */ - _vpot->set_control (_route->group_gain_control()); + _vpot->set_control (_route->gain_control()); vpot_parameter = GainAutomation; control_by_parameter[GainAutomation] = _vpot; _fader->set_control (pan_control); @@ -1790,7 +1790,7 @@ Strip::set_vpot_parameter (AutomationType p) } else { /* gain to fader, pan azi to vpot */ vpot_parameter = PanAzimuthAutomation; - _fader->set_control (_route->group_gain_control()); + _fader->set_control (_route->gain_control()); control_by_parameter[GainAutomation] = _fader; _vpot->set_control (pan_control); control_by_parameter[PanAzimuthAutomation] = _vpot; @@ -1807,7 +1807,7 @@ Strip::set_vpot_parameter (AutomationType p) _pan_mode = PanWidthAutomation; if (_surface->mcp().flip_mode() != MackieControlProtocol::Normal) { /* gain to vpot, pan width to fader */ - _vpot->set_control (_route->group_gain_control()); + _vpot->set_control (_route->gain_control()); vpot_parameter = GainAutomation; control_by_parameter[GainAutomation] = _vpot; _fader->set_control (pan_control); @@ -1819,7 +1819,7 @@ Strip::set_vpot_parameter (AutomationType p) } else { /* gain to fader, pan width to vpot */ vpot_parameter = PanWidthAutomation; - _fader->set_control (_route->group_gain_control()); + _fader->set_control (_route->gain_control()); control_by_parameter[GainAutomation] = _fader; _vpot->set_control (pan_control); control_by_parameter[PanWidthAutomation] = _vpot; @@ -1841,7 +1841,7 @@ Strip::set_vpot_parameter (AutomationType p) vpot_parameter = TrimAutomation; if (_surface->mcp().flip_mode() != MackieControlProtocol::Normal) { /* gain to vpot, trim to fader */ - _vpot->set_control (_route->group_gain_control()); + _vpot->set_control (_route->gain_control()); control_by_parameter[GainAutomation] = _vpot; if (_route->trim() && route()->trim()->active()) { _fader->set_control (_route->trim_control()); @@ -1852,7 +1852,7 @@ Strip::set_vpot_parameter (AutomationType p) } } else { /* gain to fader, trim to vpot */ - _fader->set_control (_route->group_gain_control()); + _fader->set_control (_route->gain_control()); control_by_parameter[GainAutomation] = _fader; if (_route->trim() && route()->trim()->active()) { _vpot->set_control (_route->trim_control()); @@ -1868,7 +1868,7 @@ Strip::set_vpot_parameter (AutomationType p) vpot_parameter = PhaseAutomation; if (_surface->mcp().flip_mode() != MackieControlProtocol::Normal) { /* gain to vpot, phase to fader */ - _vpot->set_control (_route->group_gain_control()); + _vpot->set_control (_route->gain_control()); control_by_parameter[GainAutomation] = _vpot; if (_route->phase_invert().size()) { _fader->set_control (_route->phase_control()); @@ -1879,7 +1879,7 @@ Strip::set_vpot_parameter (AutomationType p) } } else { /* gain to fader, phase to vpot */ - _fader->set_control (_route->group_gain_control()); + _fader->set_control (_route->gain_control()); control_by_parameter[GainAutomation] = _fader; if (_route->phase_invert().size()) { _vpot->set_control (_route->phase_control()); @@ -1894,7 +1894,7 @@ Strip::set_vpot_parameter (AutomationType p) if (!Profile->get_mixbus()) { if (_surface->mcp().flip_mode() != MackieControlProtocol::Normal) { // gain to vpot, send to fader - _vpot->set_control (_route->group_gain_control()); + _vpot->set_control (_route->gain_control()); control_by_parameter[GainAutomation] = _vpot; // test for send to control boost::shared_ptr p = _route->nth_send (_current_send); @@ -1912,7 +1912,7 @@ Strip::set_vpot_parameter (AutomationType p) } } else { // gain to fader, send to vpot - _fader->set_control (_route->group_gain_control()); + _fader->set_control (_route->gain_control()); control_by_parameter[GainAutomation] = _fader; boost::shared_ptr p = _route->nth_send (_current_send); if (p && p->name() != "Monitor 1") { @@ -1925,7 +1925,7 @@ Strip::set_vpot_parameter (AutomationType p) control_by_parameter[SendAutomation] = _vpot; } else { // gain to fader, send to vpot - _fader->set_control (_route->group_gain_control()); + _fader->set_control (_route->gain_control()); control_by_parameter[GainAutomation] = _fader; boost::shared_ptr p = _route->nth_send (_current_send); if (p && p->name() != "Monitor 1") { diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 49c8bcc57c..c29469667c 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -1108,7 +1108,7 @@ OSC::route_plugin_parameter (int rid, int piid, int par, float val) boost::shared_ptr c = pi->automation_control (Evoral::Parameter(PluginAutomation, 0, controlid)); // cerr << "parameter:" << redi->describe_parameter(controlid) << " val:" << val << "\n"; - c->set_value (val); + c->set_value (val, PBD::Controllable::NoGroup); } else { PBD::warning << "OSC: Parameter # " << par << " for plugin # " << piid << " on RID '" << rid << "' is out of range" << endmsg; PBD::info << "OSC: Valid range min=" << pd.lower << " max=" << pd.upper << endmsg; -- cgit v1.2.3