summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/automation_list.cc4
-rw-r--r--libs/ardour/route.cc1
-rw-r--r--libs/evoral/evoral/ControlList.hpp2
-rw-r--r--libs/evoral/src/ControlList.cpp62
-rw-r--r--libs/evoral/src/Curve.cpp2
5 files changed, 68 insertions, 3 deletions
diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc
index 2e28bb8bb1..0810d2f2d0 100644
--- a/libs/ardour/automation_list.cc
+++ b/libs/ardour/automation_list.cc
@@ -366,6 +366,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;
@@ -427,6 +429,8 @@ AutomationList::set_state (const XMLNode& node, int version)
fast_simple_add (x, y);
}
+ thin ();
+
thaw ();
return 0;
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index 18ee909689..00507627b5 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -504,6 +504,7 @@ Route::process_output_buffers (BufferSet& bufs,
}
}
#endif
+
/* should we NOT run plugins here if the route is inactive?
do we catch route != active somewhere higher?
*/
diff --git a/libs/evoral/evoral/ControlList.hpp b/libs/evoral/evoral/ControlList.hpp
index 792de036a6..286974676f 100644
--- a/libs/evoral/evoral/ControlList.hpp
+++ b/libs/evoral/evoral/ControlList.hpp
@@ -130,6 +130,8 @@ public:
bool move_ranges (std::list< RangeMove<double> > const &);
void modify (iterator, double, double);
+ void thin ();
+
boost::shared_ptr<ControlList> cut (double, double);
boost::shared_ptr<ControlList> copy (double, double);
void clear (double, double);
diff --git a/libs/evoral/src/ControlList.cpp b/libs/evoral/src/ControlList.cpp
index 222f72958f..d3532eaefe 100644
--- a/libs/evoral/src/ControlList.cpp
+++ b/libs/evoral/src/ControlList.cpp
@@ -390,7 +390,67 @@ ControlList::rt_add (double when, double value)
/* we don't worry about adding events out of time order as we will
sort them in merge_nascent.
*/
- nascent.back()->events.push_back (new ControlEvent (when, value));
+
+ EventList& el (nascent.back()->events);
+
+ if (el.size() > 1 && (when >= el.back()->when) && (value == el.back()->value)) {
+ /* same value, later timestamp, effective slope is
+ * zero, so just move the last point in nascent to our
+ * new time position. this avoids storing an unlimited
+ * number of points to represent a flat line.
+ */
+ el.back()->when = when;
+ } else {
+ nascent.back()->events.push_back (new ControlEvent (when, value));
+ }
+ }
+}
+
+void
+ControlList::thin ()
+{
+ Glib::Mutex::Lock lm (_lock);
+
+ ControlEvent* prevprev;
+ ControlEvent* cur;
+ ControlEvent* prev;
+ iterator pprev;
+ int counter = 0;
+
+ for (iterator i = _events.begin(); i != _events.end(); ++i) {
+
+ cur = *i;
+ counter++;
+
+ if (counter > 2) {
+
+ double area = fabs (0.5 *
+ (prevprev->when * (prev->value - cur->value)) +
+ (prev->when * (cur->value - prevprev->value)) +
+ (cur->when * (prevprev->value - prev->value)));
+
+ /* the number 10.0 is an arbitrary value that needs to
+ * be controlled by some user-controllable
+ * configuration utility.
+ */
+
+ if (area < 10.0) {
+ iterator tmp = pprev;
+
+ /* pprev will change to current
+ i is incremented to the next event
+ */
+
+ pprev = i;
+ _events.erase (tmp);
+
+ continue;
+ }
+ }
+
+ prevprev = prev;
+ prev = cur;
+ pprev = i;
}
}
diff --git a/libs/evoral/src/Curve.cpp b/libs/evoral/src/Curve.cpp
index 61487098c2..dd327d488a 100644
--- a/libs/evoral/src/Curve.cpp
+++ b/libs/evoral/src/Curve.cpp
@@ -124,7 +124,6 @@ Curve::solve ()
} else {
fpi = 2 / (slope_before + slope_after);
}
-
}
/* compute second derivative for either side of control point `i' */
@@ -297,7 +296,6 @@ Curve::_get_vector (double x0, double x1, float *vec, int32_t veclen)
for (i = 1; i < veclen; ++i) {
vec[i] = vec[i-1] + yfrac;
}
-
return;
}