[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