aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction
diff options
context:
space:
mode:
authorMax Horn2011-03-25 14:10:02 +0100
committerMax Horn2011-03-25 14:15:53 +0100
commit7949d7c6def2df6f3d44db4f55e9d1d3a87a0412 (patch)
tree85af1d8a79db595115afe67bd1fa0b216509bb8d /engines/parallaction
parentdb3802b02140d80e1a4e8ead91c1b7e39ee940c5 (diff)
downloadscummvm-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/parallaction')
-rw-r--r--engines/parallaction/sound_br.cpp61
-rw-r--r--engines/parallaction/sound_ns.cpp55
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();
}