[Scummvm-cvs-logs] SF.net SVN: scummvm:[46549] scummvm/trunk/engines/sci
thebluegr at users.sourceforge.net
thebluegr at users.sourceforge.net
Fri Dec 25 14:18:49 CET 2009
Revision: 46549
http://scummvm.svn.sourceforge.net/scummvm/?rev=46549&view=rev
Author: thebluegr
Date: 2009-12-25 13:18:48 +0000 (Fri, 25 Dec 2009)
Log Message:
-----------
SCI/new music code: Some initial code for saving/loading the sound state
Modified Paths:
--------------
scummvm/trunk/engines/sci/engine/savegame.cpp
scummvm/trunk/engines/sci/engine/savegame.h
scummvm/trunk/engines/sci/sfx/soundcmd.h
Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp 2009-12-25 13:17:30 UTC (rev 46548)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp 2009-12-25 13:18:48 UTC (rev 46549)
@@ -45,6 +45,8 @@
#ifdef USE_OLD_MUSIC_FUNCTIONS
#include "sci/sfx/iterator/core.h"
#include "sci/sfx/iterator/iterator.h"
+#else
+#include "sci/sfx/music.h"
#endif
namespace Sci {
@@ -69,7 +71,9 @@
// of the classes they are syncing.
#ifdef USE_OLD_MUSIC_FUNCTIONS
-static void sync_songlib_t(Common::Serializer &s, SongLibrary &obj);
+static void sync_songlib(Common::Serializer &s, SongLibrary &obj);
+#else
+static void sync_songlib(Common::Serializer &s, SciMusic *music);
#endif
static void sync_reg_t(Common::Serializer &s, reg_t &obj) {
@@ -78,7 +82,7 @@
}
#ifdef USE_OLD_MUSIC_FUNCTIONS
-static void sync_song_t(Common::Serializer &s, Song &obj) {
+static void syncSong(Common::Serializer &s, Song &obj) {
s.syncAsSint32LE(obj._handle);
s.syncAsSint32LE(obj._resourceNum);
s.syncAsSint32LE(obj._priority);
@@ -96,6 +100,54 @@
obj._nextStopping = 0;
}
}
+#else
+
+#define FROBNICATE_HANDLE(reg) ((reg).segment << 16 | (reg).offset)
+#define DEFROBNICATE_HANDLE(handle) (make_reg((handle >> 16) & 0xffff, handle & 0xffff))
+
+static void syncSong(Common::Serializer &s, MusicEntry *song) {
+ if (s.getVersion() < 14) {
+ // Old sound system data
+ uint32 handle = 0;
+ if (s.isSaving())
+ handle = FROBNICATE_HANDLE(song->soundObj);
+ s.syncAsSint32LE(handle);
+ if (s.isLoading())
+ song->soundObj = DEFROBNICATE_HANDLE(handle);
+ s.syncAsSint32LE(song->resnum);
+ s.syncAsSint32LE(song->prio);
+ s.syncAsSint32LE(song->status);
+ s.skip(4); // restoreBehavior
+ s.syncAsSint32LE(song->ticker);
+ s.syncAsSint32LE(song->loop);
+ s.skip(4); // hold
+ // volume and dataInc will be synced from the sound objects
+ // when the sound list is reconstructed
+ song->volume = 100;
+ song->dataInc = 0;
+ // No fading info
+ song->FadeTo = 0;
+ song->FadeStep = 0;
+ song->FadeTicker = 0;
+ song->FadeTickerStep = 0;
+ song->pMidiParser = 0;
+ } else {
+ // A bit more optimized saving
+ sync_reg_t(s, song->soundObj);
+ s.syncAsSint16LE(song->resnum);
+ s.syncAsSint16LE(song->dataInc);
+ s.syncAsSint16LE(song->ticker);
+ s.syncAsByte(song->prio);
+ s.syncAsByte(song->loop);
+ s.syncAsByte(song->volume);
+ s.syncAsByte(song->FadeTo);
+ s.syncAsSint16LE(song->FadeStep);
+ s.syncAsSint32LE(song->FadeTicker);
+ s.syncAsSint32LE(song->FadeTickerStep);
+ s.syncAsByte(song->status);
+ song->pMidiParser = 0;
+ }
+}
#endif
// Experimental hack: Use syncWithSerializer to sync. By default, this assume
@@ -283,12 +335,6 @@
sync_reg_t(s, obj.reg);
}
-#ifdef USE_OLD_MUSIC_FUNCTIONS
-static void sync_sfx_state_t(Common::Serializer &s, SfxState &obj) {
- sync_songlib_t(s, obj._songlib);
-}
-#endif
-
static void sync_SavegameMetadata(Common::Serializer &s, SavegameMetadata &obj) {
// TODO: It would be a good idea to store a magic number & a header size here,
// so that we can implement backward compatibility if the savegame format changes.
@@ -320,29 +366,31 @@
// FIXME: This code goes out of sync when loading. Find out why
// OBSOLETE: Saved menus. Skip all of the saved data
- int totalMenus = 0;
- s.syncAsUint32LE(totalMenus);
+ if (s.getVersion() < 14) {
+ int totalMenus = 0;
+ s.syncAsUint32LE(totalMenus);
- // Now iterate through the obsolete saved menu data
- for (int i = 0; i < totalMenus; i++) {
- s.syncString(tmp); // OBSOLETE: Used to be _title
- s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _titleWidth
- s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _width
+ // Now iterate through the obsolete saved menu data
+ for (int i = 0; i < totalMenus; i++) {
+ s.syncString(tmp); // OBSOLETE: Used to be _title
+ s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _titleWidth
+ s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _width
- int menuLength = 0;
- s.syncAsUint32LE(menuLength);
+ int menuLength = 0;
+ s.syncAsUint32LE(menuLength);
- for (int j = 0; j < menuLength; j++) {
- s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _type
- s.syncString(tmp); // OBSOLETE: Used to be _keytext
- s.skip(4, VER(9), VER(9)); // OBSOLETE: Used to be keytext_size
+ for (int j = 0; j < menuLength; j++) {
+ s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _type
+ s.syncString(tmp); // OBSOLETE: Used to be _keytext
+ s.skip(4, VER(9), VER(9)); // OBSOLETE: Used to be keytext_size
- s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _flags
- s.skip(64, VER(12), VER(12)); // OBSOLETE: Used to be MENU_SAID_SPEC_SIZE
- s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _saidPos
- s.syncString(tmp); // OBSOLETE: Used to be _text
- s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _textPos
- s.skip(4 * 4, VER(12), VER(12)); // OBSOLETE: Used to be _modifiers, _key, _enabled and _tag
+ s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _flags
+ s.skip(64, VER(12), VER(12)); // OBSOLETE: Used to be MENU_SAID_SPEC_SIZE
+ s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _saidPos
+ s.syncString(tmp); // OBSOLETE: Used to be _text
+ s.skip(4, VER(12), VER(12)); // OBSOLETE: Used to be _textPos
+ s.skip(4 * 4, VER(12), VER(12)); // OBSOLETE: Used to be _modifiers, _key, _enabled and _tag
+ }
}
}
#endif
@@ -375,10 +423,9 @@
syncArray<Class>(s, _segMan->_classtable);
#ifdef USE_OLD_MUSIC_FUNCTIONS
- sync_sfx_state_t(s, _sound);
+ sync_songlib(s, _sound._songlib);
#else
- // TODO. For now, error out on purpose
- error("TODO: Sync music state");
+ sync_songlib(s, _soundCmd->_music);
#endif
}
@@ -543,7 +590,7 @@
#pragma mark -
#ifdef USE_OLD_MUSIC_FUNCTIONS
-static void sync_songlib_t(Common::Serializer &s, SongLibrary &obj) {
+static void sync_songlib(Common::Serializer &s, SongLibrary &obj) {
int songcount = 0;
if (s.isSaving())
songcount = obj.countSongs();
@@ -553,18 +600,41 @@
obj._lib = 0;
while (songcount--) {
Song *newsong = new Song;
- sync_song_t(s, *newsong);
+ syncSong(s, *newsong);
obj.addSong(newsong);
}
} else {
Song *seeker = obj._lib;
while (seeker) {
seeker->_restoreTime = seeker->_it->getTimepos();
- sync_song_t(s, *seeker);
+ syncSong(s, *seeker);
seeker = seeker->_next;
}
}
}
+#else
+static void sync_songlib(Common::Serializer &s, SciMusic *music) {
+ int songcount = 0;
+ if (s.isSaving())
+ songcount = music->_playList.size();
+ s.syncAsUint32LE(songcount);
+ if (s.isLoading()) {
+ music->stopAll();
+ music->_playList.resize(songcount);
+ }
+
+ if (s.isLoading()) {
+ for (int i = 0; i < songcount; i++) {
+ MusicEntry *curSong = new MusicEntry();
+ syncSong(s, curSong);
+ music->_playList[i] = curSong;
+ }
+ } else {
+ for (int i = 0; i < songcount; i++) {
+ syncSong(s, music->_playList[i]);
+ }
+ }
+}
#endif
#pragma mark -
@@ -875,6 +945,22 @@
retval->_sound._song = NULL;
retval->_sound._suspended = s->_sound._suspended;
reconstruct_sounds(retval);
+#else
+ // Reconstruct sounds
+ SciMusic *music = retval->_soundCmd->_music;
+ for (uint32 i = 0; i < music->_playList.size(); i++) {
+ if (meta.savegame_version < 14) {
+ if (retval->detectDoSoundType() >= SCI_VERSION_1_EARLY) {
+ music->_playList[i]->dataInc = GET_SEL32V(retval->_segMan, music->_playList[i]->soundObj, dataInc);
+ music->_playList[i]->volume = GET_SEL32V(retval->_segMan, music->_playList[i]->soundObj, vol);
+ } else {
+ music->_playList[i]->volume = 100;
+ }
+ }
+
+ music->_playList[i]->soundRes = new SoundResource(music->_playList[i]->resnum, retval->resMan, retval->detectDoSoundType());
+ music->soundInitSnd(music->_playList[i]);
+ }
#endif
// Message state:
Modified: scummvm/trunk/engines/sci/engine/savegame.h
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.h 2009-12-25 13:17:30 UTC (rev 46548)
+++ scummvm/trunk/engines/sci/engine/savegame.h 2009-12-25 13:18:48 UTC (rev 46549)
@@ -36,7 +36,7 @@
struct EngineState;
enum {
- CURRENT_SAVEGAME_VERSION = 13,
+ CURRENT_SAVEGAME_VERSION = 14,
MINIMUM_SAVEGAME_VERSION = 9
};
Modified: scummvm/trunk/engines/sci/sfx/soundcmd.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/soundcmd.h 2009-12-25 13:17:30 UTC (rev 46548)
+++ scummvm/trunk/engines/sci/sfx/soundcmd.h 2009-12-25 13:18:48 UTC (rev 46549)
@@ -54,8 +54,9 @@
reg_t parseCommand(int argc, reg_t *argv, reg_t acc);
+ SciMusic *_music;
+
private:
- SciMusic *_music;
Common::Array<MusicEntryCommand*> _soundCommands;
ResourceManager *_resMan;
SegManager *_segMan;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list