aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/imuse.cpp84
-rw-r--r--scumm/imuse.h54
2 files changed, 70 insertions, 68 deletions
diff --git a/scumm/imuse.cpp b/scumm/imuse.cpp
index b1ddb67081..ceca85fbeb 100644
--- a/scumm/imuse.cpp
+++ b/scumm/imuse.cpp
@@ -50,40 +50,6 @@
// they will only be used from this file, so it will reduce
// compile time.
-// IMuseMonitor serves as a front-end to IMuseInternal and
-// ensures that only one thread accesses the object at a time.
-// This is necessary to prevent scripts and the MIDI parser
-// from yanking objects out from underneath each other.
-class IMuseMonitor : public IMuse {
-private:
- OSystem *_system;
- IMuse *_target;
- void *_mutex;
-
- void in() { _system->lock_mutex (_mutex); }
- void out() { _system->unlock_mutex (_mutex); }
-public:
- IMuseMonitor (OSystem *system, IMuse *target) : _system (system), _target (target) { _mutex = system->create_mutex(); }
- virtual ~IMuseMonitor() { _system->delete_mutex (_mutex); };
-
- void on_timer() { in(); _target->on_timer(); out(); }
- void pause(bool paused) { in(); _target->pause (paused); out(); }
- int save_or_load(Serializer *ser, Scumm *scumm) { in(); int ret = _target->save_or_load (ser, scumm); out(); return ret; }
- int set_music_volume(uint vol) { in(); int ret = _target->set_music_volume (vol); out(); return ret; }
- int get_music_volume() { in(); int ret = _target->get_music_volume(); out(); return ret; }
- int set_master_volume(uint vol) { in(); int ret = _target->set_master_volume (vol); out(); return ret; }
- int get_master_volume() { in(); int ret = _target->get_master_volume(); out(); return ret; }
- bool start_sound(int sound) { in(); bool ret = _target->start_sound (sound); out(); return ret; }
- int stop_sound(int sound) { in(); int ret = _target->stop_sound (sound); out(); return ret; }
- int stop_all_sounds() { in(); int ret = _target->stop_all_sounds(); out(); return ret; }
- int get_sound_status(int sound) { in(); int ret = _target->get_sound_status (sound); out(); return ret; }
- bool get_sound_active(int sound) { in(); bool ret = _target->get_sound_active (sound); out(); return ret; }
- int32 do_command(int a, int b, int c, int d, int e, int f, int g, int h) { in(); int32 ret = _target->do_command (a,b,c,d,e,f,g,h); out(); return ret; }
- int clear_queue() { in(); int ret = _target->clear_queue(); out(); return ret; }
- void setBase(byte **base) { in(); _target->setBase (base); out(); }
- uint32 property(int prop, uint32 value) { in(); uint32 ret = _target->property (prop, value); out(); return ret; }
-};
-
class IMuseDriver;
struct Part;
@@ -385,8 +351,9 @@ public:
// WARNING: This is the internal variant of the IMUSE class.
// imuse.h contains a public version of the same class.
// the public version, only contains a set of methods.
-class IMuseInternal : public IMuse {
+class IMuseInternal {
friend struct Player;
+
private:
IMuseDriver * _driver;
@@ -396,7 +363,6 @@ private:
byte _hardware_type;
private:
-
bool _paused;
bool _active_volume_faders;
bool _initialized;
@@ -413,11 +379,11 @@ private:
byte _queue_marker;
byte _queue_cleared;
- byte _master_volume; // Master volume. 0-255
- byte _music_volume; // Global music volume. 0-255
+ byte _master_volume; // Master volume. 0-255
+ byte _music_volume; // Global music volume. 0-255
uint16 _trigger_count;
- ImTrigger _snm_triggers[16]; // Sam & Max triggers
+ ImTrigger _snm_triggers[16]; // Sam & Max triggers
uint16 _snm_trigger_index;
uint16 _channel_volume[8];
@@ -3778,15 +3744,49 @@ void IMuseDriver::part_off(Part *part)
+////////////////////////////////////////////////////////////
+//
+// IMuse implementation
+//
+// IMuse actually serves as a concurency monitor front-end
+// to IMuseInternal and ensures that only one thread
+// accesses the object at a time. This is necessary to
+// prevent scripts and the MIDI parser from yanking objects
+// out from underneath each other.
+//
+////////////////////////////////////////////////////////////
+
+IMuse::IMuse (OSystem *system, IMuseInternal *target) : _system (system), _target (target) { _mutex = system->create_mutex(); }
+IMuse::~IMuse() { if (_mutex) _system->delete_mutex (_mutex); if (_target) delete _target; }
+inline void IMuse::in() { _system->lock_mutex (_mutex); }
+inline void IMuse::out() { _system->unlock_mutex (_mutex); }
+
+void IMuse::on_timer() { in(); _target->on_timer(); out(); }
+void IMuse::pause(bool paused) { in(); _target->pause (paused); out(); }
+int IMuse::save_or_load(Serializer *ser, Scumm *scumm) { in(); int ret = _target->save_or_load (ser, scumm); out(); return ret; }
+int IMuse::set_music_volume(uint vol) { in(); int ret = _target->set_music_volume (vol); out(); return ret; }
+int IMuse::get_music_volume() { in(); int ret = _target->get_music_volume(); out(); return ret; }
+int IMuse::set_master_volume(uint vol) { in(); int ret = _target->set_master_volume (vol); out(); return ret; }
+int IMuse::get_master_volume() { in(); int ret = _target->get_master_volume(); out(); return ret; }
+bool IMuse::start_sound(int sound) { in(); bool ret = _target->start_sound (sound); out(); return ret; }
+int IMuse::stop_sound(int sound) { in(); int ret = _target->stop_sound (sound); out(); return ret; }
+int IMuse::stop_all_sounds() { in(); int ret = _target->stop_all_sounds(); out(); return ret; }
+int IMuse::get_sound_status(int sound) { in(); int ret = _target->get_sound_status (sound); out(); return ret; }
+bool IMuse::get_sound_active(int sound) { in(); bool ret = _target->get_sound_active (sound); out(); return ret; }
+int32 IMuse::do_command(int a, int b, int c, int d, int e, int f, int g, int h) { in(); int32 ret = _target->do_command (a,b,c,d,e,f,g,h); out(); return ret; }
+int IMuse::clear_queue() { in(); int ret = _target->clear_queue(); out(); return ret; }
+void IMuse::setBase(byte **base) { in(); _target->setBase (base); out(); }
+uint32 IMuse::property(int prop, uint32 value) { in(); uint32 ret = _target->property (prop, value); out(); return ret; }
+
// The IMuse::create method provides a front-end factory
// for creating IMuseInternal without exposing that class
// to the client.
-IMuse *IMuse::create(OSystem *syst, MidiDriver *midi, SoundMixer *mixer)
+IMuse *IMuse::create (OSystem *syst, MidiDriver *midi, SoundMixer *mixer)
{
- IMuse *engine = (IMuse *) IMuseInternal::create (syst, midi, mixer);
+ IMuseInternal *engine = IMuseInternal::create (syst, midi, mixer);
if (midi)
midi->property (MidiDriver::PROP_SMALLHEADER, (g_scumm->_features & GF_SMALL_HEADER) ? 1 : 0);
- return (IMuse *) new IMuseMonitor (syst, engine);
+ return new IMuse (syst, engine);
}
diff --git a/scumm/imuse.h b/scumm/imuse.h
index 0e9c8fc4f1..b3c5c92def 100644
--- a/scumm/imuse.h
+++ b/scumm/imuse.h
@@ -31,40 +31,42 @@ class Serializer;
class SoundMixer;
class IMuse {
+private:
+ OSystem *_system;
+ IMuseInternal *_target;
+ void *_mutex;
+
+ IMuse (OSystem *system, IMuseInternal *target);
+ void in();
+ void out();
+
public:
+ ~IMuse();
+
enum {
PROP_TEMPO_BASE = 1,
};
- IMuse() { }
- virtual ~IMuse() { };
-
- virtual void on_timer() = 0; // For the MacOS 9 port only
- virtual void pause(bool paused) = 0;
- virtual int save_or_load(Serializer *ser, Scumm *scumm) = 0;
- virtual int set_music_volume(uint vol) = 0;
- virtual int get_music_volume() = 0;
- virtual int set_master_volume(uint vol) = 0;
- virtual int get_master_volume() = 0;
- virtual bool start_sound(int sound) = 0;
- virtual int stop_sound(int sound) = 0;
- virtual int stop_all_sounds() = 0;
- virtual int get_sound_status(int sound) = 0;
- virtual bool get_sound_active(int sound) = 0;
- virtual int32 do_command(int a, int b, int c, int d, int e, int f, int g, int h) = 0;
- virtual int clear_queue() = 0;
- virtual void setBase(byte **base) = 0;
- virtual uint32 property(int prop, uint32 value) = 0;
+ void on_timer();
+ void pause(bool paused);
+ int save_or_load(Serializer *ser, Scumm *scumm);
+ int set_music_volume(uint vol);
+ int get_music_volume();
+ int set_master_volume(uint vol);
+ int get_master_volume();
+ bool start_sound(int sound);
+ int stop_sound(int sound);
+ int stop_all_sounds();
+ int get_sound_status(int sound);
+ bool get_sound_active(int sound);
+ int32 do_command(int a, int b, int c, int d, int e, int f, int g, int h);
+ int clear_queue();
+ void setBase(byte **base);
+ uint32 property(int prop, uint32 value);
// Factory methods
static IMuse *create(OSystem *syst, MidiDriver *midi, SoundMixer *mixer);
-
- static IMuse *create_adlib(OSystem *syst, SoundMixer *mixer) {
- return create(syst, NULL, mixer);
- }
- static IMuse *create_midi(OSystem *syst, MidiDriver *midi) {
- return create(syst, midi, NULL);
- }
+ static IMuse *create_midi(OSystem *syst, MidiDriver *midi) { return create(syst, midi, NULL); }
};
#define MAX_DIGITAL_CHANNELS 8