Fix errors when parsing audio
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user