diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index ef99fc70d3..906ff4ed3e 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -365,32 +365,34 @@ void Automatable::transport_stopped (framepos_t now) { for (Controls::iterator li = controls().begin(); li != controls().end(); ++li) { + boost::shared_ptr c = + boost::dynamic_pointer_cast(li->second); + if (!c) { + continue; + } - boost::shared_ptr c - = boost::dynamic_pointer_cast(li->second); - if (c) { - boost::shared_ptr l - = boost::dynamic_pointer_cast(c->list()); + boost::shared_ptr l = + boost::dynamic_pointer_cast(c->list()); + if (!l) { + continue; + } - if (l) { - /* Stop any active touch gesture just before we mark the write pass - as finished. If we don't do this, the transport can end up stopped with - an AutomationList thinking that a touch is still in progress and, - when the transport is re-started, a touch will magically - be happening without it ever have being started in the usual way. - */ - l->stop_touch (true, now); - l->write_pass_finished (now); + /* Stop any active touch gesture just before we mark the write pass + as finished. If we don't do this, the transport can end up stopped with + an AutomationList thinking that a touch is still in progress and, + when the transport is re-started, a touch will magically + be happening without it ever have being started in the usual way. + */ + l->stop_touch (true, now); + l->write_pass_finished (now, Config->get_automation_thinning_factor()); - if (l->automation_playback()) { - c->set_value(c->list()->eval(now)); - } + if (l->automation_playback()) { + c->set_value(c->list()->eval(now)); + } - if (l->automation_state() == Write) { - l->set_automation_state (Touch); - } - } - } + if (l->automation_state() == Write) { + l->set_automation_state (Touch); + } } } diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 0fb5171882..8463b92503 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -3503,8 +3503,6 @@ Session::config_changed (std::string p, bool ours) last_timecode_valid = false; } else if (p == "playback-buffer-seconds") { AudioSource::allocate_working_buffers (frame_rate()); - } else if (p == "automation-thinning-factor") { - Evoral::ControlList::set_thinning_factor (Config->get_automation_thinning_factor()); } else if (p == "ltc-source-port") { reconnect_ltc_input (); } else if (p == "ltc-sink-port") { diff --git a/libs/evoral/evoral/ControlList.hpp b/libs/evoral/evoral/ControlList.hpp index e2609ad681..d6704c8e43 100644 --- a/libs/evoral/evoral/ControlList.hpp +++ b/libs/evoral/evoral/ControlList.hpp @@ -131,7 +131,20 @@ public: bool move_ranges (std::list< RangeMove > const &); void modify (iterator, double, double); - void thin (); + /** Thin the number of events in this list. + * + * The thinning factor has no units but corresponds to the area of a + * triangle computed between three points in the list. If the area is + * large, it indicates significant non-linearity between the points. + * + * During automation recording we thin the recorded points using this + * value. If a point is sufficiently co-linear with its neighbours (as + * defined by the area of the triangle formed by three of them), we will + * not include it in the list. The larger the value, the more points are + * excluded, so this effectively measures the amount of thinning to be + * done. + */ + void thin (double thinning_factor); boost::shared_ptr cut (double, double); boost::shared_ptr copy (double, double); @@ -245,7 +258,7 @@ public: virtual bool writing() const { return false; } virtual bool touch_enabled() const { return false; } void start_write_pass (double time); - void write_pass_finished (double when); + void write_pass_finished (double when, double thinning_factor=0.0); void set_in_write_pass (bool, bool add_point = false, double when = 0.0); bool in_write_pass () const; @@ -254,9 +267,6 @@ public: /** Emitted when our interpolation style changes */ PBD::Signal1 InterpolationChanged; - static void set_thinning_factor (double d); - static double thinning_factor() { return _thinning_factor; } - bool operator!= (ControlList const &) const; void invalidate_insert_iterator (); @@ -291,8 +301,6 @@ protected: Curve* _curve; - static double _thinning_factor; - private: iterator most_recent_insert_iterator; double insert_position; diff --git a/libs/evoral/src/ControlList.cpp b/libs/evoral/src/ControlList.cpp index b1f10410ad..5d85dfa407 100644 --- a/libs/evoral/src/ControlList.cpp +++ b/libs/evoral/src/ControlList.cpp @@ -36,22 +36,6 @@ inline bool event_time_less_than (ControlEvent* a, ControlEvent* b) return a->when < b->when; } -/* this has no units but corresponds to the area of a rectangle - computed between three points in the list. If the area is - large, it indicates significant non-linearity between the - points. - - during automation recording we thin the recorded points - using this value. if a point is sufficiently co-linear - with its neighbours (as defined by the area of the rectangle - formed by three of them), we will not include it in the - ControlList. a smaller value will exclude less points, - a larger value will exclude more points, so it effectively - measures the amount of thinning to be done. -*/ - -double ControlList::_thinning_factor = 20.0; - ControlList::ControlList (const Parameter& id) : _parameter(id) , _interpolation(id.toggled() ? Discrete : Linear) @@ -258,8 +242,12 @@ struct ControlEventTimeComparator { }; void -ControlList::thin () +ControlList::thin (double thinning_factor) { + if (thinning_factor == 0.0) { + return; + } + bool changed = false; { @@ -287,7 +275,7 @@ ControlList::thin () (prev->when * (cur->value - prevprev->value)) + (cur->when * (prevprev->value - prev->value))); - if (area < _thinning_factor) { + if (area < thinning_factor) { iterator tmp = pprev; /* pprev will change to current @@ -364,12 +352,12 @@ ControlList::start_write_pass (double when) } void -ControlList::write_pass_finished (double /*when*/) +ControlList::write_pass_finished (double /*when*/, double thinning_factor) { DEBUG_TRACE (DEBUG::ControlList, "write pass finished\n"); if (did_write_during_pass) { - thin (); + thin (thinning_factor); did_write_during_pass = false; } new_write_pass = true; @@ -1738,12 +1726,6 @@ ControlList::set_interpolation (InterpolationStyle s) InterpolationChanged (s); /* EMIT SIGNAL */ } -void -ControlList::set_thinning_factor (double v) -{ - _thinning_factor = v; -} - bool ControlList::operator!= (ControlList const & other) const {