[Scummvm-git-logs] scummvm master -> 439b8dcbd24ff4bcfd2cbefd77bdb3f79e14f06a

athrxx noreply at scummvm.org
Wed Jan 31 18:35:05 UTC 2024


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:
439b8dcbd2 SCUMM: (INDY3/MAC): save/load sound state


Commit: 439b8dcbd24ff4bcfd2cbefd77bdb3f79e14f06a
    https://github.com/scummvm/scummvm/commit/439b8dcbd24ff4bcfd2cbefd77bdb3f79e14f06a
Author: athrxx (athrxx at scummvm.org)
Date: 2024-01-31T19:34:43+01:00

Commit Message:
SCUMM: (INDY3/MAC): save/load sound state

Changed paths:
    engines/scumm/music.h
    engines/scumm/players/player_mac_indy3.cpp
    engines/scumm/players/player_mac_indy3.h
    engines/scumm/players/player_towns.h
    engines/scumm/saveload.cpp
    engines/scumm/scumm.cpp


diff --git a/engines/scumm/music.h b/engines/scumm/music.h
index 81dd5d9743e..71e5fd1311f 100644
--- a/engines/scumm/music.h
+++ b/engines/scumm/music.h
@@ -106,7 +106,14 @@ public:
 	/**
 	 * Save or load the music state.
 	 */
-	void saveLoadWithSerializer(Common::Serializer &ser) override {}
+	virtual void saveLoadWithSerializer(Common::Serializer &ser) {}
+
+	/**
+	 * Performs necessary post-load operations on the sound engine, like restarting of music
+	 * tracks or looping pcm sounds. Some targets get this done via scripts but others don't.
+	 * Currently, this is used for FM-Towns and Mac.
+	 */
+	virtual void restoreAfterLoad() {}
 };
 
 } // End of namespace Scumm
diff --git a/engines/scumm/players/player_mac_indy3.cpp b/engines/scumm/players/player_mac_indy3.cpp
index 65c2489380d..afed6ec072f 100644
--- a/engines/scumm/players/player_mac_indy3.cpp
+++ b/engines/scumm/players/player_mac_indy3.cpp
@@ -205,6 +205,8 @@ public:
 	int getMusicTimer();
 	int getSoundStatus(int id) const;
 	void setQuality(int qual);
+	void saveLoadWithSerializer(Common::Serializer &ser);
+	void restoreAfterLoad();
 
 	void generateData(int8 *dst, uint32 len, Audio::Mixer::SoundType type, bool expectStereo) const;
 	uint32 getDriverDeviceRate(uint8 drvID) const;
@@ -1003,6 +1005,20 @@ void I3MPlayer::setQuality(int qual) {
 	_macstr->initDrivers();
 }
 
+void I3MPlayer::saveLoadWithSerializer(Common::Serializer &ser) {
+	ser.syncBytes(_soundUsage, _idRangeMax, VER(113));
+}
+
+void I3MPlayer::restoreAfterLoad() {
+	stopActiveSound();
+	for (int i = 0; i < _idRangeMax; ++i) {
+		if (_soundUsage[i] && isSong(i)) {
+			--_soundUsage[i];
+			startSound(i);
+		}
+	}
+}
+
 void I3MPlayer::generateData(int8 *dst, uint32 len, Audio::Mixer::SoundType type, bool expectStereo) const {
 	for (Common::Array<I3MSoundDriver*>::const_iterator i = _drivers.begin(); i != _drivers.end(); ++i)
 		(*i)->feed(dst, len, type, expectStereo);
@@ -1140,7 +1156,8 @@ void I3MPlayer::stopSong() {
 	Common::StackLock lock(_mixer->mutex());
 	_mdrv->stop();
 	_songPlaying = false;
-	--_soundUsage[_lastSong];
+	if (_soundUsage[_lastSong])
+		--_soundUsage[_lastSong];
 	_lastSound = _lastSong = 0;
 }
 
@@ -1599,6 +1616,16 @@ void Player_Mac_Indy3::setQuality(int qual) {
 		_player->setQuality(qual);
 }
 
+void Player_Mac_Indy3::saveLoadWithSerializer(Common::Serializer &ser) {
+	if (_player != nullptr)
+		_player->saveLoadWithSerializer(ser);
+}
+
+void Player_Mac_Indy3::restoreAfterLoad() {
+	if (_player != nullptr)
+		_player->restoreAfterLoad();
+}
+
 #undef ASC_DEVICE_RATE
 #undef PCM_BUFFER_SIZE
 #undef RATECNV_BIT_PRECSN
diff --git a/engines/scumm/players/player_mac_indy3.h b/engines/scumm/players/player_mac_indy3.h
index a5e79a1d1be..a274ef90e25 100644
--- a/engines/scumm/players/player_mac_indy3.h
+++ b/engines/scumm/players/player_mac_indy3.h
@@ -51,6 +51,8 @@ public:
 	int getMusicTimer() override;
 	int getSoundStatus(int id) const override;
 	void setQuality(int qual) override;
+	void saveLoadWithSerializer(Common::Serializer &ser) override;
+	void restoreAfterLoad();
 
 private:
 	Common::SharedPtr<I3MPlayer> _player;
diff --git a/engines/scumm/players/player_towns.h b/engines/scumm/players/player_towns.h
index 93148f89b6f..12a2d125755 100644
--- a/engines/scumm/players/player_towns.h
+++ b/engines/scumm/players/player_towns.h
@@ -43,7 +43,7 @@ public:
 	virtual int32 doCommand(int numargs, int args[]) = 0;
 
 	void saveLoadWithSerializer(Common::Serializer &ser) override;
-	virtual void restoreAfterLoad();
+	virtual void restoreAfterLoad() override;
 
 	// version 1 specific
 	virtual int getCurrentCdaSound() { return 0; }
diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp
index 32592600c7a..8c3a870f5ec 100644
--- a/engines/scumm/saveload.cpp
+++ b/engines/scumm/saveload.cpp
@@ -69,7 +69,7 @@ struct SaveInfoSection {
 
 #define SaveInfoSectionSize (4+4+4 + 4+4 + 4+2)
 
-#define CURRENT_VER 112
+#define CURRENT_VER 113
 #define INFOSECTION_VERSION 2
 
 #pragma mark -
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index 69b5eb14b42..0277db3c2b1 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -3215,7 +3215,7 @@ void ScummEngine_v3::scummLoop_handleSaveLoad() {
 	if (_completeScreenRedraw) {
 		clearCharsetMask();
 		_charset->_hasMask = false;
-		bool restoreFMTownsSounds = (_townsPlayer != nullptr);
+		bool restoreSounds = true;
 
 		if (_game.id == GID_LOOM) {
 			if (_currentRoom == 70) {
@@ -3282,7 +3282,7 @@ void ScummEngine_v3::scummLoop_handleSaveLoad() {
 						runScript(38, false, false, args);
 					}
 
-					restoreFMTownsSounds = false;
+					restoreSounds = false;
 
 				} else if (VAR(saveLoadVar) == 2) {
 					// This is our old hack. If verbs should be shown restore them.
@@ -3345,7 +3345,7 @@ void ScummEngine_v3::scummLoop_handleSaveLoad() {
 					beginCutscene(args);
 					startScene(saveLoadRoom, nullptr, 0);
 					endCutscene();
-					restoreFMTownsSounds = false;
+					restoreSounds = false;
 				}
 			}
 
@@ -3356,8 +3356,8 @@ void ScummEngine_v3::scummLoop_handleSaveLoad() {
 			redrawVerbs();
 		}
 
-		if (restoreFMTownsSounds)
-			_townsPlayer->restoreAfterLoad();
+		if (restoreSounds)
+			_musicEngine->restoreAfterLoad();
 	}
 }
 
@@ -3409,8 +3409,7 @@ void ScummEngine_v5::scummLoop_handleSaveLoad() {
 		clearCharsetMask();
 		_charset->_hasMask = false;
 
-		if (_townsPlayer)
-			_townsPlayer->restoreAfterLoad();
+		_musicEngine->restoreAfterLoad();
 
 		redrawVerbs();
 




More information about the Scummvm-git-logs mailing list