MIDI Input: Fix seeking code

This fixes a possible crash with seeking operations, especially with
Audio Unit plugins. Fix implemented in foo_midi and imported here.

Signed-off-by: Christopher Snowhill <kode54@gmail.com>
CQTexperiment
Christopher Snowhill 2022-02-05 05:01:31 -08:00
parent 0131f7c925
commit b85fef5c16
1 changed files with 22 additions and 2 deletions

View File

@ -347,13 +347,22 @@ void MIDIPlayer::Seek(unsigned long sample)
temp = (float *) malloc(needs_time * 2 * sizeof(float)); temp = (float *) malloc(needs_time * 2 * sizeof(float));
if (temp) if (temp)
{ {
render(temp, needs_time); // flush events
unsigned int render_junk = 0; unsigned int render_junk = 0;
bool timestamp_set = false;
unsigned last_timestamp = 0;
for (i = 0; i < stream_start; i++) for (i = 0; i < stream_start; i++)
{ {
if (me[i].m_event) if (me[i].m_event)
{ {
send_event_time_filtered(me[i].m_event, render_junk); send_event_time_filtered(me[i].m_event, render_junk);
if (timestamp_set) {
if (me[i].m_timestamp != last_timestamp) {
render_junk += 16; render_junk += 16;
}
}
last_timestamp = me[i].m_timestamp;
timestamp_set = true;
if (render_junk >= needs_time) if (render_junk >= needs_time)
{ {
render(temp, needs_time); render(temp, needs_time);
@ -361,7 +370,7 @@ void MIDIPlayer::Seek(unsigned long sample)
} }
} }
} }
uSamplesRemaining = render_junk; render(temp, needs_time);
free(temp); free(temp);
} }
} }
@ -370,13 +379,24 @@ void MIDIPlayer::Seek(unsigned long sample)
temp = (float *) malloc(16 * 2 * sizeof(float)); temp = (float *) malloc(16 * 2 * sizeof(float));
if (temp) if (temp)
{ {
render(temp, 16);
bool timestamp_set = false;
unsigned last_timestamp = 0;
for (i = 0; i < stream_start; i++) for (i = 0; i < stream_start; i++)
{ {
if (me[i].m_event) if (me[i].m_event)
{ {
if (timestamp_set) {
if (me[i].m_timestamp != last_timestamp) {
render(temp, 16);
}
}
last_timestamp = me[i].m_timestamp;
timestamp_set = true;
send_event_filtered(me[i].m_event); send_event_filtered(me[i].m_event);
} }
} }
render(temp, 16);
free(temp); free(temp);
} }
} }