From: <sv...@op...> - 2024-06-13 19:56:26
|
Author: sagamusix Date: Thu Jun 13 21:56:07 2024 New Revision: 21026 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=21026 Log: [Fix] AMF: When running out of sample slots, file reading became be misaligned because the sample name was not skipped. Modified: trunk/OpenMPT/soundlib/Load_ams.cpp Modified: trunk/OpenMPT/soundlib/Load_ams.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp Thu Jun 13 21:43:32 2024 (r21025) +++ trunk/OpenMPT/soundlib/Load_ams.cpp Thu Jun 13 21:56:07 2024 (r21026) @@ -823,12 +823,12 @@ } uint8 numSamples = file.ReadUint8(); - uint8 sampleAssignment[120]; - MemsetZero(sampleAssignment); // Only really needed for v2.0, where the lowest and highest octave aren't cleared. + std::array<uint8, 120> sampleAssignment; + sampleAssignment.fill(0); // Only really needed for v2.0, where the lowest and highest octave aren't cleared. if(numSamples == 0 || (fileHeader.versionLow > 0 && !file.ReadArray(sampleAssignment)) // v2.01+: 120 Notes - || (fileHeader.versionLow == 0 && !file.ReadRaw(mpt::span(sampleAssignment + 12, 96)).size())) // v2.0: 96 Notes + || (fileHeader.versionLow == 0 && !file.ReadRaw(mpt::as_span(sampleAssignment).subspan(12, 96)).size())) // v2.0: 96 Notes { continue; } @@ -875,18 +875,17 @@ // Sample headers - we will have to read them even for shadow samples, and we will have to load them several times, // as it is possible that shadow samples use different sample settings like base frequency or panning. const SAMPLEINDEX firstSmp = GetNumSamples() + 1; + std::string sampleName; for(SAMPLEINDEX smp = 0; smp < numSamples; smp++) { - if(firstSmp + smp >= MAX_SAMPLES) - { - file.Skip(sizeof(AMS2SampleHeader)); - break; - } - file.ReadSizedString<uint8le, mpt::String::spacePadded>(m_szNames[firstSmp + smp]); - + file.ReadSizedString<uint8le, mpt::String::spacePadded>(sampleName); AMS2SampleHeader sampleHeader; file.ReadStruct(sampleHeader); + if(firstSmp + smp >= MAX_SAMPLES) + continue; + sampleHeader.ConvertToMPT(Samples[firstSmp + smp]); + m_szNames[firstSmp + smp] = sampleName; uint16 settings = (instrHeader.shadowInstr & instrIndexMask) | ((smp << sampleIndexShift) & sampleIndexMask) |