aboutsummaryrefslogtreecommitdiff
path: root/engines/made/music.cpp
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/made/music.cpp
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/made/music.cpp')
-rw-r--r--engines/made/music.cpp43
1 files changed, 13 insertions, 30 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;
}
}