summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Howard2014-05-12 00:12:07 -0400
committerSimon Howard2014-05-12 00:12:07 -0400
commitd25739f069102b5394e2806fbe00dbfa8f65a1f9 (patch)
tree0a7329f59433d6e36ca3ff9887c3e4dfb422e4b6
parent1591773d45c41acb9e5ce1cf20bf2b1553af1fac (diff)
downloadchocolate-doom-d25739f069102b5394e2806fbe00dbfa8f65a1f9.tar.gz
chocolate-doom-d25739f069102b5394e2806fbe00dbfa8f65a1f9.tar.bz2
chocolate-doom-d25739f069102b5394e2806fbe00dbfa8f65a1f9.zip
opl: Handle negative time division values.
A negative time division file indicates the MIDI file uses SMPTE time rather than the normal time system. This is not supported yet, but for the time being, return a sensible time division value that doesn't cause the sound to stutter and the game to become unplayable. This fixes #352, although the affected MIDIs do not yet play properly.
-rw-r--r--src/midifile.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/midifile.c b/src/midifile.c
index 6e40a274..94ec4441 100644
--- a/src/midifile.c
+++ b/src/midifile.c
@@ -699,7 +699,19 @@ int MIDI_GetNextEvent(midi_track_iter_t *iter, midi_event_t **event)
unsigned int MIDI_GetFileTimeDivision(midi_file_t *file)
{
- return SHORT(file->header.time_division);
+ short result = SHORT(file->header.time_division);
+
+ // Negative time division indicates SMPTE time and must be handled
+ // differently.
+ if (result < 0)
+ {
+ // TODO: Figure this out.
+ return 96;
+ }
+ else
+ {
+ return result;
+ }
}
void MIDI_RestartIterator(midi_track_iter_t *iter)