diff options
Diffstat (limited to 'engines/scumm/imuse')
-rw-r--r-- | engines/scumm/imuse/imuse.cpp | 85 | ||||
-rw-r--r-- | engines/scumm/imuse/imuse.h | 4 | ||||
-rw-r--r-- | engines/scumm/imuse/imuse_internal.h | 11 | ||||
-rw-r--r-- | engines/scumm/imuse/imuse_part.cpp | 54 | ||||
-rw-r--r-- | engines/scumm/imuse/imuse_player.cpp | 101 | ||||
-rw-r--r-- | engines/scumm/imuse/instrument.cpp | 106 | ||||
-rw-r--r-- | engines/scumm/imuse/instrument.h | 9 |
7 files changed, 161 insertions, 209 deletions
diff --git a/engines/scumm/imuse/imuse.cpp b/engines/scumm/imuse/imuse.cpp index b7b72ba181..d083dc8dfd 100644 --- a/engines/scumm/imuse/imuse.cpp +++ b/engines/scumm/imuse/imuse.cpp @@ -362,70 +362,50 @@ void IMuseInternal::pause(bool paused) { _paused = paused; } -int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm, bool fixAfterLoad) { - Common::StackLock lock(_mutex, "IMuseInternal::save_or_load()"); - const SaveLoadEntry mainEntries[] = { - MKLINE(IMuseInternal, _queue_end, sleUint8, VER(8)), - MKLINE(IMuseInternal, _queue_pos, sleUint8, VER(8)), - MKLINE(IMuseInternal, _queue_sound, sleUint16, VER(8)), - MKLINE(IMuseInternal, _queue_adding, sleByte, VER(8)), - MKLINE(IMuseInternal, _queue_marker, sleByte, VER(8)), - MKLINE(IMuseInternal, _queue_cleared, sleByte, VER(8)), - MKLINE(IMuseInternal, _master_volume, sleByte, VER(8)), - MKLINE(IMuseInternal, _trigger_count, sleUint16, VER(8)), - MKLINE(IMuseInternal, _snm_trigger_index, sleUint16, VER(54)), - MKARRAY(IMuseInternal, _channel_volume[0], sleUint16, 8, VER(8)), - MKARRAY(IMuseInternal, _volchan_table[0], sleUint16, 8, VER(8)), - MKEND() - }; - - const SaveLoadEntry cmdQueueEntries[] = { - MKARRAY(CommandQueue, array[0], sleUint16, 8, VER(23)), - MKEND() - }; +static void syncWithSerializer(Common::Serializer &s, CommandQueue &cq) { + s.syncArray(cq.array, 8, Common::Serializer::Uint16LE, VER(23)); +} - // VolumeFader is obsolete. - const SaveLoadEntry volumeFaderEntries[] = { - MK_OBSOLETE(VolumeFader, player, sleUint16, VER(8), VER(16)), - MK_OBSOLETE(VolumeFader, active, sleUint8, VER(8), VER(16)), - MK_OBSOLETE(VolumeFader, curvol, sleUint8, VER(8), VER(16)), - MK_OBSOLETE(VolumeFader, speed_lo_max, sleUint16, VER(8), VER(16)), - MK_OBSOLETE(VolumeFader, num_steps, sleUint16, VER(8), VER(16)), - MK_OBSOLETE(VolumeFader, speed_hi, sleInt8, VER(8), VER(16)), - MK_OBSOLETE(VolumeFader, direction, sleInt8, VER(8), VER(16)), - MK_OBSOLETE(VolumeFader, speed_lo, sleInt8, VER(8), VER(16)), - MK_OBSOLETE(VolumeFader, speed_lo_counter, sleUint16, VER(8), VER(16)), - MKEND() - }; +static void syncWithSerializer(Common::Serializer &s, ImTrigger &it) { + s.syncAsSint16LE(it.sound, VER(54)); + s.syncAsByte(it.id, VER(54)); + s.syncAsUint16LE(it.expire, VER(54)); + s.syncArray(it.command, 8, Common::Serializer::Uint16LE, VER(54)); +} - const SaveLoadEntry snmTriggerEntries[] = { - MKLINE(ImTrigger, sound, sleInt16, VER(54)), - MKLINE(ImTrigger, id, sleByte, VER(54)), - MKLINE(ImTrigger, expire, sleUint16, VER(54)), - MKARRAY(ImTrigger, command[0], sleUint16, 8, VER(54)), - MKEND() - }; +void IMuseInternal::saveLoadWithSerializer(Common::Serializer &s, ScummEngine *scumm, bool fixAfterLoad) { + Common::StackLock lock(_mutex, "IMuseInternal::saveLoadWithSerializer()"); int i; - ser->saveLoadEntries(this, mainEntries); - ser->saveLoadArrayOf(_cmd_queue, ARRAYSIZE(_cmd_queue), sizeof(_cmd_queue[0]), cmdQueueEntries); - ser->saveLoadArrayOf(_snm_triggers, ARRAYSIZE(_snm_triggers), sizeof(_snm_triggers[0]), snmTriggerEntries); + s.syncAsByte(_queue_end, VER(8)); + s.syncAsByte(_queue_pos, VER(8)); + s.syncAsUint16LE(_queue_sound, VER(8)); + s.syncAsByte(_queue_adding, VER(8)); + s.syncAsByte(_queue_marker, VER(8)); + s.syncAsByte(_queue_cleared, VER(8)); + s.syncAsByte(_master_volume, VER(8)); + s.syncAsUint16LE(_trigger_count, VER(8)); + s.syncAsUint16LE(_snm_trigger_index, VER(54)); + s.syncArray(_channel_volume, 8, Common::Serializer::Uint16LE, VER(8)); + s.syncArray(_volchan_table, 8, Common::Serializer::Uint16LE, VER(8)); + s.syncArray(_cmd_queue, ARRAYSIZE(_cmd_queue), syncWithSerializer); + s.syncArray(_snm_triggers, ARRAYSIZE(_snm_triggers), syncWithSerializer); // The players for (i = 0; i < ARRAYSIZE(_players); ++i) - _players[i].saveLoadWithSerializer(ser); + _players[i].saveLoadWithSerializer(s); // The parts for (i = 0; i < ARRAYSIZE(_parts); ++i) - _parts[i].saveLoadWithSerializer(ser); + _parts[i].saveLoadWithSerializer(s); { // Load/save the instrument definitions, which were revamped with V11. Part *part = &_parts[0]; - if (ser->getVersion() >= VER(11)) { + if (s.getVersion() >= VER(11)) { for (i = ARRAYSIZE(_parts); i; --i, ++part) { - part->_instrument.saveOrLoad(ser); + part->_instrument.saveLoadWithSerializer(s); } } else { for (i = ARRAYSIZE(_parts); i; --i, ++part) @@ -434,10 +414,7 @@ int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm, bool fixAft } // 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); + s.skip(13 * 8, VER(8), VER(16)); // Normally, we have to fix up the data structures after loading a // saved game. But there are cases where we don't. For instance, The @@ -448,7 +425,7 @@ int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm, bool fixAft // dummy iMUSE object, but since the resource is no longer recognizable // to iMUSE, the fixup fails hard. So yes, this is a bit of a hack. - if (ser->isLoading() && fixAfterLoad) { + if (s.isLoading() && fixAfterLoad) { // Load all sounds that we need fix_players_after_load(scumm); fix_parts_after_load(); @@ -459,8 +436,6 @@ int IMuseInternal::save_or_load(Serializer *ser, ScummEngine *scumm, bool fixAft if (_midi_adlib) reallocateMidiChannels(_midi_adlib); } - - return 0; } bool IMuseInternal::get_sound_active(int sound) const { diff --git a/engines/scumm/imuse/imuse.h b/engines/scumm/imuse/imuse.h index 35ccc931b5..513d27e8e9 100644 --- a/engines/scumm/imuse/imuse.h +++ b/engines/scumm/imuse/imuse.h @@ -24,6 +24,7 @@ #define SCUMM_IMUSE_H #include "common/scummsys.h" +#include "common/serializer.h" #include "common/mutex.h" #include "scumm/music.h" @@ -35,7 +36,6 @@ namespace Scumm { class IMuseInternal; class Player; class ScummEngine; -class Serializer; typedef void (*sysexfunc)(Player *, const byte *, uint16); @@ -62,7 +62,7 @@ public: public: virtual void on_timer(MidiDriver *midi) = 0; virtual void pause(bool paused) = 0; - virtual int save_or_load(Serializer *ser, ScummEngine *scumm, bool fixAfterLoad = true) = 0; + virtual void saveLoadWithSerializer(Common::Serializer &ser, ScummEngine *scumm, bool fixAfterLoad = true) = 0; virtual bool get_sound_active(int sound) const = 0; virtual int32 doCommand(int numargs, int args[]) = 0; virtual int clear_queue() = 0; diff --git a/engines/scumm/imuse/imuse_internal.h b/engines/scumm/imuse/imuse_internal.h index fed716e300..7b1d2f65fa 100644 --- a/engines/scumm/imuse/imuse_internal.h +++ b/engines/scumm/imuse/imuse_internal.h @@ -24,6 +24,7 @@ #define SCUMM_IMUSE_INTERNAL #include "common/scummsys.h" +#include "common/serializer.h" #include "scumm/imuse/imuse.h" #include "scumm/imuse/instrument.h" #include "scumm/saveload.h" @@ -153,7 +154,7 @@ struct CommandQueue { // ////////////////////////////////////////////////// -class Player : public MidiDriver_BASE { +class Player : public MidiDriver_BASE, public Common::Serializable { /* * External SysEx handler functions shall each be defined in * a separate file. This header file shall be included at the @@ -267,7 +268,7 @@ public: void onTimer(); void removePart(Part *part); int scan(uint totrack, uint tobeat, uint totick); - void saveLoadWithSerializer(Serializer *ser); + void saveLoadWithSerializer(Common::Serializer &ser); int setHook(byte cls, byte value, byte chan) { return _hook.set(cls, value, chan); } void setDetune(int detune); void setOffsetNote(int offset); @@ -295,7 +296,7 @@ public: // ////////////////////////////////////////////////// -struct Part : public Serializable { +struct Part : public Common::Serializable { IMuseInternal *_se; int _slot; Part *_next, *_prev; @@ -360,7 +361,7 @@ struct Part : public Serializable { Part(); - void saveLoadWithSerializer(Serializer *ser); + void saveLoadWithSerializer(Common::Serializer &ser); private: void sendPitchBend(); @@ -518,7 +519,7 @@ protected: public: // IMuse interface void pause(bool paused); - int save_or_load(Serializer *ser, ScummEngine *scumm, bool fixAfterLoad = true); + void saveLoadWithSerializer(Common::Serializer &ser, ScummEngine *scumm, bool fixAfterLoad = true); bool get_sound_active(int sound) const; int32 doCommand(int numargs, int args[]); uint32 property(int prop, uint32 value); diff --git a/engines/scumm/imuse/imuse_part.cpp b/engines/scumm/imuse/imuse_part.cpp index 937523d275..ca0eaa4630 100644 --- a/engines/scumm/imuse/imuse_part.cpp +++ b/engines/scumm/imuse/imuse_part.cpp @@ -66,48 +66,44 @@ Part::Part() { _unassigned_instrument = false; } -void Part::saveLoadWithSerializer(Serializer *ser) { - const SaveLoadEntry partEntries[] = { - 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() - }; - +void Part::saveLoadWithSerializer(Common::Serializer &ser) { int num; - if (ser->isSaving()) { + if (ser.isSaving()) { num = (_next ? (_next - _se->_parts + 1) : 0); - ser->saveUint16(num); + ser.syncAsUint16LE(num); num = (_prev ? (_prev - _se->_parts + 1) : 0); - ser->saveUint16(num); + ser.syncAsUint16LE(num); num = (_player ? (_player - _se->_players + 1) : 0); - ser->saveUint16(num); + ser.syncAsUint16LE(num); } else { - num = ser->loadUint16(); + ser.syncAsUint16LE(num); _next = (num ? &_se->_parts[num - 1] : 0); - num = ser->loadUint16(); + ser.syncAsUint16LE(num); _prev = (num ? &_se->_parts[num - 1] : 0); - num = ser->loadUint16(); + ser.syncAsUint16LE(num); _player = (num ? &_se->_players[num - 1] : 0); } - ser->saveLoadEntries(this, partEntries); + + ser.syncAsSint16LE(_pitchbend, VER(8)); + ser.syncAsByte(_pitchbend_factor, VER(8)); + ser.syncAsSByte(_transpose, VER(8)); + ser.syncAsByte(_vol, VER(8)); + ser.syncAsSByte(_detune, VER(8)); + ser.syncAsSByte(_pan, VER(8)); + ser.syncAsByte(_on, VER(8)); + ser.syncAsByte(_modwheel, VER(8)); + ser.syncAsByte(_pedal, VER(8)); + ser.skip(1, VER(8), VER(16)); // _program + ser.syncAsByte(_pri, VER(8)); + ser.syncAsByte(_chan, VER(8)); + ser.syncAsByte(_effect_level, VER(8)); + ser.syncAsByte(_chorus, VER(8)); + ser.syncAsByte(_percussion, VER(8)); + ser.syncAsByte(_bank, VER(8)); } void Part::set_detune(int8 detune) { diff --git a/engines/scumm/imuse/imuse_player.cpp b/engines/scumm/imuse/imuse_player.cpp index 33b38eec72..a4b79f75d3 100644 --- a/engines/scumm/imuse/imuse_player.cpp +++ b/engines/scumm/imuse/imuse_player.cpp @@ -1033,70 +1033,63 @@ void Player::metaEvent(byte type, byte *msg, uint16 len) { // //////////////////////////////////////// -void Player::saveLoadWithSerializer(Serializer *ser) { - static const SaveLoadEntry playerEntries[] = { - MKLINE(Player, _active, sleByte, VER(8)), - MKLINE(Player, _id, sleUint16, VER(8)), - MKLINE(Player, _priority, sleByte, VER(8)), - MKLINE(Player, _volume, sleByte, VER(8)), - MKLINE(Player, _pan, sleInt8, VER(8)), - MKLINE(Player, _transpose, sleByte, VER(8)), - MKLINE(Player, _detune, sleInt8, VER(8)), - MKLINE(Player, _vol_chan, sleUint16, VER(8)), - MKLINE(Player, _vol_eff, sleByte, VER(8)), - MKLINE(Player, _speed, sleByte, VER(8)), - MK_OBSOLETE(Player, _song_index, sleUint16, VER(8), VER(19)), - MKLINE(Player, _track_index, sleUint16, VER(8)), - MK_OBSOLETE(Player, _timer_counter, sleUint16, VER(8), VER(17)), - MKLINE(Player, _loop_to_beat, sleUint16, VER(8)), - MKLINE(Player, _loop_from_beat, sleUint16, VER(8)), - MKLINE(Player, _loop_counter, sleUint16, VER(8)), - MKLINE(Player, _loop_to_tick, sleUint16, VER(8)), - MKLINE(Player, _loop_from_tick, sleUint16, VER(8)), - MK_OBSOLETE(Player, _tempo, sleUint32, VER(8), VER(19)), - MK_OBSOLETE(Player, _cur_pos, sleUint32, VER(8), VER(17)), - MK_OBSOLETE(Player, _next_pos, sleUint32, VER(8), VER(17)), - MK_OBSOLETE(Player, _song_offset, sleUint32, VER(8), VER(17)), - MK_OBSOLETE(Player, _tick_index, sleUint16, VER(8), VER(17)), - MK_OBSOLETE(Player, _beat_index, sleUint16, VER(8), VER(17)), - MK_OBSOLETE(Player, _ticks_per_beat, sleUint16, VER(8), VER(17)), - MKLINE(Player, _music_tick, sleUint32, VER(19)), - MKLINE(Player, _hook._jump[0], sleByte, VER(8)), - MKLINE(Player, _hook._transpose, sleByte, VER(8)), - MKARRAY(Player, _hook._part_onoff[0], sleByte, 16, VER(8)), - MKARRAY(Player, _hook._part_volume[0], sleByte, 16, VER(8)), - MKARRAY(Player, _hook._part_program[0], sleByte, 16, VER(8)), - MKARRAY(Player, _hook._part_transpose[0], sleByte, 16, VER(8)), - MKEND() - }; - - const SaveLoadEntry parameterFaderEntries[] = { - MKLINE(ParameterFader, param, sleInt16, VER(17)), - MKLINE(ParameterFader, start, sleInt16, VER(17)), - MKLINE(ParameterFader, end, sleInt16, VER(17)), - MKLINE(ParameterFader, total_time, sleUint32, VER(17)), - MKLINE(ParameterFader, current_time, sleUint32, VER(17)), - MKEND() - }; - - if (!ser->isSaving() && _parser) { +static void syncWithSerializer(Common::Serializer &s, ParameterFader &pf) { + s.syncAsSint16LE(pf.param, VER(17)); + s.syncAsSint16LE(pf.start, VER(17)); + s.syncAsSint16LE(pf.end, VER(17)); + s.syncAsUint32LE(pf.total_time, VER(17)); + s.syncAsUint32LE(pf.current_time, VER(17)); +} + +void Player::saveLoadWithSerializer(Common::Serializer &s) { + if (!s.isSaving() && _parser) { delete _parser; _parser = 0; } _music_tick = _parser ? _parser->getTick() : 0; int num; - if (ser->isSaving()) { + if (s.isSaving()) { num = (_parts ? (_parts - _se->_parts + 1) : 0); - ser->saveUint16(num); + s.syncAsUint16LE(num); } else { - num = ser->loadUint16(); + s.syncAsUint16LE(num); _parts = (num ? &_se->_parts[num - 1] : 0); } - ser->saveLoadEntries(this, playerEntries); - ser->saveLoadArrayOf(_parameterFaders, ARRAYSIZE(_parameterFaders), - sizeof(ParameterFader), parameterFaderEntries); - return; + + s.syncAsByte(_active, VER(8)); + s.syncAsUint16LE(_id, VER(8)); + s.syncAsByte(_priority, VER(8)); + s.syncAsByte(_volume, VER(8)); + s.syncAsSByte(_pan, VER(8)); + s.syncAsByte(_transpose, VER(8)); + s.syncAsSByte(_detune, VER(8)); + s.syncAsUint16LE(_vol_chan, VER(8)); + s.syncAsByte(_vol_eff, VER(8)); + s.syncAsByte(_speed, VER(8)); + s.skip(2, VER(8), VER(19)); // _song_index + s.syncAsUint16LE(_track_index, VER(8)); + s.skip(2, VER(8), VER(17)); // _timer_counter + s.syncAsUint16LE(_loop_to_beat, VER(8)); + s.syncAsUint16LE(_loop_from_beat, VER(8)); + s.syncAsUint16LE(_loop_counter, VER(8)); + s.syncAsUint16LE(_loop_to_tick, VER(8)); + s.syncAsUint16LE(_loop_from_tick, VER(8)); + s.skip(4, VER(8), VER(19)); // _tempo + s.skip(4, VER(8), VER(17)); // _cur_pos + s.skip(4, VER(8), VER(17)); // _next_pos + s.skip(4, VER(8), VER(17)); // _song_offset + s.skip(2, VER(8), VER(17)); // _tick_index + s.skip(2, VER(8), VER(17)); // _beat_index + s.skip(2, VER(8), VER(17)); // _ticks_per_beat + s.syncAsUint32LE(_music_tick, VER(19)); + s.syncAsByte(_hook._jump[0], VER(8)); + s.syncAsByte(_hook._transpose, VER(8)); + s.syncBytes(_hook._part_onoff, 16, VER(8)); + s.syncBytes(_hook._part_volume, 16, VER(8)); + s.syncBytes(_hook._part_program, 16, VER(8)); + s.syncBytes(_hook._part_transpose, 16, VER(8)); + s.syncArray(_parameterFaders, ARRAYSIZE(_parameterFaders), syncWithSerializer); } } // End of namespace Scumm diff --git a/engines/scumm/imuse/instrument.cpp b/engines/scumm/imuse/instrument.cpp index 670b3647eb..708a98046b 100644 --- a/engines/scumm/imuse/instrument.cpp +++ b/engines/scumm/imuse/instrument.cpp @@ -20,7 +20,6 @@ * */ - #include "scumm/scumm.h" #include "scumm/saveload.h" #include "scumm/imuse/instrument.h" @@ -132,8 +131,8 @@ private: public: Instrument_Program(byte program, bool mt32); - Instrument_Program(Serializer *s); - void saveOrLoad(Serializer *s); + Instrument_Program(Common::Serializer &s); + void saveLoadWithSerializer(Common::Serializer &s); void send(MidiChannel *mc); void copy_to(Instrument *dest) { dest->program(_program, _mt32); } bool is_valid() { @@ -178,8 +177,8 @@ private: public: Instrument_AdLib(const byte *data); - Instrument_AdLib(Serializer *s); - void saveOrLoad(Serializer *s); + Instrument_AdLib(Common::Serializer &s); + void saveLoadWithSerializer(Common::Serializer &s); void send(MidiChannel *mc); void copy_to(Instrument *dest) { dest->adlib((byte *)&_instrument); } bool is_valid() { return true; } @@ -259,8 +258,8 @@ private: public: Instrument_Roland(const byte *data); - Instrument_Roland(Serializer *s); - void saveOrLoad(Serializer *s); + Instrument_Roland(Common::Serializer &s); + void saveLoadWithSerializer(Common::Serializer &s); void send(MidiChannel *mc); void copy_to(Instrument *dest) { dest->roland((byte *)&_instrument); } bool is_valid() { return (_native_mt32 ? true : (_instrument_name[0] != '\0')); } @@ -269,8 +268,8 @@ public: class Instrument_PcSpk : public InstrumentInternal { public: Instrument_PcSpk(const byte *data); - Instrument_PcSpk(Serializer *s); - void saveOrLoad(Serializer *s); + Instrument_PcSpk(Common::Serializer &s); + void saveLoadWithSerializer(Common::Serializer &s); void send(MidiChannel *mc); void copy_to(Instrument *dest) { dest->pcspk((byte *)&_instrument); } bool is_valid() { return true; } @@ -285,8 +284,8 @@ private: public: Instrument_MacSfx(byte program); - Instrument_MacSfx(Serializer *s); - void saveOrLoad(Serializer *s); + Instrument_MacSfx(Common::Serializer &s); + void saveLoadWithSerializer(Common::Serializer &s); void send(MidiChannel *mc); void copy_to(Instrument *dest) { dest->macSfx(_program); } bool is_valid() { @@ -350,14 +349,14 @@ void Instrument::macSfx(byte prog) { _instrument = new Instrument_MacSfx(prog); } -void Instrument::saveOrLoad(Serializer *s) { - if (s->isSaving()) { - s->saveByte(_type); +void Instrument::saveLoadWithSerializer(Common::Serializer &s) { + if (s.isSaving()) { + s.syncAsByte(_type); if (_instrument) - _instrument->saveOrLoad(s); + _instrument->saveLoadWithSerializer(s); } else { clear(); - _type = s->loadByte(); + s.syncAsByte(_type); switch (_type) { case itNone: break; @@ -396,20 +395,21 @@ Instrument_Program::Instrument_Program(byte program, bool mt32) : _program = 255; } -Instrument_Program::Instrument_Program(Serializer *s) { +Instrument_Program::Instrument_Program(Common::Serializer &s) { _program = 255; _mt32 = false; - if (!s->isSaving()) - saveOrLoad(s); + if (!s.isSaving()) + saveLoadWithSerializer(s); } -void Instrument_Program::saveOrLoad(Serializer *s) { - if (s->isSaving()) { - s->saveByte(_program); - s->saveByte(_mt32 ? 1 : 0); +void Instrument_Program::saveLoadWithSerializer(Common::Serializer &s) { + s.syncAsByte(_program); + if (s.isSaving()) { + s.syncAsByte(_mt32); } else { - _program = s->loadByte(); - _mt32 = (s->loadByte() > 0); + byte tmp; + s.syncAsByte(tmp); + _mt32 = (tmp > 0); } } @@ -434,18 +434,15 @@ Instrument_AdLib::Instrument_AdLib(const byte *data) { memcpy(&_instrument, data, sizeof(_instrument)); } -Instrument_AdLib::Instrument_AdLib(Serializer *s) { - if (!s->isSaving()) - saveOrLoad(s); +Instrument_AdLib::Instrument_AdLib(Common::Serializer &s) { + if (!s.isSaving()) + saveLoadWithSerializer(s); else memset(&_instrument, 0, sizeof(_instrument)); } -void Instrument_AdLib::saveOrLoad(Serializer *s) { - if (s->isSaving()) - s->saveBytes(&_instrument, sizeof(_instrument)); - else - s->loadBytes(&_instrument, sizeof(_instrument)); +void Instrument_AdLib::saveLoadWithSerializer(Common::Serializer &s) { + s.syncBytes((byte *)(&_instrument), sizeof(_instrument)); } void Instrument_AdLib::send(MidiChannel *mc) { @@ -468,26 +465,24 @@ Instrument_Roland::Instrument_Roland(const byte *data) { } } -Instrument_Roland::Instrument_Roland(Serializer *s) { +Instrument_Roland::Instrument_Roland(Common::Serializer &s) { _instrument_name[0] = '\0'; - if (!s->isSaving()) - saveOrLoad(s); + if (!s.isSaving()) + saveLoadWithSerializer(s); else memset(&_instrument, 0, sizeof(_instrument)); } -void Instrument_Roland::saveOrLoad(Serializer *s) { - if (s->isSaving()) { - s->saveBytes(&_instrument, sizeof(_instrument)); - } else { - s->loadBytes(&_instrument, sizeof(_instrument)); +void Instrument_Roland::saveLoadWithSerializer(Common::Serializer &s) { + s.syncBytes((byte *)(&_instrument), sizeof(_instrument)); + if (!s.isSaving()) { memcpy(&_instrument_name, &_instrument.common.name, sizeof(_instrument.common.name)); _instrument_name[10] = '\0'; if (!_native_mt32 && getEquivalentGM() >= 128) { debug(2, "MT-32 custom instrument \"%s\" not supported", _instrument_name); _instrument_name[0] = '\0'; } - } // end if + } } void Instrument_Roland::send(MidiChannel *mc) { @@ -538,18 +533,15 @@ Instrument_PcSpk::Instrument_PcSpk(const byte *data) { memcpy(_instrument, data, sizeof(_instrument)); } -Instrument_PcSpk::Instrument_PcSpk(Serializer *s) { - if (!s->isSaving()) - saveOrLoad(s); +Instrument_PcSpk::Instrument_PcSpk(Common::Serializer &s) { + if (!s.isSaving()) + saveLoadWithSerializer(s); else memset(_instrument, 0, sizeof(_instrument)); } -void Instrument_PcSpk::saveOrLoad(Serializer *s) { - if (s->isSaving()) - s->saveBytes(_instrument, sizeof(_instrument)); - else - s->loadBytes(_instrument, sizeof(_instrument)); +void Instrument_PcSpk::saveLoadWithSerializer(Common::Serializer &s) { + s.syncBytes(_instrument, sizeof(_instrument)); } void Instrument_PcSpk::send(MidiChannel *mc) { @@ -569,19 +561,15 @@ Instrument_MacSfx::Instrument_MacSfx(byte program) : } } -Instrument_MacSfx::Instrument_MacSfx(Serializer *s) { +Instrument_MacSfx::Instrument_MacSfx(Common::Serializer &s) { _program = 255; - if (!s->isSaving()) { - saveOrLoad(s); + if (!s.isSaving()) { + saveLoadWithSerializer(s); } } -void Instrument_MacSfx::saveOrLoad(Serializer *s) { - if (s->isSaving()) { - s->saveByte(_program); - } else { - _program = s->loadByte(); - } +void Instrument_MacSfx::saveLoadWithSerializer(Common::Serializer &s) { + s.syncAsByte(_program); } void Instrument_MacSfx::send(MidiChannel *mc) { diff --git a/engines/scumm/imuse/instrument.h b/engines/scumm/imuse/instrument.h index 47f556b40b..374b6352f1 100644 --- a/engines/scumm/imuse/instrument.h +++ b/engines/scumm/imuse/instrument.h @@ -25,24 +25,23 @@ #include "common/scummsys.h" +#include "common/serializer.h" class MidiChannel; namespace Scumm { -class Serializer; class Instrument; -class InstrumentInternal { +class InstrumentInternal : public Common::Serializable { public: virtual ~InstrumentInternal() {} - virtual void saveOrLoad(Serializer *s) = 0; virtual void send(MidiChannel *mc) = 0; virtual void copy_to(Instrument *dest) = 0; virtual bool is_valid() = 0; }; -class Instrument { +class Instrument : public Common::Serializable { private: byte _type; InstrumentInternal *_instrument; @@ -78,7 +77,7 @@ public: byte getType() { return _type; } bool isValid() { return (_instrument ? _instrument->is_valid() : false); } - void saveOrLoad(Serializer *s); + void saveLoadWithSerializer(Common::Serializer &s); void send(MidiChannel *mc) { if (_instrument) _instrument->send(mc); |