cerr << _name << ": added parameter " << param.to_string() << endl;
- // FIXME: sane default behaviour?
- _visible_controls.insert(param);
_can_automate_list.insert(param);
// Sync everything (derived classes) up to initial values
return i->second;
} else if (create_if_missing) {
- assert(parameter.type() != GainAutomation);
boost::shared_ptr<AutomationList> al (new AutomationList (
parameter, FLT_MIN, FLT_MAX, default_parameter_value (parameter)));
boost::shared_ptr<AutomationControl> ac (new AutomationControl(_session, al));
add_control(ac);
+ cerr << "WARNING: Default AutomationControl created for " << parameter.to_string() << endl;
return ac;
} else {
if (param == ParamID(GainAutomation))
return _("Fader");
- else if (param == ParamID(PanAutomation))
- return _("Pan");
+ else if (param.type() == PanAutomation)
+ return (string_compose(_("Pan %1"), param.id()));
else if (param.type() == MidiCCAutomation)
return string_compose("CC %1", param.id());
else
}
AutoState
-Automatable::get_parameter_automation_state (ParamID param)
+Automatable::get_parameter_automation_state (ParamID param, bool lock)
{
- Glib::Mutex::Lock lm (_automation_lock);
+ AutoState result = Off;
+
+ if (lock)
+ _automation_lock.lock();
boost::shared_ptr<AutomationControl> c = control(param);
- if (c) {
- return c->list()->automation_state();
- } else {
- return Off;
- }
+ if (c)
+ result = c->list()->automation_state();
+
+ if (lock)
+ _automation_lock.unlock();
+
+ return result;
}
void
}
}
+void
+Automatable::transport_stopped (nframes_t now)
+{
+ for (Controls::iterator li = _controls.begin(); li != _controls.end(); ++li) {
+
+ boost::shared_ptr<AutomationControl> c = li->second;
+
+ c->list()->reposition_for_rt_add (now);
+
+ if (c->list()->automation_state() != Off) {
+ c->set_value(c->list()->eval(now));
+ }
+ }
+}
+