diff options
author | Max Horn | 2011-03-25 14:10:02 +0100 |
---|---|---|
committer | Max Horn | 2011-03-25 14:15:53 +0100 |
commit | 7949d7c6def2df6f3d44db4f55e9d1d3a87a0412 (patch) | |
tree | 85af1d8a79db595115afe67bd1fa0b216509bb8d /engines/made | |
parent | db3802b02140d80e1a4e8ead91c1b7e39ee940c5 (diff) | |
download | scummvm-rg350-7949d7c6def2df6f3d44db4f55e9d1d3a87a0412.tar.gz scummvm-rg350-7949d7c6def2df6f3d44db4f55e9d1d3a87a0412.tar.bz2 scummvm-rg350-7949d7c6def2df6f3d44db4f55e9d1d3a87a0412.zip |
AUDIO: Move more common code to Audio::MidiPlayer
This also should fix some regressions from the previous
commits, related to MidiParser's either being leaked,
or being deleted and then used again (i.e., crashing).
I tested as many games as I had available, but further
testing of all affected engines is called for anyway.
Diffstat (limited to 'engines/made')
-rw-r--r-- | engines/made/music.cpp | 43 | ||||
-rw-r--r-- | engines/made/music.h | 7 |
2 files changed, 13 insertions, 37 deletions
diff --git a/engines/made/music.cpp b/engines/made/music.cpp index 054f8126d6..c8b13ba210 100644 --- a/engines/made/music.cpp +++ b/engines/made/music.cpp @@ -47,9 +47,6 @@ MusicPlayer::MusicPlayer() : _isGM(false) { if (_nativeMT32) _driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); - _xmidiParser = MidiParser::createParser_XMIDI(); - _smfParser = MidiParser::createParser_SMF(); - int ret = _driver->open(); if (ret == 0) { if (_nativeMT32) @@ -57,22 +54,8 @@ MusicPlayer::MusicPlayer() : _isGM(false) { else _driver->sendGMReset(); - _driver->setTimerCallback(this, &onTimer); - } -} - -MusicPlayer::~MusicPlayer() { - _driver->setTimerCallback(NULL, NULL); - stop(); - if (_driver) { - _driver->close(); - delete _driver; - _driver = 0; + _driver->setTimerCallback(this, &timerCallback); } - _xmidiParser->setMidiDriver(NULL); - _smfParser->setMidiDriver(NULL); - delete _xmidiParser; - delete _smfParser; } void MusicPlayer::send(uint32 b) { @@ -83,15 +66,9 @@ void MusicPlayer::send(uint32 b) { Audio::MidiPlayer::send(b); } -void MusicPlayer::onTimer(void *refCon) { - MusicPlayer *music = (MusicPlayer *)refCon; - Common::StackLock lock(music->_mutex); - - if (music->_isPlaying) - music->_parser->onTimer(); -} - void MusicPlayer::playXMIDI(GenericResource *midiResource, MusicFlags flags) { + Common::StackLock lock(_mutex); + if (_isPlaying) return; @@ -101,8 +78,8 @@ void MusicPlayer::playXMIDI(GenericResource *midiResource, MusicFlags flags) { _isGM = true; - if (_xmidiParser->loadMusic(midiResource->getData(), midiResource->getSize())) { - MidiParser *parser = _xmidiParser; + MidiParser *parser = MidiParser::createParser_XMIDI(); + if (parser->loadMusic(midiResource->getData(), midiResource->getSize())) { parser->setTrack(0); parser->setMidiDriver(this); parser->setTimerRate(_driver->getBaseTempo()); @@ -115,10 +92,14 @@ void MusicPlayer::playXMIDI(GenericResource *midiResource, MusicFlags flags) { _isLooping = flags & MUSIC_LOOP; _isPlaying = true; + } else { + delete parser; } } void MusicPlayer::playSMF(GenericResource *midiResource, MusicFlags flags) { + Common::StackLock lock(_mutex); + if (_isPlaying) return; @@ -128,8 +109,8 @@ void MusicPlayer::playSMF(GenericResource *midiResource, MusicFlags flags) { _isGM = true; - if (_smfParser->loadMusic(midiResource->getData(), midiResource->getSize())) { - MidiParser *parser = _smfParser; + MidiParser *parser = MidiParser::createParser_SMF(); + if (parser->loadMusic(midiResource->getData(), midiResource->getSize())) { parser->setTrack(0); parser->setMidiDriver(this); parser->setTimerRate(_driver->getBaseTempo()); @@ -141,6 +122,8 @@ void MusicPlayer::playSMF(GenericResource *midiResource, MusicFlags flags) { _isLooping = flags & MUSIC_LOOP; _isPlaying = true; + } else { + delete parser; } } diff --git a/engines/made/music.h b/engines/made/music.h index 8925440b75..f8f70cdad6 100644 --- a/engines/made/music.h +++ b/engines/made/music.h @@ -44,7 +44,6 @@ enum MusicFlags { class MusicPlayer : public Audio::MidiPlayer { public: MusicPlayer(); - ~MusicPlayer(); void playXMIDI(GenericResource *midiResource, MusicFlags flags = MUSIC_NORMAL); void playSMF(GenericResource *midiResource, MusicFlags flags = MUSIC_NORMAL); @@ -52,16 +51,10 @@ public: void pause(); void resume(); - void setGM(bool isGM) { _isGM = isGM; } - // MidiDriver_BASE interface implementation virtual void send(uint32 b); protected: - - static void onTimer(void *data); - - MidiParser *_xmidiParser, *_smfParser; bool _isGM; }; |