From 8269b7bdc225971f4a9356413768f6aaf7675e79 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 22 Oct 2005 22:18:44 +0000 Subject: Switch iMuse to use Serialiazable, too (at least partially) svn-id: r19243 --- scumm/imuse.cpp | 114 +++++++++++++++++++++++++++++++++++-------------- scumm/imuse_internal.h | 11 ++--- scumm/imuse_player.cpp | 5 ++- scumm/instrument.h | 2 +- 4 files changed, 92 insertions(+), 40 deletions(-) diff --git a/scumm/imuse.cpp b/scumm/imuse.cpp index 322b3230e0..aedc2ba3b9 100644 --- a/scumm/imuse.cpp +++ b/scumm/imuse.cpp @@ -1549,29 +1549,6 @@ int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm) { MKEND() }; - const SaveLoadEntry partEntries[] = { - MKREF(Part, _next, TYPE_PART, VER(8)), - MKREF(Part, _prev, TYPE_PART, VER(8)), - MKREF(Part, _player, TYPE_PLAYER, VER(8)), - MKLINE(Part, _pitchbend, sleInt16, VER(8)), - MKLINE(Part, _pitchbend_factor, sleUint8, VER(8)), - MKLINE(Part, _transpose, sleInt8, VER(8)), - MKLINE(Part, _vol, sleUint8, VER(8)), - MKLINE(Part, _detune, sleInt8, VER(8)), - MKLINE(Part, _pan, sleInt8, VER(8)), - MKLINE(Part, _on, sleUint8, VER(8)), - MKLINE(Part, _modwheel, sleUint8, VER(8)), - MKLINE(Part, _pedal, sleUint8, VER(8)), - MK_OBSOLETE(Part, _program, sleUint8, VER(8), VER(16)), - MKLINE(Part, _pri, sleUint8, VER(8)), - MKLINE(Part, _chan, sleUint8, VER(8)), - MKLINE(Part, _effect_level, sleUint8, VER(8)), - MKLINE(Part, _chorus, sleUint8, VER(8)), - MKLINE(Part, _percussion, sleUint8, VER(8)), - MKLINE(Part, _bank, sleUint8, VER(8)), - MKEND() - }; - int i; ser->_ref_me = this; @@ -1584,8 +1561,11 @@ int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm) { // The players for (i = 0; i < ARRAYSIZE(_players); ++i) - _players[i].save_or_load(ser); - ser->saveLoadArrayOf(_parts, ARRAYSIZE(_parts), sizeof(_parts[0]), partEntries); + _players[i].saveLoadWithSerializer(ser); + + // The parts + for (i = 0; i < ARRAYSIZE(_parts); ++i) + _parts[i].saveLoadWithSerializer(ser); { // Load/save the instrument definitions, which were revamped with V11. Part *part = &_parts[0]; @@ -1600,6 +1580,8 @@ int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm) { } // VolumeFader has been replaced with the more generic ParameterFader. + // FIXME: replace this loop by something like + // if (loading && version <= 16) ser->skip(XXX bytes); for (i = 0; i < 8; ++i) ser->saveLoadEntries(0, volumeFaderEntries); @@ -1618,9 +1600,6 @@ int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm) { return 0; } -#undef MKLINE -#undef MKEND - void IMuseInternal::fix_parts_after_load() { Part *part; int i; @@ -1645,6 +1624,63 @@ void IMuseInternal::fix_players_after_load(ScummEngine *scumm) { } } +Part::Part() { + _slot = 0; + _next = 0; + _prev = 0; + _mc = 0; + _player = 0; + _pitchbend = 0; + _pitchbend_factor = 0; + _transpose = 0; + _transpose_eff = 0; + _vol = 0; + _vol_eff = 0; + _detune = 0; + _detune_eff = 0; + _pan = 0; + _pan_eff = 0; + _on = false; + _modwheel = 0; + _pedal = false; + _pri = 0; + _pri_eff = 0; + _chan = 0; + _effect_level = 0; + _chorus = 0; + _percussion = 0; + _bank = 0; + _unassigned_instrument = false; +} + +void Part::saveLoadWithSerializer(Serializer *ser) { + // TODO: Get rid of MKREF usage! + const SaveLoadEntry partEntries[] = { + MKREF(Part, _next, TYPE_PART, VER(8)), + MKREF(Part, _prev, TYPE_PART, VER(8)), + MKREF(Part, _player, TYPE_PLAYER, VER(8)), + MKLINE(Part, _pitchbend, sleInt16, VER(8)), + MKLINE(Part, _pitchbend_factor, sleUint8, VER(8)), + MKLINE(Part, _transpose, sleInt8, VER(8)), + MKLINE(Part, _vol, sleUint8, VER(8)), + MKLINE(Part, _detune, sleInt8, VER(8)), + MKLINE(Part, _pan, sleInt8, VER(8)), + MKLINE(Part, _on, sleUint8, VER(8)), + MKLINE(Part, _modwheel, sleUint8, VER(8)), + MKLINE(Part, _pedal, sleUint8, VER(8)), + MK_OBSOLETE(Part, _program, sleUint8, VER(8), VER(16)), + MKLINE(Part, _pri, sleUint8, VER(8)), + MKLINE(Part, _chan, sleUint8, VER(8)), + MKLINE(Part, _effect_level, sleUint8, VER(8)), + MKLINE(Part, _chorus, sleUint8, VER(8)), + MKLINE(Part, _percussion, sleUint8, VER(8)), + MKLINE(Part, _bank, sleUint8, VER(8)), + MKEND() + }; + + ser->saveLoadEntries(this, partEntries); +} + void Part::set_detune(int8 detune) { _detune_eff = clamp((_detune = detune) + _player->getDetune(), -128, 127); if (_mc) @@ -1975,10 +2011,24 @@ void IMuseInternal::copyGlobalAdlibInstrument(byte slot, Instrument *dest) { // //////////////////////////////////////////////////////////// -IMuse::IMuse(OSystem *system, IMuseInternal *target) : _system(system), _target(target) { _mutex = system->createMutex(); } -IMuse::~IMuse() { if (_mutex) _system->deleteMutex(_mutex); if (_target) delete _target; } -inline void IMuse::in() const { _system->lockMutex(_mutex); } -inline void IMuse::out() const { _system->unlockMutex(_mutex); } +IMuse::IMuse(OSystem *system, IMuseInternal *target) + : _system(system), _target(target) { + _mutex = system->createMutex(); +} + +IMuse::~IMuse() { + if (_mutex) + _system->deleteMutex(_mutex); + if (_target) + delete _target; +} + +inline void IMuse::in() const { + _system->lockMutex(_mutex); +} +inline void IMuse::out() const { + _system->unlockMutex(_mutex); +} void IMuse::on_timer(MidiDriver *midi) { in(); _target->on_timer(midi); out(); } void IMuse::pause(bool paused) { in(); _target->pause(paused); out(); } diff --git a/scumm/imuse_internal.h b/scumm/imuse_internal.h index 0914d3a462..10f6e5a373 100644 --- a/scumm/imuse_internal.h +++ b/scumm/imuse_internal.h @@ -24,6 +24,7 @@ #include "common/scummsys.h" #include "scumm/instrument.h" +#include "scumm/saveload.h" #include "sound/mididrv.h" class MidiParser; @@ -245,7 +246,7 @@ public: void onTimer(); void removePart(Part *part); int scan(uint totrack, uint tobeat, uint totick); - int save_or_load(Serializer *ser); + void saveLoadWithSerializer(Serializer *ser); int setHook(byte cls, byte value, byte chan) { return _hook.set(cls, value, chan); } void setDetune(int detune); bool setLoop(uint count, uint tobeat, uint totick, uint frombeat, uint fromtick); @@ -271,7 +272,7 @@ public: MidiChannel *getPercussionChannel() { return 0; } }; -struct Part { +struct Part : public Serializable { int _slot; Part *_next, *_prev; MidiChannel *_mc; @@ -333,9 +334,9 @@ struct Part { void sendPitchBend(); bool clearToTransmit(); - Part() { - memset(this,0,sizeof(Part)); - } + Part(); + + void saveLoadWithSerializer(Serializer *ser); }; // WARNING: This is the internal variant of the IMUSE class. diff --git a/scumm/imuse_player.cpp b/scumm/imuse_player.cpp index 34937022b1..496c90f480 100644 --- a/scumm/imuse_player.cpp +++ b/scumm/imuse_player.cpp @@ -1176,7 +1176,8 @@ enum { TYPE_PLAYER = 2 }; -int Player::save_or_load(Serializer *ser) { +void Player::saveLoadWithSerializer(Serializer *ser) { + // TODO: Get rid of MKREF usage! static const SaveLoadEntry playerEntries[] = { MKREF(Player, _parts, TYPE_PART, VER(8)), MKLINE(Player, _active, sleByte, VER(8)), @@ -1232,7 +1233,7 @@ int Player::save_or_load(Serializer *ser) { ser->saveLoadEntries(this, playerEntries); ser->saveLoadArrayOf(_parameterFaders, ARRAYSIZE(_parameterFaders), sizeof(ParameterFader), parameterFaderEntries); - return 0; + return; } } // End of namespace Scumm diff --git a/scumm/instrument.h b/scumm/instrument.h index da7fde4a27..0f560e65d6 100644 --- a/scumm/instrument.h +++ b/scumm/instrument.h @@ -34,7 +34,7 @@ class Instrument; class InstrumentInternal { public: - virtual ~InstrumentInternal() {}; + virtual ~InstrumentInternal() {} virtual void saveOrLoad (Serializer *s) = 0; virtual void send (MidiChannel *mc) = 0; virtual void copy_to (Instrument *dest) = 0; -- cgit v1.2.3