boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
_rec_enable_control = boost::shared_ptr<RecEnableControl> (new RecEnableControl(rt));
_rec_enable_control->set_flags (Controllable::Toggle);
+ _monitoring_control.reset (new MonitoringControllable (X_("monitoring"), rt));
/* don't add rec_enable_control to controls because we don't want it to
* appear as an automatable parameter
}
void
-Track::RecEnableControl::set_value (double val)
+Track::RecEnableControl::set_value (double val, Controllable::GroupControlDisposition group_override)
+{
+ if (writable()) {
+ _set_value (val, group_override);
+ }
+}
+
+void
+Track::RecEnableControl::set_value_unchecked (double val)
+{
+ if (writable()) {
+ _set_value (val, Controllable::NoGroup);
+ }
+}
+
+void
+Track::RecEnableControl::_set_value (double val, Controllable::GroupControlDisposition group_override)
{
boost::shared_ptr<Track> t = track.lock ();
if (!t) {
return;
}
- t->set_record_enabled (val >= 0.5 ? true : false, this);
+ t->set_record_enabled (val >= 0.5 ? true : false, group_override);
}
double
}
void
-Track::prep_record_enabled (bool yn, void *src)
+Track::prep_record_enabled (bool yn, Controllable::GroupControlDisposition group_override)
{
if (yn && record_safe ()) {
return;
return;
}
- if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
- _route_group->apply (&Track::prep_record_enabled, yn, _route_group);
+ if (use_group (group_override, &RouteGroup::is_recenable)) {
+ _route_group->apply (&Track::prep_record_enabled, yn, Controllable::NoGroup);
return;
}
}
void
-Track::set_record_enabled (bool yn, void *src)
+Track::set_record_enabled (bool yn, Controllable::GroupControlDisposition group_override)
{
if (_diskstream->record_safe ()) {
return;
return;
}
- if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
- _route_group->apply (&Track::set_record_enabled, yn, _route_group);
+ if (use_group (group_override, &RouteGroup::is_recenable)) {
+ _route_group->apply (&Track::set_record_enabled, yn, Controllable::NoGroup);
return;
}
}
void
-Track::set_record_safe (bool yn, void *src)
+Track::set_record_safe (bool yn, Controllable::GroupControlDisposition group_override)
{
- if (!_session.writable()) { /* REQUIRES REVIEW */
+ if (!_session.writable()) {
return;
}
- if (_freeze_record.state == Frozen) { /* REQUIRES REVIEW */
+ if (_freeze_record.state == Frozen) {
return;
}
- if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
- _route_group->apply (&Track::set_record_safe, yn, _route_group);
+ if (use_group (group_override, &RouteGroup::is_recenable)) {
+ _route_group->apply (&Track::set_record_safe, yn, Controllable::NoGroup);
return;
}
}
void
-Track::set_monitoring (MonitorChoice mc)
+Track::set_monitoring (MonitorChoice mc, Controllable::GroupControlDisposition gcd)
{
+ if (use_group (gcd, &RouteGroup::is_monitoring)) {
+ _route_group->apply (&Track::set_monitoring, mc, Controllable::NoGroup);
+ return;
+ }
+
if (mc != _monitoring) {
_monitoring = mc;
}
MonitoringChanged (); /* EMIT SIGNAL */
+ _monitoring_control->Changed (); /* EMIT SIGNAL */
}
}
return rv ? MeteringInput : MeteringRoute;
}
+Track::MonitoringControllable::MonitoringControllable (std::string name, boost::shared_ptr<Track> r)
+ : RouteAutomationControl (name, MonitoringAutomation, boost::shared_ptr<AutomationList>(), r)
+{
+ boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MonitoringAutomation)));
+ gl->set_interpolation(Evoral::ControlList::Discrete);
+ set_list (gl);
+}
+
+void
+Track::MonitoringControllable::set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+ _set_value (val, gcd);
+}
+
+void
+Track::MonitoringControllable::_set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+ boost::shared_ptr<Route> r = _route.lock();
+ if (!r) {
+ return;
+ }
+
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (r);
+ if (!t) {
+ return;
+ }
+
+ int mc = (int) val;
+
+ if (mc < MonitorAuto || mc > MonitorDisk) {
+ return;
+ }
+
+ /* no group effect at present */
+
+ t->set_monitoring ((MonitorChoice) mc, gcd);
+}
+
+double
+Track::MonitoringControllable::get_value () const
+{
+ boost::shared_ptr<Route> r = _route.lock();
+ if (!r) {
+ return 0.0;
+ }
+
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (r);
+ if (!t) {
+ return 0.0;
+ }
+
+ return t->monitoring_choice();
+}