void set_value (double val, PBD::Controllable::GroupControlDisposition group_override) {
boost::shared_ptr<Route> r = _route.lock();
if (r) {
+ /* Route must mediate group control */
r->set_control ((AutomationType) parameter().type(), val, group_override);
}
}
void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
};
+ class LIBARDOUR_API SoloIsolateControllable : public RouteAutomationControl {
+ public:
+ SoloIsolateControllable (std::string name, boost::shared_ptr<Route>);
+ void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+ /* currently no automation, so no need for set_value_unchecked() */
+ double get_value () const;
+ private:
+ void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+ static ParameterDescriptor get_descriptor ();
+ };
+
+ class LIBARDOUR_API SoloSafeControllable : public RouteAutomationControl {
+ public:
+ SoloSafeControllable (std::string name, boost::shared_ptr<Route>);
+ void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+ /* currently no automation, so no need for set_value_unchecked() */
+ double get_value () const;
+ private:
+ void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+ static ParameterDescriptor get_descriptor ();
+ };
+
void set_control (AutomationType, double val, PBD::Controllable::GroupControlDisposition group_override);
boost::shared_ptr<SoloControllable> solo_control() const {
return _phase_control;
}
+ boost::shared_ptr<SoloIsolateControllable> solo_isolate_control() const {
+ return _solo_isolate_control;
+ }
+
+ boost::shared_ptr<SoloSafeControllable> solo_safe_control() const {
+ return _solo_safe_control;
+ }
+
+ boost::shared_ptr<AutomationControl> monitoring_control() const {
+ /* tracks override this to provide actual monitoring control;
+ busses have no possible choices except input monitoring.
+ */
+ return boost::shared_ptr<AutomationControl> ();
+ }
+
/* 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.
boost::shared_ptr<MuteControllable> _mute_control;
boost::shared_ptr<MuteMaster> _mute_master;
boost::shared_ptr<PhaseControllable> _phase_control;
+ boost::shared_ptr<SoloIsolateControllable> _solo_isolate_control;
+ boost::shared_ptr<SoloSafeControllable> _solo_safe_control;
virtual void act_on_mute () {}
case GainAutomation:
/* route must mediate group control */
set_gain (val, group_override);
- return;
break;
case TrimAutomation:
/* route must mediate group control */
set_trim (val, group_override);
- return;
break;
case RecEnableAutomation:
rl.reset (new RouteList);
rl->push_back (shared_from_this());
_session.set_record_enabled (rl, val >= 0.5 ? true : false, Session::rt_cleanup, group_override);
- return;
break;
case SoloAutomation:
if (Config->get_solo_control_is_listen_control()) {
_session.set_listen (rl, val >= 0.5 ? true : false, Session::rt_cleanup, group_override);
} else {
- _session.set_solo (rl, val >= 0.5 ? true : false);
+ _session.set_solo (rl, val >= 0.5 ? true : false, Session::rt_cleanup, group_override);
}
-
- return;
break;
case MuteAutomation:
void
Route::SoloControllable::_set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
{
- const bool bval = ((val >= 0.5) ? true : false);
-
- boost::shared_ptr<RouteList> rl (new RouteList);
-
boost::shared_ptr<Route> r = _route.lock ();
if (!r) {
return;
}
-
- rl->push_back (r);
-
- if (Config->get_solo_control_is_listen_control()) {
- _session.set_listen (rl, bval, Session::rt_cleanup, group_override);
- } else {
- _session.set_solo (rl, bval, Session::rt_cleanup, group_override);
- }
+ r->set_control (SoloAutomation, val, group_override);
}
void
void
Route::MuteControllable::_set_value (double val, Controllable::GroupControlDisposition group_override)
{
- const bool bval = ((val >= 0.5) ? true : false);
-
boost::shared_ptr<Route> r = _route.lock ();
+
if (!r) {
return;
}
if (_list && ((AutomationList*)_list.get())->automation_playback()) {
// Set superficial/automation value to drive controller (and possibly record)
+ const bool bval = ((val >= 0.5) ? true : false);
set_superficial_value (bval);
// Playing back automation, set route mute directly
r->set_mute (bval, Controllable::NoGroup);
} else {
- // Set from user, queue mute event
- boost::shared_ptr<RouteList> rl (new RouteList);
- rl->push_back (r);
- _session.set_mute (rl, bval, Session::rt_cleanup, group_override);
+ r->set_control (MuteAutomation, val, group_override);
}
}
return _current_phase;
}
+Route::SoloIsolateControllable::SoloIsolateControllable (std::string name, boost::shared_ptr<Route> r)
+ : RouteAutomationControl (name, SoloIsolateAutomation, get_descriptor(), boost::shared_ptr<AutomationList>(), r)
+{
+ boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloIsolateAutomation)));
+ gl->set_interpolation(Evoral::ControlList::Discrete);
+ set_list (gl);
+}
+
+
+double
+Route::SoloIsolateControllable::get_value () const
+{
+ boost::shared_ptr<Route> r = _route.lock ();
+ if (!r) {
+ return 0.0; /* "false" */
+ }
+
+ return r->solo_isolated() ? 1.0 : 0.0;
+}
+
+void
+Route::SoloIsolateControllable::set_value (double val, PBD::Controllable::GroupControlDisposition gcd)
+{
+ _set_value (val, gcd);
+}
+
+void
+Route::SoloIsolateControllable::_set_value (double val, PBD::Controllable::GroupControlDisposition)
+{
+ boost::shared_ptr<Route> r = _route.lock ();
+ if (!r) {
+ return;
+ }
+
+ /* no group semantics yet */
+ r->set_solo_isolated (val >= 0.5 ? true : false);
+}
+
+ParameterDescriptor
+Route::SoloIsolateControllable::get_descriptor()
+{
+ ParameterDescriptor desc;
+ desc.type = SoloIsolateAutomation;
+ desc.toggled = true;
+ return desc;
+}
+
+Route::SoloSafeControllable::SoloSafeControllable (std::string name, boost::shared_ptr<Route> r)
+ : RouteAutomationControl (name, SoloSafeAutomation, get_descriptor(), boost::shared_ptr<AutomationList>(), r)
+{
+ boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloSafeAutomation)));
+ gl->set_interpolation(Evoral::ControlList::Discrete);
+ set_list (gl);
+}
+
+void
+Route::SoloSafeControllable::set_value (double val, PBD::Controllable::GroupControlDisposition gcd)
+{
+ _set_value (val, gcd);
+}
+
+void
+Route::SoloSafeControllable::_set_value (double val, PBD::Controllable::GroupControlDisposition)
+{
+ boost::shared_ptr<Route> r = _route.lock ();
+ if (!r) {
+ return;
+ }
+
+ /* no group semantics yet */
+ r->set_solo_safe (val >= 0.5 ? true : false);
+}
+
+double
+Route::SoloSafeControllable::get_value () const
+{
+ boost::shared_ptr<Route> r = _route.lock ();
+ if (!r) {
+ return 0.0; /* "false" */
+ }
+
+ return r->solo_safe() ? 1.0 : 0.0;
+}
+
+ParameterDescriptor
+Route::SoloSafeControllable::get_descriptor()
+{
+ ParameterDescriptor desc;
+ desc.type = SoloSafeAutomation;
+ desc.toggled = true;
+ return desc;
+}