From: <sv...@op...> - 2024-04-17 18:48:43
|
Author: sagamusix Date: Wed Apr 17 20:48:34 2024 New Revision: 20617 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=20617 Log: [Mod] ICE: Don't reset CSoundFile before we have even verified the magic bytes. Don't load patterns if we weren't asked to. Modified: trunk/OpenMPT/soundlib/Load_mod.cpp Modified: trunk/OpenMPT/soundlib/Load_mod.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp Wed Apr 17 20:26:48 2024 (r20616) +++ trunk/OpenMPT/soundlib/Load_mod.cpp Wed Apr 17 20:48:34 2024 (r20617) @@ -1977,44 +1977,35 @@ CSoundFile::ProbeResult CSoundFile::ProbeFileHeaderICE(MemoryFileReader file, const uint64 *pfilesize) { if(!file.CanRead(1464 + 4)) - { return ProbeWantMoreData; - } + file.Seek(1464); char magic[4]; file.ReadArray(magic); if(!IsMagic(magic, "MTN\0") && !IsMagic(magic, "IT10")) - { return ProbeFailure; - } + file.Seek(20); uint32 invalidBytes = 0; for(SAMPLEINDEX smp = 1; smp <= 31; smp++) { MODSampleHeader sampleHeader; - if(!file.ReadStruct(sampleHeader)) - { - return ProbeWantMoreData; - } + file.ReadStruct(sampleHeader); invalidBytes += sampleHeader.GetInvalidByteScore(); - } - if(invalidBytes > MODSampleHeader::INVALID_BYTE_THRESHOLD) - { - return ProbeFailure; + if(invalidBytes > MODSampleHeader::INVALID_BYTE_THRESHOLD) + return ProbeFailure; } const auto [numOrders, numTracks] = file.ReadArray<uint8, 2>(); if(numOrders > 128) { return ProbeFailure; } - uint8 tracks[128 * 4]; + std::array<uint8, 128 * 4> tracks; file.ReadArray(tracks); for(auto track : tracks) { if(track > numTracks) - { return ProbeFailure; - } } MPT_UNREFERENCED_PARAMETER(pfilesize); return ProbeSuccess; @@ -2032,19 +2023,16 @@ return false; } - InitializeGlobals(MOD_TYPE_MOD); - m_playBehaviour.reset(kMODOneShotLoops); - m_playBehaviour.set(kMODIgnorePanning); - m_playBehaviour.set(kMODSampleSwap); // untested - if(IsMagic(magic, "MTN\0")) { + InitializeGlobals(MOD_TYPE_MOD); m_modFormat.formatName = U_("MnemoTroN SoundTracker"); m_modFormat.type = U_("st26"); m_modFormat.madeWithTracker = U_("SoundTracker 2.6"); m_modFormat.charset = mpt::Charset::Amiga_no_C1; } else if(IsMagic(magic, "IT10")) { + InitializeGlobals(MOD_TYPE_MOD); m_modFormat.formatName = U_("Ice Tracker"); m_modFormat.type = U_("ice"); m_modFormat.madeWithTracker = U_("Ice Tracker 1.0 / 1.1"); @@ -2066,55 +2054,48 @@ MODSampleHeader sampleHeader; file.ReadStruct(sampleHeader); invalidBytes += ReadSample(sampleHeader, Samples[smp], m_szNames[smp], true); - } - if(invalidBytes > MODSampleHeader::INVALID_BYTE_THRESHOLD) - { - return false; + if(invalidBytes > MODSampleHeader::INVALID_BYTE_THRESHOLD) + return false; } const auto [numOrders, numTracks] = file.ReadArray<uint8, 2>(); if(numOrders > 128) - { return false; - } - uint8 tracks[128 * 4]; + std::array<uint8, 128 * 4> tracks; file.ReadArray(tracks); for(auto track : tracks) { if(track > numTracks) - { return false; - } } if(loadFlags == onlyVerifyHeader) - { return true; - } // Now we can be pretty sure that this is a valid MOD file. Set up default song settings. m_nChannels = 4; - m_nInstruments = 0; + SetupMODPanning(true); Order().SetDefaultSpeed(6); Order().SetDefaultTempoInt(125); m_nMinPeriod = 14 * 4; m_nMaxPeriod = 3424 * 4; m_nSamplePreAmp = 64; m_SongFlags.set(SONG_PT_MODE | SONG_IMPORTED); - - // Setup channel pan positions and volume - SetupMODPanning(); + m_playBehaviour.reset(kMODOneShotLoops); + m_playBehaviour.set(kMODIgnorePanning); + m_playBehaviour.set(kMODSampleSwap); // untested // Reading patterns Order().resize(numOrders); uint8 speed[2] = {0, 0}, speedPos = 0; - Patterns.ResizeArray(numOrders); + if(loadFlags & loadPatternData) + Patterns.ResizeArray(numOrders); for(PATTERNINDEX pat = 0; pat < numOrders; pat++) { Order()[pat] = pat; - if(!Patterns.Insert(pat, 64)) - continue; + if(!(loadFlags & loadPatternData) || !Patterns.Insert(pat, 64)) + break; for(CHANNELINDEX chn = 0; chn < 4; chn++) { |