static void dumpit (const AutomationList& al, string prefix = "")
{
cerr << prefix << &al << endl;
- for (AutomationList::const_iterator i = al.const_begin(); i != al.const_end(); ++i) {
+ for (AutomationList::const_iterator i = al.begin(); i != al.end(); ++i) {
cerr << prefix << '\t' << (*i)->when << ',' << (*i)->value << endl;
}
cerr << "\n";
}
#endif
-
AutomationList::AutomationList (Evoral::Parameter id)
: ControlList(id)
{
{
switch (_parameter.type()) {
case GainAutomation:
- case PanAutomation:
+ case PanAzimuthAutomation:
+ case PanElevationAutomation:
+ case PanWidthAutomation:
case FadeInAutomation:
case FadeOutAutomation:
case EnvelopeAutomation:
if (_state == Write) {
Glib::Mutex::Lock lm (ControlList::_lock);
- nascent.push_back (new NascentInfo (false));
+ nascent.push_back (new NascentInfo ());
}
-
automation_state_changed (s); /* EMIT SIGNAL */
}
}
{
if (_state == Touch) {
Glib::Mutex::Lock lm (ControlList::_lock);
- nascent.push_back (new NascentInfo (true, when));
+ nascent.push_back (new NascentInfo (when));
}
g_atomic_int_set (&_touching, 1);
void
AutomationList::stop_touch (bool mark, double when)
{
+ if (g_atomic_int_get (&_touching) == 0) {
+ /* this touch has already been stopped (probably by Automatable::transport_stopped),
+ so we've nothing to do.
+ */
+ return;
+ }
+
g_atomic_int_set (&_touching, 0);
if (_state == Touch) {
+
+ assert (!nascent.empty ());
+
Glib::Mutex::Lock lm (ControlList::_lock);
-
+
if (mark) {
- nascent.back()->end_time = when;
-
+
+ nascent.back()->end_time = when;
+
} else {
-
+
/* nascent info created in start touch but never used. just get rid of it.
*/
-
+
NascentInfo* ninfo = nascent.back ();
nascent.erase (nascent.begin());
delete ninfo;
root->add_property ("automation-id", EventTypeMap::instance().to_symbol(_parameter));
- root->add_property ("id", _id.to_s());
+ root->add_property ("id", id().to_s());
snprintf (buf, sizeof (buf), "%.12g", _default_value);
root->add_property ("default", buf);
}
thaw ();
-
+
return 0;
}
const XMLNodeList& elist = node.children();
XMLNodeConstIterator i;
XMLProperty* prop;
- nframes_t x;
+ pframes_t x;
double y;
ControlList::freeze ();
return -1;
}
- if ((prop = node.property ("id")) != 0) {
- _id = prop->value ();
+ if (set_id (node)) {
/* update session AL list */
AutomationListCreated(this);
}
_state = Off;
}
- if ((prop = node.property (X_("min_yval"))) != 0) {
+ if ((prop = node.property (X_("min-yval"))) != 0) {
_min_yval = atof (prop->value ().c_str());
} else {
_min_yval = FLT_MIN;
}
- if ((prop = node.property (X_("max_yval"))) != 0) {
+ if ((prop = node.property (X_("max-yval"))) != 0) {
_max_yval = atof (prop->value ().c_str());
} else {
_max_yval = FLT_MAX;
}
- if ((prop = node.property (X_("max_xval"))) != 0) {
+ if ((prop = node.property (X_("max-xval"))) != 0) {
_max_xval = atof (prop->value ().c_str());
} else {
_max_xval = 0; // means "no limit ;
}
bool have_events = false;
-
+
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
if ((*niter)->name() == X_("events")) {
deserialize_events (*(*niter));