[Scummvm-git-logs] scummvm master -> ef5f8ff51dd1ff7245c012dcbf250c4ee0dcce25

bluegr noreply at scummvm.org
Mon Mar 2 16:03:02 UTC 2026


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
ef5f8ff51d AGOS: Simon1 Acorn - Fix playback of mods for the full version of Simon 1 Acorn Floppy.


Commit: ef5f8ff51dd1ff7245c012dcbf250c4ee0dcce25
    https://github.com/scummvm/scummvm/commit/ef5f8ff51dd1ff7245c012dcbf250c4ee0dcce25
Author: Robert Megone (robert.megone at gmail.com)
Date: 2026-03-02T18:02:58+02:00

Commit Message:
AGOS: Simon1 Acorn - Fix playback of mods for the full version of Simon 1 Acorn Floppy.

Changed paths:
    audio/mods/desktoptracker.cpp


diff --git a/audio/mods/desktoptracker.cpp b/audio/mods/desktoptracker.cpp
index 0a8b045d745..61513609f5c 100644
--- a/audio/mods/desktoptracker.cpp
+++ b/audio/mods/desktoptracker.cpp
@@ -36,6 +36,10 @@ static uint32 alignToWord(uint32 x) {
 	return (x + 1) & ~1U;
 }
 
+static uint32 alignToDword(uint32 x) {
+	return (x + 3) & ~3U;
+}
+
 static uint32 readLE32FromBuf(const byte *p) {
 	return (uint32)p[0] | ((uint32)p[1] << 8) | ((uint32)p[2] << 16) | ((uint32)p[3] << 24);
 }
@@ -292,7 +296,39 @@ private:
 		for (uint32 i = 0; i < (uint32)_hdr.tuneLength; ++i)
 			_sequence[i] = base[positionsOff + i];
 
-		const uint32 patternOffsetsOff = positionsOff + alignToWord(positionsSize);
+		const uint32 patternOffsetsOffWord = positionsOff + alignToWord(positionsSize);
+		const uint32 patternOffsetsOffDword = positionsOff + alignToDword(positionsSize);
+
+		auto scorePatternOffsets = [&](uint32 candOff) -> uint32 {
+			const uint32 need = (uint32)_hdr.numPatterns * 4U + (uint32)_hdr.numPatterns;
+			if (candOff + need > size)
+				return 0;
+
+			uint32 validOffs = 0;
+			for (uint32 i = 0; i < (uint32)_hdr.numPatterns; ++i) {
+				const uint32 po = readLE32FromBuf(base + candOff + (i * 4));
+				if (po != 0 && po < fileSize)
+					validOffs++;
+			}
+
+			uint32 validLens = 0;
+			const uint32 lensOff = candOff + (uint32)_hdr.numPatterns * 4U;
+			for (uint32 i = 0; i < (uint32)_hdr.numPatterns; ++i) {
+				const uint8 rows = base[lensOff + i];
+				if (rows != 0 && rows <= 128)
+					validLens++;
+			}
+
+			if (validOffs == 0)
+				return 0;
+
+			return (validOffs * 2U) + validLens;
+		};
+
+		const uint32 scoreWord = scorePatternOffsets(patternOffsetsOffWord);
+		const uint32 scoreDword = scorePatternOffsets(patternOffsetsOffDword);
+
+		const uint32 patternOffsetsOff = (scoreDword > scoreWord) ? patternOffsetsOffDword : patternOffsetsOffWord;
 		const uint32 patternOffsetsSize = (uint32)_hdr.numPatterns * 4U;
 		if (patternOffsetsOff + patternOffsetsSize > size)
 			error("DesktopTrackerStream: patternOffsets out of range");
@@ -310,7 +346,7 @@ private:
 		for (uint32 i = 0; i < (uint32)_hdr.numPatterns; ++i)
 			_patternLengths[i] = base[patternLengthsOff + i];
 
-		const uint32 samplesOff = patternLengthsOff + alignToWord(patternLengthsSize);
+		const uint32 samplesOff = patternLengthsOff + alignToDword(patternLengthsSize);
 		const uint32 sampleStructSize = 64;
 		const uint32 samplesSize = (uint32)_hdr.numSamples * sampleStructSize;
 		if (samplesOff + samplesSize > size)




More information about the Scummvm-git-logs mailing list