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/hugo | |
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/hugo')
-rw-r--r-- | engines/hugo/sound.cpp | 81 | ||||
-rw-r--r-- | engines/hugo/sound.h | 8 |
2 files changed, 21 insertions, 68 deletions
diff --git a/engines/hugo/sound.cpp b/engines/hugo/sound.cpp index f0a08829ed..24359a2c54 100644 --- a/engines/hugo/sound.cpp +++ b/engines/hugo/sound.cpp @@ -47,61 +47,46 @@ namespace Hugo { -MidiPlayer::MidiPlayer() - : _midiData(0) { - +MidiPlayer::MidiPlayer() { MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); _driver = MidiDriver::createMidi(dev); assert(_driver); _paused = false; -} -MidiPlayer::~MidiPlayer() { - stop(); - Common::StackLock lock(_mutex); - _driver->setTimerCallback(0, 0); - _driver->close(); - delete _driver; - _driver = 0; - if (_parser) - _parser->setMidiDriver(0); - delete _parser; + int ret = _driver->open(); + if (ret == 0) { + _driver->sendGMReset(); + + _driver->setTimerCallback(this, &timerCallback); + } } void MidiPlayer::play(uint8 *stream, uint16 size) { debugC(3, kDebugMusic, "MidiPlayer::play"); - if (!stream) { - stop(); - return; - } + + Common::StackLock lock(_mutex); stop(); + if (!stream) + return; + _midiData = (uint8 *)malloc(size); if (_midiData) { memcpy(_midiData, stream, size); - Common::StackLock lock(_mutex); syncVolume(); // FIXME: syncVolume calls setVolume which in turn also locks the mutex! ugh + + _parser = MidiParser::createParser_SMF(); _parser->loadMusic(_midiData, size); _parser->setTrack(0); + _parser->setMidiDriver(this); + _parser->setTimerRate(_driver->getBaseTempo()); _isLooping = false; _isPlaying = true; } } -void MidiPlayer::stop() { - debugC(3, kDebugMusic, "MidiPlayer::stop"); - - Common::StackLock lock(_mutex); - if (_isPlaying) { - _isPlaying = false; - _parser->unloadMusic(); - free(_midiData); - _midiData = 0; - } -} - void MidiPlayer::pause(bool p) { _paused = p; @@ -112,34 +97,14 @@ void MidiPlayer::pause(bool p) { } } -void MidiPlayer::updateTimer() { - if (_paused) { - return; - } - +void MidiPlayer::onTimer() { Common::StackLock lock(_mutex); - if (_isPlaying) { + + if (!_paused && _isPlaying && _parser) { _parser->onTimer(); } } -int MidiPlayer::open() { - if (!_driver) - return 255; - int ret = _driver->open(); - if (ret) - return ret; - - _driver->sendGMReset(); - - _parser = MidiParser::createParser_SMF(); - _parser->setMidiDriver(this); - _parser->setTimerRate(_driver->getBaseTempo()); - _driver->setTimerCallback(this, &timerCallback); - - return 0; -} - void MidiPlayer::sendToChannel(byte channel, uint32 b) { if (!_channelsTable[channel]) { _channelsTable[channel] = (channel == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel(); @@ -154,12 +119,6 @@ void MidiPlayer::sendToChannel(byte channel, uint32 b) { } -void MidiPlayer::timerCallback(void *p) { - MidiPlayer *player = (MidiPlayer *)p; - - player->updateTimer(); -} - SoundHandler::SoundHandler(HugoEngine *vm) : _vm(vm) { _midiPlayer = new MidiPlayer(); _speakerStream = new Audio::PCSpeaker(_vm->_mixer->getOutputRate()); @@ -263,7 +222,7 @@ void SoundHandler::playSound(int16 sound, const byte priority) { * Initialize for MCI sound and midi */ void SoundHandler::initSound() { - _midiPlayer->open(); + //_midiPlayer->open(); } void SoundHandler::syncVolume() { diff --git a/engines/hugo/sound.h b/engines/hugo/sound.h index f3a141ac1e..d5f51704aa 100644 --- a/engines/hugo/sound.h +++ b/engines/hugo/sound.h @@ -42,23 +42,17 @@ namespace Hugo { class MidiPlayer : public Audio::MidiPlayer { public: MidiPlayer(); - ~MidiPlayer(); void pause(bool p); void play(uint8 *stream, uint16 size); - void stop(); - void updateTimer(); - int open(); uint32 getBaseTempo(); // Overload Audio::MidiPlayer method virtual void sendToChannel(byte channel, uint32 b); + virtual void onTimer(); private: - static void timerCallback(void *p); - - uint8 *_midiData; bool _paused; }; |