aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorTorbjörn Andersson2012-11-15 22:23:44 +0100
committerTorbjörn Andersson2012-11-15 22:23:44 +0100
commitf784d683e0f42c059331b49dbf90f91ac442b820 (patch)
treef012f016e9af0402488b4557f0bf59fd2e647fcd /engines
parentb75349383e834b47ad57f86a2c0f5ab48ca4aa2c (diff)
downloadscummvm-rg350-f784d683e0f42c059331b49dbf90f91ac442b820.tar.gz
scummvm-rg350-f784d683e0f42c059331b49dbf90f91ac442b820.tar.bz2
scummvm-rg350-f784d683e0f42c059331b49dbf90f91ac442b820.zip
SCUMM: Save/load Mac music engine state for Loom and MI1
Note that while this removes _townsPlayer->saveLoadWithSerializer(s) it really shouldn't break anything because _musicEngine also points to the FM Towns player. Famous last words...
Diffstat (limited to 'engines')
-rw-r--r--engines/scumm/music.h6
-rw-r--r--engines/scumm/player_mac.cpp42
-rw-r--r--engines/scumm/player_mac.h3
-rw-r--r--engines/scumm/saveload.cpp10
-rw-r--r--engines/scumm/saveload.h2
5 files changed, 59 insertions, 4 deletions
diff --git a/engines/scumm/music.h b/engines/scumm/music.h
index a527c77b72..9fd14d830e 100644
--- a/engines/scumm/music.h
+++ b/engines/scumm/music.h
@@ -24,6 +24,7 @@
#define SCUMM_MUSIC_H
#include "common/scummsys.h"
+#include "engines/scumm/saveload.h"
namespace Scumm {
@@ -78,6 +79,11 @@ public:
* @return the music timer
*/
virtual int getMusicTimer() { return 0; }
+
+ /**
+ * Save or load the music state.
+ */
+ virtual void saveLoadWithSerializer(Serializer *ser) {}
};
} // End of namespace Scumm
diff --git a/engines/scumm/player_mac.cpp b/engines/scumm/player_mac.cpp
index 58dab192be..7b0f671f6d 100644
--- a/engines/scumm/player_mac.cpp
+++ b/engines/scumm/player_mac.cpp
@@ -97,6 +97,48 @@ Player_Mac::~Player_Mac() {
delete[] _channel;
}
+void Player_Mac::saveLoadWithSerializer(Serializer *ser) {
+ Common::StackLock lock(_mutex);
+ if (ser->getVersion() < VER(94)) {
+ if (_vm->_game.id == GID_MONKEY && ser->isLoading()) {
+ // TODO: Skip old iMUSE save/load information
+ }
+ } else {
+ static const SaveLoadEntry musicEntries[] = {
+ MKLINE(Player_Mac, _soundPlaying, sleInt16, VER(94)),
+ MKEND()
+ };
+
+ static const SaveLoadEntry channelEntries[] = {
+ MKLINE(Channel, _pos, sleUint16, VER(94)),
+ MKLINE(Channel, _pitchModifier, sleInt32, VER(94)),
+ MKLINE(Channel, _velocity, sleUint8, VER(94)),
+ MKLINE(Channel, _remaining, sleUint32, VER(94)),
+ MKLINE(Channel, _notesLeft, sleUint8, VER(94)),
+ MKEND()
+ };
+
+ static const SaveLoadEntry instrumentEntries[] = {
+ MKLINE(Instrument, _pos, sleUint32, VER(94)),
+ MKLINE(Instrument, _subPos, sleUint32, VER(94)),
+ MKEND()
+ };
+
+ ser->saveLoadEntries(this, musicEntries);
+
+ if (ser->isLoading() && _soundPlaying != -1) {
+ const byte *ptr = _vm->getResourceAddress(rtSound, _soundPlaying);
+ assert(ptr);
+ loadMusic(ptr);
+ }
+
+ ser->saveLoadArrayOf(_channel, _numberOfChannels, sizeof(Channel), channelEntries);
+ for (int i = 0; i < _numberOfChannels; i++) {
+ ser->saveLoadEntries(&_channel[i], instrumentEntries);
+ }
+ }
+}
+
void Player_Mac::setMusicVolume(int vol) {
debug(5, "Player_Mac::setMusicVolume(%d)", vol);
}
diff --git a/engines/scumm/player_mac.h b/engines/scumm/player_mac.h
index b850915bb2..a30111bda0 100644
--- a/engines/scumm/player_mac.h
+++ b/engines/scumm/player_mac.h
@@ -27,6 +27,7 @@
#include "common/util.h"
#include "common/mutex.h"
#include "scumm/music.h"
+#include "scumm/saveload.h"
#include "audio/audiostream.h"
#include "audio/mixer.h"
@@ -62,6 +63,8 @@ public:
virtual bool endOfData() const { return false; }
virtual int getRate() const { return _sampleRate; }
+ virtual void saveLoadWithSerializer(Serializer *ser);
+
private:
Common::Mutex _mutex;
Audio::Mixer *const _mixer;
diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp
index 72896e097a..3453e53a18 100644
--- a/engines/scumm/saveload.cpp
+++ b/engines/scumm/saveload.cpp
@@ -1477,9 +1477,13 @@ void ScummEngine::saveOrLoad(Serializer *s) {
}
- // Save/load FM-Towns audio status
- if (_townsPlayer)
- _townsPlayer->saveLoadWithSerializer(s);
+ //
+ // Save/load music engine status
+ //
+ if (_musicEngine) {
+ _musicEngine->saveLoadWithSerializer(s);
+ }
+
//
// Save/load the charset renderer state
diff --git a/engines/scumm/saveload.h b/engines/scumm/saveload.h
index a640bc1e17..4bfa7d0e71 100644
--- a/engines/scumm/saveload.h
+++ b/engines/scumm/saveload.h
@@ -47,7 +47,7 @@ namespace Scumm {
* only saves/loads those which are valid for the version of the savegame
* which is being loaded/saved currently.
*/
-#define CURRENT_VER 93
+#define CURRENT_VER 94
/**
* An auxillary macro, used to specify savegame versions. We use this instead