Fix errors when parsing audio

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-15 12:26:35 +01:00
parent b0f75d9f10
commit 431126f893
19 changed files with 385 additions and 62 deletions

View File

@@ -62,7 +62,7 @@ abstract class WLParser {
}) {
final isShareware = version == GameVersion.shareware;
final audio = parseAudio(audioHed, audioT);
final audio = parseAudio(audioHed, audioT, version);
return WolfensteinData(
version: version,
@@ -295,9 +295,9 @@ abstract class WLParser {
static ({List<AdLibSound> adLib, List<ImfMusic> music}) parseAudio(
ByteData audioHed,
ByteData audioT,
GameVersion version,
) {
List<int> offsets = [];
// AUDIOHED is a series of 32-bit unsigned integers
for (int i = 0; i < audioHed.lengthInBytes ~/ 4; i++) {
offsets.add(audioHed.getUint32(i * 4, Endian.little));
}
@@ -308,7 +308,6 @@ abstract class WLParser {
int start = offsets[i];
int next = offsets[i + 1];
// 0xFFFFFFFF (or 4294967295) marks an empty slot
if (start == 0xFFFFFFFF || start >= audioT.lengthInBytes) {
allAudioChunks.add(Uint8List(0));
continue;
@@ -324,16 +323,18 @@ abstract class WLParser {
}
}
// Wolfenstein 3D split:
// Chunks 0-299: AdLib Sounds
// Chunks 300+: IMF Music
// --- THE FIX: Accurate Historical Chunk Indices ---
// WL1 (Shareware) has exactly 234 sound effects before the music.
// WL6 (Retail) has exactly 261 sound effects before the music.
int musicStartIndex = (version == GameVersion.shareware) ? 234 : 261;
List<AdLibSound> adLib = allAudioChunks
.take(300)
.take(musicStartIndex)
.map((bytes) => AdLibSound(bytes))
.toList();
List<ImfMusic> music = allAudioChunks
.skip(300)
.skip(musicStartIndex)
.where((chunk) => chunk.isNotEmpty)
.map((bytes) => ImfMusic.fromBytes(bytes))
.toList();