diff options
author | Torbjörn Andersson | 2012-11-15 22:23:44 +0100 |
---|---|---|
committer | Torbjörn Andersson | 2012-11-15 22:23:44 +0100 |
commit | f784d683e0f42c059331b49dbf90f91ac442b820 (patch) | |
tree | f012f016e9af0402488b4557f0bf59fd2e647fcd | |
parent | b75349383e834b47ad57f86a2c0f5ab48ca4aa2c (diff) | |
download | scummvm-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...
-rw-r--r-- | engines/scumm/music.h | 6 | ||||
-rw-r--r-- | engines/scumm/player_mac.cpp | 42 | ||||
-rw-r--r-- | engines/scumm/player_mac.h | 3 | ||||
-rw-r--r-- | engines/scumm/saveload.cpp | 10 | ||||
-rw-r--r-- | engines/scumm/saveload.h | 2 |
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 |