[Scummvm-git-logs] scummvm master -> 34828e0c5bdd84ea539c5bd89e73db6c7a75a0c9

bluegr noreply at scummvm.org
Tue Jan 7 16:58:57 UTC 2025


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

Summary:
34828e0c5b SCUMM: More work on the XSB audio cues for MI2 SE


Commit: 34828e0c5bdd84ea539c5bd89e73db6c7a75a0c9
    https://github.com/scummvm/scummvm/commit/34828e0c5bdd84ea539c5bd89e73db6c7a75a0c9
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2025-01-07T18:58:12+02:00

Commit Message:
SCUMM: More work on the XSB audio cues for MI2 SE

Changed paths:
    engines/scumm/soundse.cpp
    engines/scumm/soundse.h


diff --git a/engines/scumm/soundse.cpp b/engines/scumm/soundse.cpp
index fdcec25f8eb..6481b6fd6a0 100644
--- a/engines/scumm/soundse.cpp
+++ b/engines/scumm/soundse.cpp
@@ -45,7 +45,6 @@ SoundSE::SoundSE(ScummEngine *parent, Audio::Mixer *mixer)
 void SoundSE::initSoundFiles() {
 	switch (_vm->_game.id) {
 	case GID_MONKEY:
-	case GID_MONKEY2:
 		initAudioMappingMI();
 		_musicFilename = "MusicOriginal.xwb";
 		//_musicFilename = "MusicNew.xwb";	// TODO: allow toggle between original and new music
@@ -58,6 +57,22 @@ void SoundSE::initSoundFiles() {
 		// TODO: ambience.xwb
 		// TODO: roomsfx.xwb
 		break;
+	case GID_MONKEY2:
+		initAudioMappingMI();
+		_musicFilename = "MusicOriginal.xwb";
+		//_musicFilename = "MusicNew.xwb";	// TODO: allow toggle between original and new music
+		indexXWBFile(_musicFilename, &_musicEntries);
+		indexXSBFile("musiccuesoriginal.xsb", &_musicEntries);
+		//_sfxFilename = "SFXOriginal.xwb";
+		//_sfxFilename = "SFXNew.xwb";	// TODO: allow toggle between original and new SFX
+		// indexXWBFile(_sfxFilename, &_sfxEntries);
+		_speechFilename = "Speech.xwb";
+		indexXWBFile(_speechFilename, &_speechEntries);
+		indexXSBFile("speechcues.xsb", &_speechEntries);
+		// TODO: ambience.xwb
+		// TODO: commentary.xwb
+		// TODO: patch.xwb
+		break;
 	case GID_TENTACLE:
 		initAudioMappingDOTTAndFT();
 		_musicFilename = "iMUSEClient_Music.fsb";
@@ -183,30 +198,18 @@ void SoundSE::indexXWBFile(const Common::String &filename, AudioIndex *audioInde
 		audioIndex->push_back(entry);
 	}
 
-	if (_vm->_game.id == GID_MONKEY2) {
-		f->close();
-		delete f;
-
-		// The audio file names of Monkey Island 2 SE are placed in a separate file
-		if (_speechFilename.equalsIgnoreCase("Speech.xwb"))
-			indexMI2SpeechFiles(entryCount);
-
-		return;
-	}
-
 	const uint32 nameOffset = segments[kXWBSegmentEntryNames].offset;
 
-	if (!nameOffset)
-		WARN_AND_RETURN_XWB("XWB file does not contain audio file names")
+	if (nameOffset) {
+		f->seek(nameOffset);
 
-	f->seek(nameOffset);
+		for (uint32 i = 0; i < entryCount; i++) {
+			Common::String name = f->readString(0, 64);
+			name.toLowercase();
 
-	for (uint32 i = 0; i < entryCount; i++) {
-		Common::String name = f->readString(0, 64);
-		name.toLowercase();
-
-		(*audioIndex)[i].name = name;
-		_nameToIndex[name] = i;
+			(*audioIndex)[i].name = name;
+			_nameToIndex[name] = i;
+		}
 	}
 
 	f->close();
@@ -215,13 +218,27 @@ void SoundSE::indexXWBFile(const Common::String &filename, AudioIndex *audioInde
 
 #undef WARN_AND_RETURN_XWB
 
-void SoundSE::indexMI2SpeechFiles(uint32 entryCount) {
+#define WARN_AND_RETURN_XSB(message)          \
+	{                                         \
+		warning("indexMI2SpeechFiles: %s", message); \
+		f->close();                           \
+		delete f;                             \
+		return;                               \
+	}
+
+void SoundSE::indexXSBFile(const Common::String &filename, AudioIndex *audioIndex) {
 	Common::List<uint16> speechIndices;
 
 	Common::File *f = new Common::File();
-	f->open(Common::Path("speechcues.xsb"));
+	f->open(Common::Path(filename));
 
-	f->skip(42);
+	const uint32 magic = f->readUint32BE();
+	if (magic != MKTAG('S', 'D', 'B', 'K'))
+		WARN_AND_RETURN_XSB("Invalid XSB file")
+
+	f->skip(15);
+	const uint32 entryCount = f->readUint32LE();
+	f->skip(19);
 	const uint32 nameOffset = f->readUint32LE();
 	f->skip(24);
 	const uint32 entriesOffset = f->readUint32LE();
@@ -241,14 +258,18 @@ void SoundSE::indexMI2SpeechFiles(uint32 entryCount) {
 		Common::String name = f->readString(0);
 		name.toLowercase();
 
-		_speechEntries[index].name = name;
-		_nameToIndex[name] = index;
+		if (index >= 0 && index < (*audioIndex).size()) {
+			(*audioIndex)[index].name = name;
+			_nameToIndex[name] = index;
+		}
 	}
 
 	f->close();
 	delete f;
 }
 
+#undef WARN_AND_RETURN_XSB
+
 #define WARN_AND_RETURN_FSB(message)          \
 	{                                         \
 		warning("indexFSBFile: %s", message); \
diff --git a/engines/scumm/soundse.h b/engines/scumm/soundse.h
index 4f798c2ed9f..e78e975ce6b 100644
--- a/engines/scumm/soundse.h
+++ b/engines/scumm/soundse.h
@@ -154,7 +154,7 @@ private:
 
 	// Index XWB audio files - used in MI1SE and MI2SE
 	void indexXWBFile(const Common::String &filename, AudioIndex *audioIndex);
-	void indexMI2SpeechFiles(uint32 entryCount);
+	void indexXSBFile(const Common::String &filename, AudioIndex *audioIndex);
 
 	// Index FSB audio files - used in DOTT and FT
 	void indexFSBFile(const Common::String &filename, AudioIndex *audioIndex);




More information about the Scummvm-git-logs mailing list