diff options
| author | Max Horn | 2011-03-23 16:14:39 +0100 |
|---|---|---|
| committer | Max Horn | 2011-03-23 16:49:41 +0100 |
| commit | e70fd59b3505619cccb6f3280a4cf0fb57aefa97 (patch) | |
| tree | 055c9719a41c4706baa4e5c4837e5fd31da95486 /engines/parallaction | |
| parent | 29847ea42da3e597d3496972c80ce49bea76da20 (diff) | |
| download | scummvm-rg350-e70fd59b3505619cccb6f3280a4cf0fb57aefa97.tar.gz scummvm-rg350-e70fd59b3505619cccb6f3280a4cf0fb57aefa97.tar.bz2 scummvm-rg350-e70fd59b3505619cccb6f3280a4cf0fb57aefa97.zip | |
ENGINES: Further simplify pseudo MidiDrivers; fix some regressions
The regression affected AGOS and maybe some others; specifically,
the real MidiDriver would have been deleted twice -- I previously
missed that the Engine instances takes care of freeing the real
MidiDriver, not the MidiPlayer wrapping it.
This commit should clarify the ownership of the real MidiDriver for
most pseudo MidiDrivers.
Diffstat (limited to 'engines/parallaction')
| -rw-r--r-- | engines/parallaction/sound_br.cpp | 49 | ||||
| -rw-r--r-- | engines/parallaction/sound_ns.cpp | 49 |
2 files changed, 38 insertions, 60 deletions
diff --git a/engines/parallaction/sound_br.cpp b/engines/parallaction/sound_br.cpp index b74a584b2c..c80f96b4bc 100644 --- a/engines/parallaction/sound_br.cpp +++ b/engines/parallaction/sound_br.cpp @@ -220,11 +220,9 @@ public: int getVolume() const { return _masterVolume; } void setLooping(bool loop) { _isLooping = loop; } - // MidiDriver interface - int open(); - void close(); - void send(uint32 b); - void metaEvent(byte type, byte *data, uint16 length); + // MidiDriver_BASE interface + virtual void send(uint32 b); + virtual void metaEvent(byte type, byte *data, uint16 length); private: @@ -254,11 +252,25 @@ MidiPlayer_MSC::MidiPlayer_MSC(MidiDriver *driver) _volume[i] = 127; } - open(); + int ret = _driver->open(); + if (ret == 0) { + _parser = createParser_MSC(); + _parser->setMidiDriver(this); + _parser->setTimerRate(_driver->getBaseTempo()); + _driver->setTimerCallback(this, &timerCallback); + } } MidiPlayer_MSC::~MidiPlayer_MSC() { - close(); + stop(); + + Common::StackLock lock(_mutex); + _driver->setTimerCallback(NULL, NULL); + _driver->close(); + delete _driver; + _driver = 0; + _parser->setMidiDriver(NULL); + delete _parser; } void MidiPlayer_MSC::play(Common::SeekableReadStream *stream) { @@ -326,29 +338,6 @@ void MidiPlayer_MSC::setVolumeInternal(int volume) { } } -int MidiPlayer_MSC::open() { - int ret = _driver->open(); - if (ret == 0) { - _parser = createParser_MSC(); - _parser->setMidiDriver(this); - _parser->setTimerRate(_driver->getBaseTempo()); - _driver->setTimerCallback(this, &timerCallback); - } - return ret; -} - -void MidiPlayer_MSC::close() { - stop(); - - Common::StackLock lock(_mutex); - _driver->setTimerCallback(NULL, NULL); - _driver->close(); - delete _driver; - _driver = 0; - _parser->setMidiDriver(NULL); - delete _parser; -} - void MidiPlayer_MSC::send(uint32 b) { const byte ch = b & 0x0F; byte param2 = (b >> 16) & 0xFF; diff --git a/engines/parallaction/sound_ns.cpp b/engines/parallaction/sound_ns.cpp index 6d80b5dbc1..f92436497b 100644 --- a/engines/parallaction/sound_ns.cpp +++ b/engines/parallaction/sound_ns.cpp @@ -57,11 +57,9 @@ public: int getVolume() const { return _masterVolume; } void setLooping(bool loop) { _isLooping = loop; } - // MidiDriver interface - int open(); - void close(); - void send(uint32 b); - void metaEvent(byte type, byte *data, uint16 length); + // MidiDriver_BASE interface + virtual void send(uint32 b); + virtual void metaEvent(byte type, byte *data, uint16 length); private: @@ -87,11 +85,25 @@ MidiPlayer::MidiPlayer(MidiDriver *driver) _channelsVolume[i] = 127; } - open(); + int ret = _driver->open(); + if (ret == 0) { + _parser = MidiParser::createParser_SMF(); + _parser->setMidiDriver(this); + _parser->setTimerRate(_driver->getBaseTempo()); + _driver->setTimerCallback(this, &timerCallback); + } } MidiPlayer::~MidiPlayer() { - close(); + stop(); + + Common::StackLock lock(_mutex); + _driver->setTimerCallback(NULL, NULL); + _driver->close(); + delete _driver; + _driver = 0; + _parser->setMidiDriver(NULL); + delete _parser; } void MidiPlayer::play(Common::SeekableReadStream *stream) { @@ -161,29 +173,6 @@ void MidiPlayer::setVolume(int volume) { } } -int MidiPlayer::open() { - int ret = _driver->open(); - if (ret == 0) { - _parser = MidiParser::createParser_SMF(); - _parser->setMidiDriver(this); - _parser->setTimerRate(_driver->getBaseTempo()); - _driver->setTimerCallback(this, &timerCallback); - } - return ret; -} - -void MidiPlayer::close() { - stop(); - - Common::StackLock lock(_mutex); - _driver->setTimerCallback(NULL, NULL); - _driver->close(); - delete _driver; - _driver = 0; - _parser->setMidiDriver(NULL); - delete _parser; -} - void MidiPlayer::send(uint32 b) { byte volume, ch = (byte)(b & 0xF); switch (b & 0xFFF0) { |
