aboutsummaryrefslogtreecommitdiff
path: root/src/midi_sequencer_impl.hpp
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2022-11-29 15:46:40 +0300
committerWohlstand <admin@wohlnet.ru>2022-11-29 15:46:40 +0300
commit30df2f828f3e92ce26a0e9348f0e0b1a979f4fc0 (patch)
tree2fd85465ee7a241e7eb91cdf30696b9180c553e9 /src/midi_sequencer_impl.hpp
parent034cb1c66ed3956b63b69aa4cf2049b6ba295524 (diff)
downloadlibADLMIDI-30df2f828f3e92ce26a0e9348f0e0b1a979f4fc0.tar.gz
libADLMIDI-30df2f828f3e92ce26a0e9348f0e0b1a979f4fc0.tar.bz2
libADLMIDI-30df2f828f3e92ce26a0e9348f0e0b1a979f4fc0.zip
More robust EA-MUS detection/parsing
by https://github.com/dashodanger https://github.com/Wohlstand/BW_Midi_Sequencer/pull/7
Diffstat (limited to 'src/midi_sequencer_impl.hpp')
-rw-r--r--src/midi_sequencer_impl.hpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/midi_sequencer_impl.hpp b/src/midi_sequencer_impl.hpp
index d9ff580..a37988d 100644
--- a/src/midi_sequencer_impl.hpp
+++ b/src/midi_sequencer_impl.hpp
@@ -2250,9 +2250,9 @@ static bool detectRSXX(const char *head, FileAndMemReader &fr)
bool ret = false;
// Try to identify RSXX format
- if(head[0] == 0x7D)
+ if(head[0] >= 0x5D && fr.fileSize() > head[0])
{
- fr.seek(0x6D, FileAndMemReader::SET);
+ fr.seek(head[0] - 0x10, FileAndMemReader::SET);
fr.read(headerBuf, 1, 6);
if(std::memcmp(headerBuf, "rsxx}u", 6) == 0)
ret = true;
@@ -2496,14 +2496,20 @@ bool BW_MidiSequencer::parseRSXX(FileAndMemReader &fr)
}
// Try to identify RSXX format
- if(headerBuf[0] == 0x7D)
+ char start = headerBuf[0];
+ if(start < 0x5D)
{
- fr.seek(0x6D, FileAndMemReader::SET);
+ m_errorString = "RSXX song too short!\n";
+ return false;
+ }
+ else
+ {
+ fr.seek(start - 0x10, FileAndMemReader::SET);
fr.read(headerBuf, 1, 6);
if(std::memcmp(headerBuf, "rsxx}u", 6) == 0)
{
m_format = Format_RSXX;
- fr.seek(0x7D, FileAndMemReader::SET);
+ fr.seek(start, FileAndMemReader::SET);
trackCount = 1;
deltaTicks = 60;
}