[Scummvm-cvs-logs] SF.net SVN: scummvm: [29594] scummvm/trunk/engines/queen
cyx at users.sourceforge.net
cyx at users.sourceforge.net
Wed Nov 21 22:46:30 CET 2007
Revision: 29594
http://scummvm.svn.sourceforge.net/scummvm/?rev=29594&view=rev
Author: cyx
Date: 2007-11-21 13:46:30 -0800 (Wed, 21 Nov 2007)
Log Message:
-----------
use mutex to prevent race between MidiParser & MidiDriver
Modified Paths:
--------------
scummvm/trunk/engines/queen/music.cpp
scummvm/trunk/engines/queen/music.h
Modified: scummvm/trunk/engines/queen/music.cpp
===================================================================
--- scummvm/trunk/engines/queen/music.cpp 2007-11-21 20:04:14 UTC (rev 29593)
+++ scummvm/trunk/engines/queen/music.cpp 2007-11-21 21:46:30 UTC (rev 29594)
@@ -78,7 +78,7 @@
}
_driver->open();
- _driver->setTimerCallback(this, &onTimer);
+ _driver->setTimerCallback(this, &timerCallback);
_parser = MidiParser::createParser_SMF();
_parser->setMidiDriver(this);
@@ -164,7 +164,7 @@
_channelVolume[channel] = volume;
volume = volume * _masterVolume / 255;
b = (b & 0xFF00FFFF) | (volume << 16);
- } else if ((b & 0xF0) == 0xC0 && !_adlib && !_nativeMT32) {
+ } else if ((b & 0xF0) == 0xC0 && !_nativeMT32) {
b = (b & 0xFFFF00FF) | MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8;
} else if ((b & 0xFFF0) == 0x007BB0) {
//Only respond to All Notes Off if this channel
@@ -208,10 +208,11 @@
}
}
-void MidiMusic::onTimer(void *refCon) {
- MidiMusic *music = (MidiMusic *)refCon;
- if (music->_isPlaying)
- music->_parser->onTimer();
+void MidiMusic::onTimer() {
+ _mutex.lock();
+ if (_isPlaying)
+ _parser->onTimer();
+ _mutex.unlock();
}
void MidiMusic::queueTuneList(int16 tuneList) {
@@ -307,10 +308,13 @@
size = packedSize * 2;
}
+ _mutex.lock();
_parser->loadMusic(musicPtr, size);
_parser->setTrack(0);
+ _isPlaying = true;
+ _mutex.unlock();
+
debug(8, "Playing song %d [queue position: %d]", songNum, _queuePos);
- _isPlaying = true;
queueUpdatePos();
}
@@ -338,8 +342,10 @@
}
void MidiMusic::stopMusic() {
+ _mutex.lock();
_isPlaying = false;
_parser->unloadMusic();
+ _mutex.unlock();
}
uint32 MidiMusic::songOffset(uint16 songNum) const {
Modified: scummvm/trunk/engines/queen/music.h
===================================================================
--- scummvm/trunk/engines/queen/music.h 2007-11-21 20:04:14 UTC (rev 29593)
+++ scummvm/trunk/engines/queen/music.h 2007-11-21 21:46:30 UTC (rev 29594)
@@ -27,6 +27,7 @@
#define QUEEN_MUSIC_H
#include "common/util.h"
+#include "common/mutex.h"
#include "sound/mididrv.h"
class MidiParser;
@@ -76,17 +77,19 @@
void queueUpdatePos();
uint8 randomQueuePos();
- static void onTimer(void *data);
+ void onTimer();
uint32 songOffset(uint16 songNum) const;
uint32 songLength(uint16 songNum) const;
+ static void timerCallback(void *refCon) { ((MidiMusic *)refCon)->onTimer(); }
+
MidiDriver *_driver;
MidiParser *_parser;
MidiChannel *_channel[16];
byte _channelVolume[16];
bool _adlib;
bool _nativeMT32;
-
+ Common::Mutex _mutex;
Common::RandomSource _rnd;
bool _isPlaying;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list