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)
|