aboutsummaryrefslogtreecommitdiff
path: root/engines/scumm/imuse
diff options
context:
space:
mode:
Diffstat (limited to 'engines/scumm/imuse')
-rw-r--r--engines/scumm/imuse/imuse.cpp85
-rw-r--r--engines/scumm/imuse/imuse.h4
-rw-r--r--engines/scumm/imuse/imuse_internal.h11
-rw-r--r--engines/scumm/imuse/imuse_part.cpp54
-rw-r--r--engines/scumm/imuse/imuse_player.cpp101
-rw-r--r--engines/scumm/imuse/instrument.cpp106
-rw-r--r--engines/scumm/imuse/instrument.h9
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);