Make sure all unhandled delayed MIDI events generate NOPs

- Looking over the code again, I see that discarded SysEx messages can
  cause the same issue as unhandled meta events, so generalize the
  returning of a NOP for everything.
This commit is contained in:
Randy Heit 2016-01-20 18:00:48 -06:00
parent 1a356dfa51
commit 7f6b421e87

View file

@ -384,6 +384,11 @@ DWORD *MIDISong2::SendCommand (DWORD *events, TrackInfo *track, DWORD delay, ptr
event = track->TrackBegin[track->TrackP++]; event = track->TrackBegin[track->TrackP++];
CHECK_FINISHED CHECK_FINISHED
// The actual event type will be filled in below.
events[0] = delay;
events[1] = 0;
events[2] = MEVT_NOP << 24;
if (event != MIDI_SYSEX && event != MIDI_META && event != MIDI_SYSEXEND) if (event != MIDI_SYSEX && event != MIDI_META && event != MIDI_SYSEXEND)
{ {
// Normal short message // Normal short message
@ -582,17 +587,10 @@ DWORD *MIDISong2::SendCommand (DWORD *events, TrackInfo *track, DWORD delay, ptr
break; break;
} }
} }
events[0] = delay;
events[1] = 0;
if (event != MIDI_META && (!track->Designated || (track->Designation & DesignationMask))) if (event != MIDI_META && (!track->Designated || (track->Designation & DesignationMask)))
{ {
events[2] = event | (data1<<8) | (data2<<16); events[2] = event | (data1<<8) | (data2<<16);
} }
else
{
events[2] = MEVT_NOP << 24;
}
events += 3;
} }
else else
{ {
@ -612,8 +610,6 @@ DWORD *MIDISong2::SendCommand (DWORD *events, TrackInfo *track, DWORD delay, ptr
} }
else else
{ {
events[0] = delay;
events[1] = 0;
BYTE *msg = (BYTE *)&events[3]; BYTE *msg = (BYTE *)&events[3];
if (event == MIDI_SYSEX) if (event == MIDI_SYSEX)
{ // Need to add the SysEx marker to the message. { // Need to add the SysEx marker to the message.
@ -631,7 +627,6 @@ DWORD *MIDISong2::SendCommand (DWORD *events, TrackInfo *track, DWORD delay, ptr
{ {
*msg++ = 0; *msg++ = 0;
} }
events = (DWORD *)msg;
track->TrackP += len; track->TrackP += len;
} }
} }
@ -659,17 +654,6 @@ DWORD *MIDISong2::SendCommand (DWORD *events, TrackInfo *track, DWORD delay, ptr
events[0] = delay; events[0] = delay;
events[1] = 0; events[1] = 0;
events[2] = (MEVT_TEMPO << 24) | Tempo; events[2] = (MEVT_TEMPO << 24) | Tempo;
events += 3;
break;
default:
if (delay != 0)
{
events[0] = delay;
events[1] = 0;
events[2] = MEVT_NOP << 24;
events += 3;
}
break; break;
} }
track->TrackP += len; track->TrackP += len;
@ -688,6 +672,18 @@ DWORD *MIDISong2::SendCommand (DWORD *events, TrackInfo *track, DWORD delay, ptr
{ {
track->Delay = track->ReadVarLen(); track->Delay = track->ReadVarLen();
} }
// Advance events pointer unless this is a non-delaying NOP.
if (events[0] != 0 || MEVT_EVENTTYPE(events[2]) != MEVT_NOP)
{
if (MEVT_EVENTTYPE(events[2]) == MEVT_LONGMSG)
{
events += 3 + ((MEVT_EVENTPARM(events[2]) + 3) >> 2);
}
else
{
events += 3;
}
}
return events; return events;
} }