aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorMax Horn2011-03-21 15:42:17 +0100
committerMax Horn2011-03-22 23:51:47 +0100
commit8982fff1b79aa3cc53a5c328b283e0f102cb647f (patch)
tree01e3835be4fcdf9acbbea5e7878e0c6cfdb5b5fe /engines
parent92716d71edfe1b23482306e74a1d249c4f43bb0b (diff)
downloadscummvm-rg350-8982fff1b79aa3cc53a5c328b283e0f102cb647f.tar.gz
scummvm-rg350-8982fff1b79aa3cc53a5c328b283e0f102cb647f.tar.bz2
scummvm-rg350-8982fff1b79aa3cc53a5c328b283e0f102cb647f.zip
AUDIO: Add pure virtual MidiDriver::isOpen() method
This in turn enables modifying MidiDriver_MPU401::close() to allow it to be called on a midi driver that has not yet been opened. The specific issue that triggered me to make these changes was a crash-upon-quit in HUGO, caused by it instantiating a midi driver, then encountering an error (missing hugo.dat) *before* having opened the new midi driver; the general cleanup code then tries to close the (not yet opened) midi driver -> kaboom Also fixed some engines which were leaking MidiDriver instances.
Diffstat (limited to 'engines')
-rw-r--r--engines/agi/sound_midi.cpp4
-rw-r--r--engines/agi/sound_midi.h1
-rw-r--r--engines/agos/midi.cpp8
-rw-r--r--engines/agos/midi.h1
-rw-r--r--engines/draci/music.cpp8
-rw-r--r--engines/draci/music.h1
-rw-r--r--engines/groovie/music.cpp4
-rw-r--r--engines/groovie/music.h1
-rw-r--r--engines/hugo/sound.cpp4
-rw-r--r--engines/hugo/sound.h1
-rw-r--r--engines/kyra/sound_midi.cpp1
-rw-r--r--engines/lure/sound.cpp4
-rw-r--r--engines/lure/sound.h1
-rw-r--r--engines/m4/midi.cpp8
-rw-r--r--engines/m4/midi.h1
-rw-r--r--engines/made/music.cpp8
-rw-r--r--engines/made/music.h1
-rw-r--r--engines/parallaction/sound_br.cpp5
-rw-r--r--engines/parallaction/sound_ns.cpp5
-rw-r--r--engines/queen/music.cpp4
-rw-r--r--engines/queen/music.h1
-rw-r--r--engines/saga/music.cpp5
-rw-r--r--engines/saga/music.h1
-rw-r--r--engines/sci/sound/drivers/mididriver.h1
-rw-r--r--engines/scumm/imuse/imuse_internal.h1
-rw-r--r--engines/tinsel/music.cpp8
-rw-r--r--engines/tinsel/music.h1
-rw-r--r--engines/touche/midi.cpp4
-rw-r--r--engines/touche/midi.h1
29 files changed, 88 insertions, 6 deletions
diff --git a/engines/agi/sound_midi.cpp b/engines/agi/sound_midi.cpp
index 47cab0019f..050c0d6e2c 100644
--- a/engines/agi/sound_midi.cpp
+++ b/engines/agi/sound_midi.cpp
@@ -138,6 +138,10 @@ int SoundGenMIDI::open() {
return 0;
}
+bool SoundGenMIDI::isOpen() const {
+ return _driver && _driver->isOpen();
+}
+
void SoundGenMIDI::close() {
stop();
if (_driver)
diff --git a/engines/agi/sound_midi.h b/engines/agi/sound_midi.h
index 059d41208c..b7355a0d5d 100644
--- a/engines/agi/sound_midi.h
+++ b/engines/agi/sound_midi.h
@@ -72,6 +72,7 @@ public:
// MidiDriver interface implementation
int open();
+ bool isOpen() const;
void close();
void send(uint32 b);
diff --git a/engines/agos/midi.cpp b/engines/agos/midi.cpp
index fe2d1cd25b..e80b89d43c 100644
--- a/engines/agos/midi.cpp
+++ b/engines/agos/midi.cpp
@@ -85,11 +85,17 @@ int MidiPlayer::open() {
return 0;
}
+bool MidiPlayer::isOpen() const {
+ return _driver && _driver->isOpen();
+}
+
void MidiPlayer::close() {
stop();
// _system->lockMutex(_mutex);
- if (_driver)
+ if (_driver) {
+ delete _driver;
_driver->close();
+ }
_driver = NULL;
clearConstructs();
// _system->unlockMutex(_mutex);
diff --git a/engines/agos/midi.h b/engines/agos/midi.h
index 9c8303ba3c..c27c5a7973 100644
--- a/engines/agos/midi.h
+++ b/engines/agos/midi.h
@@ -115,6 +115,7 @@ public:
public:
// MidiDriver interface implementation
int open();
+ bool isOpen() const;
void close();
void send(uint32 b);
diff --git a/engines/draci/music.cpp b/engines/draci/music.cpp
index caa82c2cc0..cc1cd6d3fb 100644
--- a/engines/draci/music.cpp
+++ b/engines/draci/music.cpp
@@ -97,10 +97,16 @@ int MusicPlayer::open() {
return 0;
}
+bool MusicPlayer::isOpen() const {
+ return _driver && _driver->isOpen();
+}
+
void MusicPlayer::close() {
stop();
- if (_driver)
+ if (_driver) {
_driver->close();
+ delete _driver;
+ }
_driver = 0;
}
diff --git a/engines/draci/music.h b/engines/draci/music.h
index f6f3a5ae50..0d15fdaf1b 100644
--- a/engines/draci/music.h
+++ b/engines/draci/music.h
@@ -61,6 +61,7 @@ public:
// MidiDriver interface implementation
int open();
+ bool isOpen() const;
void close();
void send(uint32 b);
diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp
index 011409155c..7651576828 100644
--- a/engines/groovie/music.cpp
+++ b/engines/groovie/music.cpp
@@ -264,6 +264,10 @@ int MusicPlayerMidi::open() {
return 0;
}
+bool MusicPlayerMidi::isOpen() const {
+ return _driver && _driver->isOpen();
+}
+
void MusicPlayerMidi::close() {}
void MusicPlayerMidi::send(uint32 b) {
diff --git a/engines/groovie/music.h b/engines/groovie/music.h
index 5974559c53..e45e130a70 100644
--- a/engines/groovie/music.h
+++ b/engines/groovie/music.h
@@ -95,6 +95,7 @@ public:
// MidiDriver interface
virtual int open();
+ virtual bool isOpen() const;
virtual void close();
virtual void send(uint32 b);
virtual void metaEvent(byte type, byte *data, uint16 length);
diff --git a/engines/hugo/sound.cpp b/engines/hugo/sound.cpp
index 5ef843977f..c4feb5fb1c 100644
--- a/engines/hugo/sound.cpp
+++ b/engines/hugo/sound.cpp
@@ -192,6 +192,10 @@ int MidiPlayer::open() {
return 0;
}
+bool MidiPlayer::isOpen() const {
+ return _driver && _driver->isOpen();
+}
+
void MidiPlayer::close() {
stop();
_mutex.lock();
diff --git a/engines/hugo/sound.h b/engines/hugo/sound.h
index 49e78a4aeb..e5e9d94ebb 100644
--- a/engines/hugo/sound.h
+++ b/engines/hugo/sound.h
@@ -60,6 +60,7 @@ public:
// MidiDriver interface
int open();
+ bool isOpen() const;
MidiChannel *allocateChannel();
MidiChannel *getPercussionChannel();
diff --git a/engines/kyra/sound_midi.cpp b/engines/kyra/sound_midi.cpp
index cd5af12106..903375c362 100644
--- a/engines/kyra/sound_midi.cpp
+++ b/engines/kyra/sound_midi.cpp
@@ -55,6 +55,7 @@ public:
// DUMMY
int open() { return 0; }
+ bool isOpen() const { return true; }
void close() {}
MidiChannel *allocateChannel() { return 0; }
diff --git a/engines/lure/sound.cpp b/engines/lure/sound.cpp
index 5f954eb337..482527da13 100644
--- a/engines/lure/sound.cpp
+++ b/engines/lure/sound.cpp
@@ -694,6 +694,10 @@ int MidiMusic::open() {
return 0;
}
+bool MidiMusic::isOpen() const {
+ return _driver != 0;
+}
+
void MidiMusic::close() {
}
diff --git a/engines/lure/sound.h b/engines/lure/sound.h
index f50748ab0a..454bff26f4 100644
--- a/engines/lure/sound.h
+++ b/engines/lure/sound.h
@@ -86,6 +86,7 @@ public:
//MidiDriver interface implementation
int open();
+ bool isOpen() const;
void close();
void send(uint32 b);
void onTimer();
diff --git a/engines/m4/midi.cpp b/engines/m4/midi.cpp
index f130ddc3b5..3a6475da89 100644
--- a/engines/m4/midi.cpp
+++ b/engines/m4/midi.cpp
@@ -83,10 +83,16 @@ int MidiPlayer::open() {
return 0;
}
+bool MidiPlayer::isOpen() const {
+ return _driver && _driver->isOpen();
+}
+
void MidiPlayer::close() {
stopMusic();
- if (_driver)
+ if (_driver) {
_driver->close();
+ delete _driver;
+ }
_driver = 0;
}
diff --git a/engines/m4/midi.h b/engines/m4/midi.h
index 8344f8d485..a631cec2cb 100644
--- a/engines/m4/midi.h
+++ b/engines/m4/midi.h
@@ -54,6 +54,7 @@ public:
//MidiDriver interface implementation
int open();
+ bool isOpen() const;
void close();
void send(uint32 b);
diff --git a/engines/made/music.cpp b/engines/made/music.cpp
index 8c9248a262..5ace99788b 100644
--- a/engines/made/music.cpp
+++ b/engines/made/music.cpp
@@ -89,10 +89,16 @@ int MusicPlayer::open() {
return 0;
}
+bool MusicPlayer::isOpen() const {
+ return _driver && _driver->isOpen();
+}
+
void MusicPlayer::close() {
stop();
- if (_driver)
+ if (_driver) {
_driver->close();
+ delete _driver;
+ }
_driver = 0;
}
diff --git a/engines/made/music.h b/engines/made/music.h
index 9840c50cfa..024588ea4d 100644
--- a/engines/made/music.h
+++ b/engines/made/music.h
@@ -66,6 +66,7 @@ public:
//MidiDriver interface implementation
int open();
+ bool isOpen() const;
void close();
void send(uint32 b);
diff --git a/engines/parallaction/sound_br.cpp b/engines/parallaction/sound_br.cpp
index e127cf2838..5be953936d 100644
--- a/engines/parallaction/sound_br.cpp
+++ b/engines/parallaction/sound_br.cpp
@@ -222,6 +222,7 @@ public:
// MidiDriver interface
int open();
+ bool isOpen() const;
void close();
void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length);
@@ -342,6 +343,10 @@ int MidiPlayer_MSC::open() {
return ret;
}
+bool MidiPlayer_MSC::isOpen() const {
+ return _driver && _driver->isOpen();
+}
+
void MidiPlayer_MSC::close() {
stop();
_mutex.lock();
diff --git a/engines/parallaction/sound_ns.cpp b/engines/parallaction/sound_ns.cpp
index 15fdede571..de8a861d4b 100644
--- a/engines/parallaction/sound_ns.cpp
+++ b/engines/parallaction/sound_ns.cpp
@@ -59,6 +59,7 @@ public:
// MidiDriver interface
int open();
+ bool isOpen() const;
void close();
void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length);
@@ -178,6 +179,10 @@ int MidiPlayer::open() {
return ret;
}
+bool MidiPlayer::isOpen() const {
+ return _driver && _driver->isOpen();
+}
+
void MidiPlayer::close() {
stop();
_mutex.lock();
diff --git a/engines/queen/music.cpp b/engines/queen/music.cpp
index 4dc698dac9..044717878b 100644
--- a/engines/queen/music.cpp
+++ b/engines/queen/music.cpp
@@ -78,8 +78,10 @@ MidiMusic::MidiMusic(QueenEngine *vm)
_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
}
}
+ assert(_driver);
- _driver->open();
+ int ret = _driver->open();
+ assert(ret == 0);
_driver->setTimerCallback(this, &timerCallback);
if (_nativeMT32)
diff --git a/engines/queen/music.h b/engines/queen/music.h
index fe45d56fde..50f7b3d255 100644
--- a/engines/queen/music.h
+++ b/engines/queen/music.h
@@ -58,6 +58,7 @@ public:
//MidiDriver interface implementation
int open() { return 0; }
+ bool isOpen() const { return true; }
void close() {}
void send(uint32 b);
diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp
index f801001d88..3e1f3e3f3d 100644
--- a/engines/saga/music.cpp
+++ b/engines/saga/music.cpp
@@ -50,6 +50,7 @@ MusicDriver::MusicDriver() : _isGM(false) {
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
_driver = MidiDriver::createMidi(dev);
+ assert(_driver);
_driverType = MidiDriver::getMusicType(dev);
if (isMT32())
_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
@@ -75,6 +76,10 @@ int MusicDriver::open() {
return 0;
}
+bool MusicDriver::isOpen() const {
+ return _driver->isOpen();
+}
+
void MusicDriver::setVolume(int volume) {
volume = CLIP(volume, 0, 255);
diff --git a/engines/saga/music.h b/engines/saga/music.h
index 7d599d91c2..22d957eb06 100644
--- a/engines/saga/music.h
+++ b/engines/saga/music.h
@@ -58,6 +58,7 @@ public:
//MidiDriver interface implementation
int open();
+ bool isOpen() const;
void close() { _driver->close(); }
void send(uint32 b);
diff --git a/engines/sci/sound/drivers/mididriver.h b/engines/sci/sound/drivers/mididriver.h
index f745d62716..5cecebd325 100644
--- a/engines/sci/sound/drivers/mididriver.h
+++ b/engines/sci/sound/drivers/mididriver.h
@@ -89,6 +89,7 @@ public:
return open(resMan);
}
virtual int open(ResourceManager *resMan) { return _driver->open(); }
+ bool isOpen() const { return _driver->isOpen(); }
virtual void close() { _driver->close(); }
virtual void send(uint32 b) { _driver->send(b); }
uint32 getBaseTempo() { return _driver->getBaseTempo(); }
diff --git a/engines/scumm/imuse/imuse_internal.h b/engines/scumm/imuse/imuse_internal.h
index 0014480894..3a6470f832 100644
--- a/engines/scumm/imuse/imuse_internal.h
+++ b/engines/scumm/imuse/imuse_internal.h
@@ -284,6 +284,7 @@ public:
public:
// MidiDriver interface
int open() { return 0; }
+ bool isOpen() const { return true; }
void close() { }
void send(uint32 b);
const char *getErrorName(int error_code) { return "Unknown"; }
diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp
index 7461cfca72..fb0f6b94fb 100644
--- a/engines/tinsel/music.cpp
+++ b/engines/tinsel/music.cpp
@@ -432,10 +432,16 @@ int MidiMusicPlayer::open() {
return 0;
}
+bool MidiMusicPlayer::isOpen() const {
+ return _driver && _driver->isOpen();
+}
+
void MidiMusicPlayer::close() {
stop();
- if (_driver)
+ if (_driver) {
_driver->close();
+ delete _driver;
+ }
_driver = 0;
}
diff --git a/engines/tinsel/music.h b/engines/tinsel/music.h
index e2a3b4c2c1..5545200c59 100644
--- a/engines/tinsel/music.h
+++ b/engines/tinsel/music.h
@@ -80,6 +80,7 @@ public:
//MidiDriver interface implementation
int open();
+ bool isOpen() const;
void close();
void send(uint32 b);
diff --git a/engines/touche/midi.cpp b/engines/touche/midi.cpp
index 0b15643767..c420fb34ff 100644
--- a/engines/touche/midi.cpp
+++ b/engines/touche/midi.cpp
@@ -110,6 +110,10 @@ int MidiPlayer::open() {
return ret;
}
+bool MidiPlayer::isOpen() const {
+ return _driver && _driver->isOpen();
+}
+
void MidiPlayer::close() {
stop();
_mutex.lock();
diff --git a/engines/touche/midi.h b/engines/touche/midi.h
index 8e43c12037..75f33269a7 100644
--- a/engines/touche/midi.h
+++ b/engines/touche/midi.h
@@ -59,6 +59,7 @@ public:
// MidiDriver interface
int open();
+ bool isOpen() const;
void close();
void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length);