diff options
author | Filippos Karapetis | 2011-11-24 00:01:29 +0200 |
---|---|---|
committer | Filippos Karapetis | 2011-11-24 00:03:01 +0200 |
commit | 0b4a0220183db75d5292dd1f13c74b71824cc7e4 (patch) | |
tree | d61af37e1f9869909c917d65dd51b74a6c6fd582 /engines | |
parent | 0565d7dc208c4c5c1fa53fe2ae38a8441db6081e (diff) | |
download | scummvm-rg350-0b4a0220183db75d5292dd1f13c74b71824cc7e4.tar.gz scummvm-rg350-0b4a0220183db75d5292dd1f13c74b71824cc7e4.tar.bz2 scummvm-rg350-0b4a0220183db75d5292dd1f13c74b71824cc7e4.zip |
TOLTECS: Save music in saved games
Also, move all music resource related code into its own class
Diffstat (limited to 'engines')
-rw-r--r-- | engines/toltecs/music.cpp | 41 | ||||
-rw-r--r-- | engines/toltecs/music.h | 22 | ||||
-rw-r--r-- | engines/toltecs/saveload.cpp | 7 | ||||
-rw-r--r-- | engines/toltecs/script.cpp | 18 | ||||
-rw-r--r-- | engines/toltecs/toltecs.cpp | 6 | ||||
-rw-r--r-- | engines/toltecs/toltecs.h | 4 |
6 files changed, 75 insertions, 23 deletions
diff --git a/engines/toltecs/music.cpp b/engines/toltecs/music.cpp index ef44421de9..c322961077 100644 --- a/engines/toltecs/music.cpp +++ b/engines/toltecs/music.cpp @@ -22,9 +22,12 @@ // FIXME: This code is taken from SAGA and needs more work (e.g. setVolume). +#include "toltecs/toltecs.h" #include "toltecs/music.h" +#include "toltecs/resource.h" #include "audio/midiparser.h" +#include "common/textconsole.h" namespace Toltecs { @@ -101,4 +104,42 @@ void MusicPlayer::stopAndClear() { _buffer = NULL; } +Music::Music(ArchiveReader *arc) : MusicPlayer(true), _arc(arc) { + _sequenceResIndex = -1; +} + +void Music::playSequence(int16 sequenceResIndex) { + _sequenceResIndex = sequenceResIndex; + + int32 resourceSize = _arc->getResourceSize(sequenceResIndex); + byte *data = new byte[resourceSize]; + _arc->openResource(sequenceResIndex); + _arc->read(data, resourceSize); + _arc->closeResource(); + + if (!memcmp(data, "FORM", 4)) + playMIDI(data, resourceSize, true); // music tracks are always looping + else + // Sanity check: this should never occur + error("playSequence: resource %d isn't XMIDI", sequenceResIndex); + + delete[] data; +} + +void Music::stopSequence() { + _sequenceResIndex = -1; + stopAndClear(); +} + +void Music::saveState(Common::WriteStream *out) { + out->writeSint16LE(_sequenceResIndex); +} + +void Music::loadState(Common::ReadStream *in) { + _sequenceResIndex = in->readSint16LE(); + + if (_sequenceResIndex >= 0) + playSequence(_sequenceResIndex); +} + } // End of namespace Made diff --git a/engines/toltecs/music.h b/engines/toltecs/music.h index c7189e89d6..79df1ea2f5 100644 --- a/engines/toltecs/music.h +++ b/engines/toltecs/music.h @@ -26,9 +26,12 @@ #define MADE_MUSIC_H #include "audio/midiplayer.h" +#include "common/stream.h" namespace Toltecs { +class ArchiveReader; + class MusicPlayer : public Audio::MidiPlayer { public: MusicPlayer(bool isGM = true); @@ -48,6 +51,23 @@ private: byte *_buffer; }; -} // End of namespace Made +class Music : public MusicPlayer { +public: + + Music(ArchiveReader *arc); + ~Music() {} + + void playSequence(int16 sequenceResIndex); + void stopSequence(); + + void saveState(Common::WriteStream *out); + void loadState(Common::ReadStream *in); + +private: + int16 _sequenceResIndex; + ArchiveReader *_arc; +}; + +} // End of namespace Toltecs #endif diff --git a/engines/toltecs/saveload.cpp b/engines/toltecs/saveload.cpp index af78c8b975..c24d2149b0 100644 --- a/engines/toltecs/saveload.cpp +++ b/engines/toltecs/saveload.cpp @@ -27,6 +27,7 @@ #include "toltecs/toltecs.h" #include "toltecs/animation.h" +#include "toltecs/music.h" #include "toltecs/palette.h" #include "toltecs/script.h" #include "toltecs/screen.h" @@ -40,7 +41,7 @@ namespace Toltecs { - Maybe switch to SCUMM/Tinsel serialization approach? */ -#define TOLTECS_SAVEGAME_VERSION 2 +#define TOLTECS_SAVEGAME_VERSION 3 ToltecsEngine::kReadSaveHeaderError ToltecsEngine::readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header) { @@ -133,6 +134,7 @@ void ToltecsEngine::savegame(const char *filename, const char *description) { _anim->saveState(out); _screen->saveState(out); _sound->saveState(out); + _music->saveState(out); out->finalize(); delete out; @@ -156,6 +158,7 @@ void ToltecsEngine::loadgame(const char *filename) { } _sound->stopAll(); + _music->stopSequence(); g_engine->setTotalPlayTime(header.playTime * 1000); _cameraX = in->readUint16LE(); @@ -189,6 +192,8 @@ void ToltecsEngine::loadgame(const char *filename) { _screen->loadState(in); if (header.version >= 2) _sound->loadState(in); + if (header.version >= 3) + _music->loadState(in); delete in; diff --git a/engines/toltecs/script.cpp b/engines/toltecs/script.cpp index 959db8b277..e5fc865f5b 100644 --- a/engines/toltecs/script.cpp +++ b/engines/toltecs/script.cpp @@ -1009,27 +1009,13 @@ void ScriptInterpreter::sfStartSequence() { if (sequenceResIndex >= 0) { //_vm->_arc->dump(sequenceResIndex, "music"); // DEBUG: Dump music so we know what's in there - int32 resourceSize = _vm->_arc->getResourceSize(sequenceResIndex); - byte *data = new byte[resourceSize]; - _vm->_arc->openResource(sequenceResIndex); - _vm->_arc->read(data, resourceSize); - _vm->_arc->closeResource(); - - if (!memcmp(data, "FORM", 4)) { - // TODO: It seems that music is always looping? - _vm->_musicPlayer->playMIDI(data, resourceSize, true); - } else { - // Sanity check: this should never occur - error("sfStartSequence: resource %d isn't XMIDI", sequenceResIndex); - } - - delete[] data; + _vm->_music->playSequence(sequenceResIndex); } } void ScriptInterpreter::sfEndSequence() { //debug("ScriptInterpreter::sfEndSequence"); - _vm->_musicPlayer->stopAndClear(); + _vm->_music->stopSequence(); } void ScriptInterpreter::sfSetSequenceVolume() { diff --git a/engines/toltecs/toltecs.cpp b/engines/toltecs/toltecs.cpp index 8a2853e495..d403e0499b 100644 --- a/engines/toltecs/toltecs.cpp +++ b/engines/toltecs/toltecs.cpp @@ -124,7 +124,7 @@ Common::Error ToltecsEngine::run() { _palette = new Palette(this); _segmap = new SegmentMap(this); _moviePlayer = new MoviePlayer(this); - _musicPlayer = new MusicPlayer(); + _music = new Music(_arc); _menuSystem = new MenuSystem(this); _sound = new Sound(this); @@ -168,7 +168,7 @@ Common::Error ToltecsEngine::run() { } _script->runScript(); - _musicPlayer->stopAndClear(); + _music->stopSequence(); _sound->stopAll(); delete _arc; @@ -178,7 +178,7 @@ Common::Error ToltecsEngine::run() { delete _anim; delete _palette; delete _segmap; - delete _musicPlayer; + delete _music; delete _moviePlayer; delete _menuSystem; diff --git a/engines/toltecs/toltecs.h b/engines/toltecs/toltecs.h index 1334f84cb3..efa1f9d13a 100644 --- a/engines/toltecs/toltecs.h +++ b/engines/toltecs/toltecs.h @@ -45,7 +45,7 @@ class ArchiveReader; class Input; class MenuSystem; class MoviePlayer; -class MusicPlayer; +class Music; class Palette; class ResourceCache; class ScriptInterpreter; @@ -134,7 +134,7 @@ public: Input *_input; MenuSystem *_menuSystem; MoviePlayer *_moviePlayer; - MusicPlayer *_musicPlayer; + Music *_music; Palette *_palette; ResourceCache *_res; ScriptInterpreter *_script; |