X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fautomation_list.cc;h=83df92488b02087b3adf6357992ffe57da0224de;hb=b9054a1f723f6107f42a04ae9838820bbbd1f0ce;hp=f4f4f95238efe3defda0df552156544a263ddd38;hpb=73192bc1a7ea55fa1864dc3826845b15c00dd2ec;p=ardour.git diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc index f4f4f95238..83df92488b 100644 --- a/libs/ardour/automation_list.cc +++ b/libs/ardour/automation_list.cc @@ -124,7 +124,9 @@ AutomationList::create_curve_if_necessary() { switch (_parameter.type()) { case GainAutomation: - case PanAutomation: + case PanAzimuthAutomation: + case PanElevationAutomation: + case PanWidthAutomation: case FadeInAutomation: case FadeOutAutomation: case EnvelopeAutomation: @@ -154,7 +156,6 @@ AutomationList::operator= (const AutomationList& other) _min_yval = other._min_yval; _max_yval = other._max_yval; - _max_xval = other._max_xval; _default_value = other._default_value; mark_dirty (); @@ -179,12 +180,6 @@ AutomationList::set_automation_state (AutoState s) { if (s != _state) { _state = s; - - if (_state == Write) { - Glib::Mutex::Lock lm (ControlList::_lock); - nascent.push_back (new NascentInfo (false)); - } - automation_state_changed (s); /* EMIT SIGNAL */ } } @@ -202,32 +197,31 @@ void AutomationList::start_touch (double when) { if (_state == Touch) { - Glib::Mutex::Lock lm (ControlList::_lock); - nascent.push_back (new NascentInfo (true, when)); + start_write_pass (when); } g_atomic_int_set (&_touching, 1); } void -AutomationList::stop_touch (bool mark, double when) +AutomationList::stop_touch (bool mark, double) { + 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) { - Glib::Mutex::Lock lm (ControlList::_lock); - + if (mark) { - 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; + + /* XXX need to mark the last added point with the + * current time + */ } } } @@ -258,7 +252,7 @@ AutomationList::state (bool full) 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); @@ -266,8 +260,6 @@ AutomationList::state (bool full) root->add_property ("min-yval", buf); snprintf (buf, sizeof (buf), "%.12g", _max_yval); root->add_property ("max-yval", buf); - snprintf (buf, sizeof (buf), "%.12g", _max_xval); - root->add_property ("max-xval", buf); root->add_property ("interpolation-style", enum_2_string (_interpolation)); @@ -354,6 +346,8 @@ AutomationList::deserialize_events (const XMLNode& node) fast_simple_add (x, y); } + thin (); + if (!ok) { clear (); error << _("automation list: cannot load coordinates from XML, all points ignored") << endmsg; @@ -370,6 +364,7 @@ AutomationList::deserialize_events (const XMLNode& node) int AutomationList::set_state (const XMLNode& node, int version) { + LocaleGuard lg (X_("POSIX")); XMLNodeList nlist = node.children(); XMLNode* nsos; XMLNodeIterator niter; @@ -415,6 +410,8 @@ AutomationList::set_state (const XMLNode& node, int version) fast_simple_add (x, y); } + thin (); + thaw (); return 0; @@ -425,8 +422,7 @@ AutomationList::set_state (const XMLNode& node, int version) return -1; } - if ((prop = node.property ("id")) != 0) { - _id = prop->value (); + if (set_id (node)) { /* update session AL list */ AutomationListCreated(this); } @@ -434,7 +430,7 @@ AutomationList::set_state (const XMLNode& node, int version) if ((prop = node.property (X_("automation-id"))) != 0){ _parameter = EventTypeMap::instance().new_parameter(prop->value()); } else { - warning << "Legacy session: automation list has no automation-id property."; + warning << "Legacy session: automation list has no automation-id property." << endmsg; } if ((prop = node.property (X_("interpolation-style"))) != 0) { @@ -460,6 +456,7 @@ AutomationList::set_state (const XMLNode& node, int version) if (_state == Write) { _state = Off; } + automation_state_changed(_state); } else { _state = Off; } @@ -476,14 +473,8 @@ AutomationList::set_state (const XMLNode& node, int version) _max_yval = FLT_MAX; } - 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)); @@ -503,3 +494,24 @@ AutomationList::set_state (const XMLNode& node, int version) return 0; } +bool +AutomationList::operator!= (AutomationList const & other) const +{ + return ( + static_cast (*this) != static_cast (other) || + _state != other._state || + _style != other._style || + _touching != other._touching + ); +} + +PBD::PropertyBase * +AutomationListProperty::clone () const +{ + return new AutomationListProperty ( + this->property_id(), + boost::shared_ptr (new AutomationList (*this->_old.get())), + boost::shared_ptr (new AutomationList (*this->_current.get())) + ); +} +