[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