diff options
author | Wohlstand <admin@wohlnet.ru> | 2019-11-15 13:18:25 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2019-11-15 13:18:25 +0300 |
commit | d21b27084532dca78f07ff87f578330f7c6f9755 (patch) | |
tree | 7992084ea3573602653b0ebcda3b8f6f97b58f26 /src/midi_sequencer_impl.hpp | |
parent | e721728ef11dd97395853514c6ae44b05bd6e71c (diff) | |
download | libADLMIDI-d21b27084532dca78f07ff87f578330f7c6f9755.tar.gz libADLMIDI-d21b27084532dca78f07ff87f578330f7c6f9755.tar.bz2 libADLMIDI-d21b27084532dca78f07ff87f578330f7c6f9755.zip |
Sequencer: Allow playing IMF files of Type 0
Diffstat (limited to 'src/midi_sequencer_impl.hpp')
-rw-r--r-- | src/midi_sequencer_impl.hpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/midi_sequencer_impl.hpp b/src/midi_sequencer_impl.hpp index bfa8503..4dc3013 100644 --- a/src/midi_sequencer_impl.hpp +++ b/src/midi_sequencer_impl.hpp @@ -1999,14 +1999,14 @@ static bool detectIMF(const char *head, FileAndMemReader &fr) uint8_t raw[4]; size_t end = static_cast<size_t>(head[0]) + 256 * static_cast<size_t>(head[1]); - if(!end || (end & 3)) + if(end & 3) return false; size_t backup_pos = fr.tell(); int64_t sum1 = 0, sum2 = 0; - fr.seek(2, FileAndMemReader::SET); + fr.seek((end > 0 ? 2 : 0), FileAndMemReader::SET); - for(unsigned n = 0; n < 42; ++n) + for(size_t n = 0; n < 16383; ++n) { if(fr.read(raw, 1, 4) != 4) break; @@ -2165,7 +2165,11 @@ bool BW_MidiSequencer::parseIMF(FileAndMemReader &fr) event.absPosition = 0; event.data.resize(2); - fr.seek(2, FileAndMemReader::SET); + fr.seek((imfEnd > 0) ? 2 : 0, FileAndMemReader::SET); + + if(imfEnd == 0) // IMF Type 0 with unlimited file length + imfEnd = fr.fileSize(); + while(fr.tell() < imfEnd && !fr.eof()) { if(fr.read(imfRaw, 1, 4) != 4) |