diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc index 122780894b..a3a7126e99 100644 --- a/libs/ardour/session_events.cc +++ b/libs/ardour/session_events.cc @@ -250,15 +250,18 @@ SessionEventManager::_replace_event (SessionEvent* ev) bool ret = false; Events::iterator i; - /* private, used only for events that can only exist once in the queue */ + /* use only for events that can only exist once in the respective queue */ + Events& e (ev->action_sample == SessionEvent::Immediate ? immediate_events : events); - for (i = events.begin(); i != events.end(); ++i) { - if ((*i)->type == ev->type && ev->type == SessionEvent::Overwrite && (*i)->track.lock() == ev->track.lock()) { + for (i = e.begin(); i != e.end(); ++i) { + if ((*i)->type == ev->type && ev->type == SessionEvent::Overwrite && (*i)->track.lock() == ev->track.lock() && (*i)->overwrite == ev->overwrite) { + assert (ev->action_sample == SessionEvent::Immediate); ret = true; delete ev; break; } else if ((*i)->type == ev->type && ev->type != SessionEvent::Overwrite) { + assert (ev->action_sample != SessionEvent::Immediate); assert (ev->type == SessionEvent::PunchIn || ev->type == SessionEvent::PunchOut || ev->type == SessionEvent::AutoLoop); (*i)->action_sample = ev->action_sample; (*i)->target_sample = ev->target_sample; @@ -270,12 +273,17 @@ SessionEventManager::_replace_event (SessionEvent* ev) } } - if (i == events.end()) { - events.insert (events.begin(), ev); + if (i == e.end()) { + e.insert (e.begin(), ev); } - events.sort (SessionEvent::compare); - next_event = events.end(); + if (ev->action_sample == SessionEvent::Immediate) { + /* no need to sort immediate events */ + return ret; + } + + e.sort (SessionEvent::compare); + next_event = e.end(); set_next_event (); return ret;