diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2010-05-27 12:41:41 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2010-05-27 12:41:41 +0000 |
commit | 8b68707bc447597fd63c5dd3a4dd0c05e8bd8d4e (patch) | |
tree | 51a67bb1dde2ef9b139d40579106420a17ed5bfa | |
parent | b5569b0d9d3bf34b0dfc9fe857c716eb88792760 (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.cc | 57 | ||||
-rw-r--r-- | libs/ardour/session_transport.cc | 8 |
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 */ |