summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-05-27 12:41:41 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-05-27 12:41:41 +0000
commit8b68707bc447597fd63c5dd3a4dd0c05e8bd8d4e (patch)
tree51a67bb1dde2ef9b139d40579106420a17ed5bfa
parentb5569b0d9d3bf34b0dfc9fe857c716eb88792760 (diff)
fix handling of automation recording when stopping and restarting from the exact same location ("no spikes")
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@7180 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--libs/ardour/automation_event.cc57
-rw-r--r--libs/ardour/session_transport.cc8
2 files changed, 47 insertions, 18 deletions
diff --git a/libs/ardour/automation_event.cc b/libs/ardour/automation_event.cc
index f1cdd52c87..dd2930a1a6 100644
--- a/libs/ardour/automation_event.cc
+++ b/libs/ardour/automation_event.cc
@@ -346,12 +346,12 @@ AutomationList::merge_nascent (double when)
return;
}
- cerr << "We have " << nascent.size() << " NI's to merge\n";
-
for (list<NascentInfo*>::iterator n = nascent.begin(); n != nascent.end(); ++n) {
NascentInfo* ninfo = *n;
AutomationEventList& nascent_events (ninfo->events);
+ bool need_adjacent_start_clamp;
+ bool need_adjacent_end_clamp;
if (nascent_events.empty()) {
delete ninfo;
@@ -361,7 +361,7 @@ AutomationList::merge_nascent (double when)
if (ninfo->start_time < 0.0) {
ninfo->start_time = nascent_events.front()->when;
}
-
+
if (ninfo->end_time < 0.0) {
ninfo->end_time = when;
}
@@ -370,23 +370,18 @@ AutomationList::merge_nascent (double when)
if (!preexisting) {
- cerr << "no prexisting - merge\n";
events = nascent_events;
} else if (ninfo->end_time < events.front()->when) {
/* all points in nascent are before the first existing point */
- cerr << "all before first, prepend\n";
-
events.insert (events.begin(), nascent_events.begin(), nascent_events.end());
} else if (ninfo->start_time > events.back()->when) {
/* all points in nascent are after the last existing point */
- cerr << "all after last, append\n";
-
events.insert (events.end(), nascent_events.begin(), nascent_events.end());
} else {
@@ -398,10 +393,37 @@ AutomationList::merge_nascent (double when)
iterator i;
iterator range_begin = events.end();
iterator range_end = events.end();
+ double end_value = unlocked_eval (ninfo->end_time);
+ double start_value = unlocked_eval (ninfo->start_time - 1);
+
+ need_adjacent_end_clamp = true;
+ need_adjacent_start_clamp = true;
for (i = events.begin(); i != events.end(); ++i) {
-
- if ((*i)->when >= ninfo->start_time) {
+
+ if ((*i)->when == ninfo->start_time) {
+ /* existing point at same time, remove it
+ and the consider the next point instead.
+ */
+ i = events.erase (i);
+
+ if (i == events.end()) {
+ break;
+ }
+
+ if (range_begin == events.end()) {
+ range_begin = i;
+ need_adjacent_start_clamp = false;
+ } else {
+ need_adjacent_end_clamp = false;
+ }
+
+ if ((*i)->when > ninfo->end_time) {
+ range_end = i;
+ break;
+ }
+
+ } else if ((*i)->when > ninfo->start_time) {
if (range_begin == events.end()) {
range_begin = i;
@@ -415,22 +437,21 @@ AutomationList::merge_nascent (double when)
}
assert (range_begin != events.end());
-
- double end_value = unlocked_eval (ninfo->end_time);
if (range_begin != events.begin()) {
/* clamp point before */
- cerr << "Add pre-clamp\n";
- events.insert (range_begin, point_factory (ninfo->start_time, unlocked_eval (ninfo->start_time)));
+ if (need_adjacent_start_clamp) {
+ events.insert (range_begin, point_factory (ninfo->start_time, start_value));
+ }
}
- cerr << "merge into event list\n";
events.insert (range_begin, nascent_events.begin(), nascent_events.end());
-
+
if (range_end != events.end()) {
/* clamp point after */
- cerr << "Add post-clamp\n";
- events.insert (range_begin, point_factory (ninfo->end_time, end_value));
+ if (need_adjacent_end_clamp) {
+ events.insert (range_begin, point_factory (ninfo->end_time, end_value));
+ }
}
events.erase (range_begin, range_end);
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index 3845e8cb81..f26be79a98 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -1044,6 +1044,14 @@ Session::start_transport ()
(*i)->realtime_set_speed ((*i)->speed(), true);
}
+ boost::shared_ptr<RouteList> r = routes.reader ();
+
+ /* force an automation snapshot as we start up */
+
+ for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+ (*i)->automation_snapshot (transport_frame(), true);
+ }
+
send_mmc_in_another_thread (MIDI::MachineControl::cmdDeferredPlay, 0);
TransportStateChange (); /* EMIT SIGNAL */