summaryrefslogtreecommitdiff
path: root/libs/ardour/automation_event.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-04-21 16:07:29 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-04-21 16:07:29 +0000
commit1220b52434b273437f5cf99b5c6ddbdf3cdcac07 (patch)
treeb49ab5f05b5f32ea582686470f67110fbbdaa46a /libs/ardour/automation_event.cc
parent15cf746b80e01cf463f402340943e81b5c8db698 (diff)
correctly handle touch/write automation data merging when it occurs before the start or after the end of existing data
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6944 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/automation_event.cc')
-rw-r--r--libs/ardour/automation_event.cc72
1 files changed, 52 insertions, 20 deletions
diff --git a/libs/ardour/automation_event.cc b/libs/ardour/automation_event.cc
index cd381565f1..6013122357 100644
--- a/libs/ardour/automation_event.cc
+++ b/libs/ardour/automation_event.cc
@@ -317,45 +317,77 @@ AutomationList::merge_nascent ()
return;
}
- cerr << "Merging " << nascent_events.size() << " nascent events\n";
-
iterator i;
+ iterator range_begin = events.end();
+ iterator range_end = events.end();
bool inserted = false;
+
double lower = nascent_events.front()->when;
double upper = nascent_events.back()->when;
-
- double clamp_time = upper+1;
- double clamp_value = unlocked_eval (upper+1);
+ bool preexisting = !events.empty();
+ double clamp_time;
+ double clamp_value;
- cerr << "nascent range = " << lower << " .. " << upper << " will add clamp at "
- << clamp_time << " = " << clamp_value << endl;
-
- for (i = events.begin(); i != events.end(); ) {
+ if (preexisting) {
+ clamp_time = upper + 1; // XXX FIX ME
+ clamp_value = unlocked_eval (clamp_time);
+ }
+
+ for (i = events.begin(); i != events.end(); ++i) {
- /* remove all events within the range defined by nascent events,
+ /* find the range that overaps with nascent events,
and insert the contents of nascent events.
*/
if ((*i)->when >= lower) {
- if (!inserted) {
- events.insert (i, nascent_events.begin(), nascent_events.end());
- cerr << "did insert, events how has " << events.size() << endl;
- events.insert (i, point_factory (clamp_time, clamp_value));
- inserted = true;
+ if (range_begin == events.end()) {
+ range_begin = i;
}
- if ((*i)->when > upper) {
+ if ((*i)->when > clamp_time) {
+ range_end = i;
break;
}
+ }
+ }
+
+ if (range_begin == events.end()) {
+
+ if (range_end == events.end()) {
+
+ /* nascent events are all after any events in the existing list. insert
+ at the back of the list. no clamp point is required.
+ */
+
+ events.insert (events.end(), nascent_events.begin(), nascent_events.end());
- i = events.erase (i);
} else {
- cerr << "skip event at " << (*i)->when << endl;
- ++i;
+
+ /* nascent events are all before any events in the existing list. insert
+ at the front of the list, with the clamp value to pull us back to
+ any existing points.
+ */
+
+ events.insert (events.begin(), nascent_events.begin(), nascent_events.end());
+ if (preexisting) {
+ events.insert (events.begin(), point_factory (clamp_time, clamp_value));
+ }
}
+
+ } else {
+ /* nascent events begin somewhere within in the existing list. insert them,
+ along with the clamp point if necessary. then delete the existing events
+ that correspond to the range of nascent events.
+ */
+
+ events.insert (range_end, nascent_events.begin(), nascent_events.end());
+ if (preexisting) {
+ events.insert (range_end, point_factory (clamp_time, clamp_value));
+ }
+ events.erase (range_begin, range_end);
}
-
+
nascent_events.clear ();
}