Fix MIDI delay-line (amend 25098ed
)
Events in the delay-buffer must be shifted back every cycle. Also in case of fixed-delay-lines events may not be in sequence since events are only sorted at backend port-level.
This commit is contained in:
parent
576f10b6f1
commit
ae0aa50b6f
@ -231,20 +231,18 @@ DelayLine::run (BufferSet& bufs, samplepos_t /* start_sample */, samplepos_t /*
|
|||||||
dly->silence (n_samples);
|
dly->silence (n_samples);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (delay_diff != 0) {
|
/* If the delay time changes, iterate over all events in the dly-buffer
|
||||||
/* If the delay time changes, iterate over all events in the dly-buffer
|
* and adjust the time in-place. <= 0 becomes 0.
|
||||||
* and adjust the time in-place. <= 0 becomes 0.
|
*
|
||||||
*
|
* iterate over all events in dly-buffer and subtract one cycle
|
||||||
* iterate over all events in dly-buffer and subtract one cycle
|
* (n_samples) from the timestamp, bringing them closer to de-queue.
|
||||||
* (n_samples) from the timestamp, bringing them closer to de-queue.
|
*/
|
||||||
*/
|
for (MidiBuffer::iterator m = dly->begin (); m != dly->end (); ++m) {
|
||||||
for (MidiBuffer::iterator m = dly->begin (); m != dly->end (); ++m) {
|
MidiBuffer::TimeType *t = m.timeptr ();
|
||||||
MidiBuffer::TimeType *t = m.timeptr ();
|
if (*t > n_samples + delay_diff) {
|
||||||
if (*t > n_samples + delay_diff) {
|
*t -= n_samples + delay_diff;
|
||||||
*t -= n_samples + delay_diff;
|
} else {
|
||||||
} else {
|
*t = 0;
|
||||||
*t = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +148,7 @@ FixedDelay::delay (
|
|||||||
if (ev.time () < n_samples) {
|
if (ev.time () < n_samples) {
|
||||||
mout->push_back (ev);
|
mout->push_back (ev);
|
||||||
} else {
|
} else {
|
||||||
mdly->push_back (ev);
|
mdly->insert_event (ev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,9 +158,16 @@ FixedDelay::delay (
|
|||||||
if (ev.time () >= n_samples) {
|
if (ev.time () >= n_samples) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mout->push_back (ev);
|
mout->insert_event (ev);
|
||||||
m = mdly->erase (m);
|
m = mdly->erase (m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* prepare for next cycle */
|
||||||
|
for (MidiBuffer::iterator m = mdly->begin (); m != mdly->end (); ++m) {
|
||||||
|
MidiBuffer::TimeType *t = m.timeptr ();
|
||||||
|
assert (*t >= n_samples);
|
||||||
|
*t -= n_samples;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user