diff options
Diffstat (limited to 'engines/parallaction')
-rw-r--r-- | engines/parallaction/sound_br.cpp | 61 | ||||
-rw-r--r-- | engines/parallaction/sound_ns.cpp | 55 |
2 files changed, 25 insertions, 91 deletions
diff --git a/engines/parallaction/sound_br.cpp b/engines/parallaction/sound_br.cpp index 9f807f5c73..ee53f9641e 100644 --- a/engines/parallaction/sound_br.cpp +++ b/engines/parallaction/sound_br.cpp @@ -205,30 +205,25 @@ class MidiPlayer_MSC : public Audio::MidiPlayer { public: MidiPlayer_MSC(); - ~MidiPlayer_MSC(); void play(Common::SeekableReadStream *stream); - void stop(); - void pause(bool p); - void updateTimer(); - void setVolume(int volume); + virtual void pause(bool p); + virtual void setVolume(int volume); + virtual void onTimer(); // MidiDriver_BASE interface virtual void send(uint32 b); -private: - static void timerCallback(void *p); +private: void setVolumeInternal(int volume); - - uint8 *_midiData; bool _paused; }; MidiPlayer_MSC::MidiPlayer_MSC() - : _midiData(0), _paused(false) { + : _paused(false) { MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); _driver = MidiDriver::createMidi(dev); @@ -236,64 +231,42 @@ MidiPlayer_MSC::MidiPlayer_MSC() 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() { - stop(); - +void MidiPlayer_MSC::play(Common::SeekableReadStream *stream) { 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) { - if (!stream) { - stop(); + stop(); + if (!stream) return; - } - stop(); int size = stream->size(); _midiData = (uint8 *)malloc(size); if (_midiData) { stream->read(_midiData, size); delete stream; - Common::StackLock lock(_mutex); + _parser = createParser_MSC(); _parser->loadMusic(_midiData, size); _parser->setTrack(0); + _parser->setMidiDriver(this); + _parser->setTimerRate(_driver->getBaseTempo()); _isLooping = true; _isPlaying = true; } } -void MidiPlayer_MSC::stop() { - Audio::MidiPlayer::stop(); - free(_midiData); - _midiData = 0; -} - void MidiPlayer_MSC::pause(bool p) { _paused = p; setVolumeInternal(_paused ? 0 : _masterVolume); } -void MidiPlayer_MSC::updateTimer() { - if (_paused) { - return; - } - +void MidiPlayer_MSC::onTimer() { Common::StackLock lock(_mutex); - if (_isPlaying) { + + if (!_paused && _isPlaying && _parser) { _parser->onTimer(); } } @@ -329,12 +302,6 @@ void MidiPlayer_MSC::send(uint32 b) { sendToChannel(ch, b); } -void MidiPlayer_MSC::timerCallback(void *p) { - MidiPlayer_MSC *player = (MidiPlayer_MSC *)p; - - player->updateTimer(); -} - DosSoundMan_br::DosSoundMan_br(Parallaction_br *vm) : SoundMan_br(vm) { _midiPlayer = new MidiPlayer_MSC(); assert(_midiPlayer); diff --git a/engines/parallaction/sound_ns.cpp b/engines/parallaction/sound_ns.cpp index 239ababb54..ba81314da6 100644 --- a/engines/parallaction/sound_ns.cpp +++ b/engines/parallaction/sound_ns.cpp @@ -43,22 +43,17 @@ class MidiPlayer : public Audio::MidiPlayer { public: MidiPlayer(); - ~MidiPlayer(); void play(Common::SeekableReadStream *stream); - void stop(); void pause(bool p); - void updateTimer(); + virtual void onTimer(); private: - static void timerCallback(void *p); - - uint8 *_midiData; bool _paused; }; MidiPlayer::MidiPlayer() - : _midiData(0), _paused(false) { + : _paused(false) { MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); _driver = MidiDriver::createMidi(dev); @@ -66,52 +61,33 @@ MidiPlayer::MidiPlayer() int ret = _driver->open(); if (ret == 0) { - _parser = MidiParser::createParser_SMF(); - _parser->setMidiDriver(this); - _parser->setTimerRate(_driver->getBaseTempo()); _driver->setTimerCallback(this, &timerCallback); } } -MidiPlayer::~MidiPlayer() { - stop(); - +void MidiPlayer::play(Common::SeekableReadStream *stream) { 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) { - if (!stream) { - stop(); + stop(); + if (!stream) return; - } int size = stream->size(); - _midiData = (uint8 *)malloc(size); if (_midiData) { stream->read(_midiData, size); delete stream; - Common::StackLock lock(_mutex); + _parser = MidiParser::createParser_SMF(); _parser->loadMusic(_midiData, size); _parser->setTrack(0); + _parser->setMidiDriver(this); + _parser->setTimerRate(_driver->getBaseTempo()); _isLooping = true; _isPlaying = true; } } -void MidiPlayer::stop() { - Audio::MidiPlayer::stop(); - free(_midiData); - _midiData = 0; -} - void MidiPlayer::pause(bool p) { _paused = p; @@ -122,23 +98,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(); } } -void MidiPlayer::timerCallback(void *p) { - MidiPlayer *player = (MidiPlayer *)p; - - player->updateTimer(); -} - DosSoundMan_ns::DosSoundMan_ns(Parallaction_ns *vm) : SoundMan_ns(vm), _playing(false) { _midiPlayer = new MidiPlayer(); } |