Author: sagamusix
Date: Mon Apr 8 19:08:57 2024
New Revision: 20528
URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=20528
Log:
Merged revision(s) 20524 from trunk/OpenMPT:
[Mod] M15: Loosen file rejection heuristics a bit to allow loading of schmokk.mod and scramble_2.mod.
........
Modified:
branches/OpenMPT-1.28/ (props changed)
branches/OpenMPT-1.28/soundlib/Load_mod.cpp
Modified: branches/OpenMPT-1.28/soundlib/Load_mod.cpp
==============================================================================
--- branches/OpenMPT-1.28/soundlib/Load_mod.cpp Mon Apr 8 19:08:00 2024 (r20527)
+++ branches/OpenMPT-1.28/soundlib/Load_mod.cpp Mon Apr 8 19:08:57 2024 (r20528)
@@ -1322,9 +1322,9 @@
// However, there are quite a few SoundTracker modules in the wild with random
// characters. To still be able to distguish them from other formats, we just reject
// files with *too* many bogus characters. Arbitrary threshold: 48 bogus characters in total
- // or more than 5 invalid characters just in the title alone.
+ // or more than 11 invalid characters just in the title alone (just enough to make scramble_2.mod load).
uint32 invalidChars = CountInvalidChars(fileHeaders.songname);
- if(invalidChars > 5)
+ if(invalidChars > 11)
{
return false;
}
@@ -1338,10 +1338,13 @@
invalidChars += CountInvalidChars(sampleHeader.name);
+ // schmokk.mod has a non-zero value here but it should not be treated as finetune
+ if(sampleHeader.finetune != 0)
+ invalidChars += 16;
+
// Sanity checks - invalid character count adjusted for ata.mod (MD5 937b79b54026fa73a1a4d3597c26eace, SHA1 3322ca62258adb9e0ae8e9afe6e0c29d39add874)
if(invalidChars > 48
|| sampleHeader.volume > 64
- || sampleHeader.finetune != 0
|| sampleHeader.length > 32768)
{
return false;
@@ -1477,10 +1480,12 @@
file.Seek(20);
for(SAMPLEINDEX smp = 1; smp <= 15; smp++)
{
+ ModSample &mptSmp = Samples[smp];
MODSampleHeader sampleHeader;
ReadSample(file, sampleHeader, Samples[smp], m_szNames[smp], true);
+ mptSmp.nFineTune = 0;
- totalSampleLen += Samples[smp].nLength;
+ totalSampleLen += mptSmp.nLength;
if(m_szNames[smp][0] && ((memcmp(m_szNames[smp], "st-", 3) && memcmp(m_szNames[smp], "ST-", 3)) || m_szNames[smp][5] != ':'))
{
@@ -1491,9 +1496,9 @@
// Loop start is always in bytes, not words, so don't trust the auto-fix magic in the sample header conversion (fixes loop of "st-01:asia" in mod.drag 10)
if(sampleHeader.loopLength > 1)
{
- Samples[smp].nLoopStart = sampleHeader.loopStart;
- Samples[smp].nLoopEnd = sampleHeader.loopStart + sampleHeader.loopLength * 2;
- Samples[smp].SanitizeLoops();
+ mptSmp.nLoopStart = sampleHeader.loopStart;
+ mptSmp.nLoopEnd = sampleHeader.loopStart + sampleHeader.loopLength * 2;
+ mptSmp.SanitizeLoops();
}
// UST only handles samples up to 9999 bytes. Master Soundtracker 1.0 and SoundTracker 2.0 introduce 32KB samples.
|