mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-18 12:46:32 +01:00
Implement replacing events in the immediate queue
This corrects issues introduced in a75c239c0c,
and fixes MIDI playback.
This commit is contained in:
parent
3f50b6d639
commit
bbb244c1c9
1 changed files with 15 additions and 7 deletions
|
|
@ -250,15 +250,18 @@ SessionEventManager::_replace_event (SessionEvent* ev)
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
Events::iterator i;
|
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) {
|
for (i = e.begin(); i != e.end(); ++i) {
|
||||||
if ((*i)->type == ev->type && ev->type == SessionEvent::Overwrite && (*i)->track.lock() == ev->track.lock()) {
|
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;
|
ret = true;
|
||||||
delete ev;
|
delete ev;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if ((*i)->type == ev->type && ev->type != SessionEvent::Overwrite) {
|
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);
|
assert (ev->type == SessionEvent::PunchIn || ev->type == SessionEvent::PunchOut || ev->type == SessionEvent::AutoLoop);
|
||||||
(*i)->action_sample = ev->action_sample;
|
(*i)->action_sample = ev->action_sample;
|
||||||
(*i)->target_sample = ev->target_sample;
|
(*i)->target_sample = ev->target_sample;
|
||||||
|
|
@ -270,12 +273,17 @@ SessionEventManager::_replace_event (SessionEvent* ev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == events.end()) {
|
if (i == e.end()) {
|
||||||
events.insert (events.begin(), ev);
|
e.insert (e.begin(), ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
events.sort (SessionEvent::compare);
|
if (ev->action_sample == SessionEvent::Immediate) {
|
||||||
next_event = events.end();
|
/* no need to sort immediate events */
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
e.sort (SessionEvent::compare);
|
||||||
|
next_event = e.end();
|
||||||
set_next_event ();
|
set_next_event ();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue