X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fautomation_list.cc;h=a081418017940f72ffe61d6926e3c8fd236a59e3;hb=e24ca13394da73f2cf5f3ffa99b0fc0c8dacaff9;hp=8ceab4f3ea84dcc0e13fc40d3e34fb64b08df85e;hpb=c4578db595771b5db9572b23cfe3f9a7ebef66c3;p=ardour.git diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc index 8ceab4f3ea..a081418017 100644 --- a/libs/ardour/automation_list.cc +++ b/libs/ardour/automation_list.cc @@ -161,19 +161,22 @@ AutomationList::create_curve_if_necessary() default: break; } + + WritePassStarted.connect_same_thread (_writepass_connection, boost::bind (&AutomationList::snapshot_history, this, false)); } AutomationList& AutomationList::operator= (const AutomationList& other) { if (this != &other) { - + ControlList::freeze (); + /* ControlList::operator= calls copy_events() which calls + * mark_dirty() and maybe_signal_changed() + */ ControlList::operator= (other); _state = other._state; _touching = other._touching; - - mark_dirty (); - maybe_signal_changed (); + ControlList::thaw (); } return *this; @@ -189,19 +192,29 @@ AutomationList::maybe_signal_changed () } } +AutoState +AutomationList::automation_state() const +{ + Glib::Threads::RWLock::ReaderLock lm (Evoral::ControlList::_lock); + return _state; +} + void AutomationList::set_automation_state (AutoState s) { - if (s != _state) { + { + Glib::Threads::RWLock::ReaderLock lm (Evoral::ControlList::_lock); + + if (s == _state) { + return; + } _state = s; - delete _before; if (s == Write && _desc.toggled) { - _before = &get_state (); - } else { - _before = 0; + snapshot_history (true); } - automation_state_changed (s); /* EMIT SIGNAL */ } + + automation_state_changed (s); /* EMIT SIGNAL */ } Evoral::ControlList::InterpolationStyle @@ -211,10 +224,6 @@ AutomationList::default_interpolation () const case GainAutomation: case BusSendLevel: case EnvelopeAutomation: -#ifndef XXX_NEW_INTERPOLATON__BREAK_SESSION_FORMAT_XXX - /* use old, wrong linear gain interpolation */ - return ControlList::Linear; -#endif return ControlList::Exponential; break; case TrimAutomation: @@ -230,12 +239,7 @@ AutomationList::default_interpolation () const void AutomationList::start_write_pass (double when) { - delete _before; - if (in_new_write_pass ()) { - _before = &get_state (); - } else { - _before = 0; - } + snapshot_history (true); ControlList::start_write_pass (when); } @@ -248,15 +252,15 @@ AutomationList::write_pass_finished (double when, double thinning_factor) void AutomationList::start_touch (double when) { - if (_state == Touch) { + if (_state == Touch) { start_write_pass (when); - } + } g_atomic_int_set (&_touching, 1); } void -AutomationList::stop_touch (bool mark, double) +AutomationList::stop_touch (double) { if (g_atomic_int_get (&_touching) == 0) { /* this touch has already been stopped (probably by Automatable::transport_stopped), @@ -266,16 +270,6 @@ AutomationList::stop_touch (bool mark, double) } g_atomic_int_set (&_touching, 0); - - if (_state == Touch) { - - if (mark) { - - /* XXX need to mark the last added point with the - * current time - */ - } - } } /* _before may be owned by the undo stack, @@ -290,6 +284,17 @@ AutomationList::clear_history () _before = 0; } +void +AutomationList::snapshot_history (bool need_lock) +{ + if (!in_new_write_pass ()) { + return; + } + delete _before; + _before = &state (true, need_lock); +} + + void AutomationList::thaw () { @@ -335,32 +340,17 @@ AutomationList::memento_command (XMLNode* before, XMLNode* after) XMLNode& AutomationList::get_state () { - return state (true); + return state (true, true); } XMLNode& -AutomationList::state (bool full) +AutomationList::state (bool full, bool need_lock) { XMLNode* root = new XMLNode (X_("AutomationList")); root->set_property ("automation-id", EventTypeMap::instance().to_symbol(_parameter)); root->set_property ("id", id()); - -#ifndef XXX_NEW_INTERPOLATON__BREAK_SESSION_FORMAT_XXX - /* force new enums to existing ones in session-file */ - Evoral::ControlList::InterpolationStyle is = _interpolation; - switch (is) { - case ControlList::Exponential: - case ControlList::Logarithmic: - is = ControlList::Linear; - break; - default: - break; - } - root->set_property ("interpolation-style", is); -#else root->set_property ("interpolation-style", _interpolation); -#endif if (full) { /* never serialize state with Write enabled - too dangerous @@ -381,18 +371,22 @@ AutomationList::state (bool full) } if (!_events.empty()) { - root->add_child_nocopy (serialize_events()); + root->add_child_nocopy (serialize_events (need_lock)); } return *root; } XMLNode& -AutomationList::serialize_events () +AutomationList::serialize_events (bool need_lock) { XMLNode* node = new XMLNode (X_("events")); stringstream str; + Glib::Threads::RWLock::ReaderLock lm (Evoral::ControlList::_lock, Glib::Threads::NOT_LOCK); + if (need_lock) { + lm.acquire (); + } for (iterator xx = _events.begin(); xx != _events.end(); ++xx) { str << PBD::to_string ((*xx)->when); str << ' '; @@ -531,12 +525,6 @@ AutomationList::set_state (const XMLNode& node, int version) if (!node.get_property (X_("interpolation-style"), _interpolation)) { _interpolation = default_interpolation (); } -#ifndef XXX_NEW_INTERPOLATON__BREAK_SESSION_FORMAT_XXX - /* internally force logarithmic and Trim params to use Log-scale */ - if (_desc.logarithmic || _parameter.type() == TrimAutomation) { - _interpolation = ControlList::Logarithmic; - } -#endif if (node.get_property (X_("state"), _state)) { if (_state == Write) { @@ -587,4 +575,3 @@ AutomationListProperty::clone () const boost::shared_ptr (new AutomationList (*this->_current.get())) ); } -