From: <sv...@op...> - 2024-05-08 19:16:21
|
Author: sagamusix Date: Wed May 8 21:16:09 2024 New Revision: 20741 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=20741 Log: [Mod] STK: Don't reader sample headers from disk and order list twice in a row. STKFileHeaders already contains them. Modified: trunk/OpenMPT/soundlib/Load_stk.cpp Modified: trunk/OpenMPT/soundlib/Load_stk.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_stk.cpp Wed May 8 20:47:53 2024 (r20740) +++ trunk/OpenMPT/soundlib/Load_stk.cpp Wed May 8 21:16:09 2024 (r20741) @@ -83,35 +83,25 @@ // scramble_2.mod has a lot of garbage in the song title, but it has lots of properly-formatted sample names, so we consider those to be more important than the garbage bytes. if(invalidCharsInTitle > 5 && (validNameCount < 4 || invalidNames)) - { return false; - } // Reject any files with no (or only silent) samples at all, as this might just be a random binary file (e.g. ID3 tags with tons of padding) if(totalSampleLen == 0 || allVolumes == 0) - { return false; - } // Sanity check: No more than 128 positions. ST's GUI limits tempo to [1, 220]. // There are some mods with a tempo of 0 (explora3-death.mod) though, so ignore the lower limit. if(fileHeaders.fileHeader.numOrders > 128 || fileHeaders.fileHeader.restartPos > 220) - { return false; - } uint8 maxPattern = *std::max_element(std::begin(fileHeaders.fileHeader.orderList), std::end(fileHeaders.fileHeader.orderList)); // Sanity check: 64 patterns max. if(maxPattern > 63) - { return false; - } // No playable song, and lots of null values => most likely a sparse binary file but not a module if(fileHeaders.fileHeader.restartPos == 0 && fileHeaders.fileHeader.numOrders == 0 && maxPattern == 0) - { return false; - } return true; } @@ -129,21 +119,13 @@ { STKFileHeaders fileHeaders; if(!file.ReadStruct(fileHeaders)) - { return ProbeWantMoreData; - } if(!ValidateHeader(fileHeaders)) - { return ProbeFailure; - } if(!file.CanRead(sizeof(MODPatternData))) - { return ProbeWantMoreData; - } if(!ValidateFirstSTKPattern(file)) - { return ProbeFailure; - } MPT_UNREFERENCED_PARAMETER(pfilesize); return ProbeSuccess; } @@ -155,20 +137,12 @@ STKFileHeaders fileHeaders; if(!file.ReadStruct(fileHeaders)) - { return false; - } if(!ValidateHeader(fileHeaders)) - { return false; - } if(!ValidateFirstSTKPattern(file)) - { return false; - } - - char songname[20]; - std::memcpy(songname, fileHeaders.songname, 20); + file.Seek(sizeof(STKFileHeaders)); InitializeGlobals(MOD_TYPE_MOD); m_playBehaviour.reset(kMODOneShotLoops); @@ -182,12 +156,10 @@ SmpLength totalSampleLen = 0; m_nSamples = 15; - file.Seek(20); for(SAMPLEINDEX smp = 1; smp <= 15; smp++) { ModSample &mptSmp = Samples[smp]; - MODSampleHeader sampleHeader; - file.ReadStruct(sampleHeader); + const MODSampleHeader &sampleHeader = fileHeaders.sampleHeaders[smp - 1]; ReadMODSample(sampleHeader, Samples[smp], m_szNames[smp], true); mptSmp.nFineTune = 0; @@ -212,9 +184,7 @@ minVersion = std::max(minVersion, MST1_00); } - MODFileHeader fileHeader; - file.ReadStruct(fileHeader); - + MODFileHeader &fileHeader = fileHeaders.fileHeader; ReadOrderFromArray(Order(), fileHeader.orderList); PATTERNINDEX numPatterns = GetNumPatterns(file, Order(), fileHeader.numOrders, totalSampleLen, m_nChannels, 0, true); @@ -237,7 +207,7 @@ if(!fileHeader.restartPos) fileHeader.restartPos = 0x78; // jjk55 by Jesper Kyd has a weird tempo set, but it needs to be ignored. - if(!memcmp(songname, "jjk55", 6)) + if(!memcmp(fileHeaders.songname, "jjk55", 6)) fileHeader.restartPos = 0x78; // Sample 7 in echoing.mod won't "loop" correctly if we don't convert the VBlank tempo. Order().SetDefaultTempoInt(125); @@ -259,7 +229,7 @@ m_nMaxPeriod = 856 * 4; m_nSamplePreAmp = 64; m_SongFlags.set(SONG_PT_MODE); - m_songName = mpt::String::ReadBuf(mpt::String::spacePadded, songname); + m_songName = mpt::String::ReadBuf(mpt::String::spacePadded, fileHeaders.songname); // Setup channel pan positions and volume SetupMODPanning(); |