[Scummvm-cvs-logs] scummvm master -> 4cf16a905bc85214c236e391f6b6f60e14bd3352

m-kiewitz m_kiewitz at users.sourceforge.net
Tue Jun 2 18:17:39 CEST 2015


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
4cf16a905b SHERLOCK: hopefully fix crash on exit/Music class


Commit: 4cf16a905bc85214c236e391f6b6f60e14bd3352
    https://github.com/scummvm/scummvm/commit/4cf16a905bc85214c236e391f6b6f60e14bd3352
Author: Martin Kiewitz (m_kiewitz at users.sourceforge.net)
Date: 2015-06-02T18:17:25+02:00

Commit Message:
SHERLOCK: hopefully fix crash on exit/Music class

Changed paths:
    engines/sherlock/music.cpp
    engines/sherlock/music.h



diff --git a/engines/sherlock/music.cpp b/engines/sherlock/music.cpp
index e617850..b83e8e7 100644
--- a/engines/sherlock/music.cpp
+++ b/engines/sherlock/music.cpp
@@ -59,6 +59,11 @@ MidiParser_SH::MidiParser_SH() {
 	_trackEnd = nullptr;
 }
 
+MidiParser_SH::~MidiParser_SH() {
+	unloadMusic();
+	_driver = NULL;
+}
+
 void MidiParser_SH::parseNextEvent(EventInfo &info) {
 //	warning("parseNextEvent");
 
@@ -191,6 +196,8 @@ Music::Music(SherlockEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) {
 	if (_vm->_interactiveFl)
 		_vm->_res->addToCache("MUSIC.LIB");
 
+	_midiParser = new MidiParser_SH();
+
 	MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MT32);
 	_musicType = MidiDriver::getMusicType(dev);
 
@@ -208,6 +215,7 @@ Music::Music(SherlockEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) {
 			_driver = MidiDriver_MT32_create();
 			_musicType = MT_MT32;
 		}
+		break;
 	default:
 		// Create default one
 		// I guess we shouldn't do this anymore
@@ -221,10 +229,10 @@ Music::Music(SherlockEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) {
 		int ret = _driver->open();
 		if (ret == 0) {
 			// Reset is done inside our MIDI driver
-			_driver->setTimerCallback(&_midiParser, &_midiParser.timerCallback);
+			_driver->setTimerCallback(_midiParser, &_midiParser->timerCallback);
 		}
-		_midiParser.setMidiDriver(_driver);
-		_midiParser.setTimerRate(_driver->getBaseTempo());
+		_midiParser->setMidiDriver(_driver);
+		_midiParser->setTimerRate(_driver->getBaseTempo());
 
 		if (_musicType == MT_MT32) {
 			// Upload patches
@@ -250,6 +258,18 @@ Music::Music(SherlockEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) {
 	}
 }
 
+Music::~Music() {
+	stopMusic();
+	if (_midiParser) {
+		_midiParser->stopPlaying();
+		delete _midiParser;
+	}
+	if (_driver) {
+		_driver->close();
+		delete _driver;
+	}
+}
+
 bool Music::loadSong(int songNumber) {
 	debugC(kDebugLevelMusic, "Music: loadSong()");
 
@@ -341,10 +361,14 @@ bool Music::playMusic(const Common::String &name) {
 		case MT_MT32:
 			MidiDriver_MT32_newMusicData(_driver, dataPos, dataSize);
 			break;
+
+		default:
+			// should never happen
+			break;
 		}
 	}
 
-	_midiParser.loadMusic(dataPos, dataSize);
+	_midiParser->loadMusic(dataPos, dataSize);
 	return true;
 }
 
@@ -380,11 +404,11 @@ void Music::waitTimerRoland(uint time) {
 bool Music::waitUntilTick(uint32 tick, uint32 maxTick, uint32 additionalDelay, uint32 noMusicDelay) {
 	uint32 currentTick = 0;
 
-	if (!_midiParser.isPlaying()) {
+	if (!_midiParser->isPlaying()) {
 		return _vm->_events->delay(noMusicDelay, true);
 	}
 	while (1) {
-		if (!_midiParser.isPlaying()) { // Music has stopped playing -> we are done
+		if (!_midiParser->isPlaying()) { // Music has stopped playing -> we are done
 			if (additionalDelay > 0) {
 				if (!_vm->_events->delay(additionalDelay, true))
 					return false;
@@ -392,7 +416,7 @@ bool Music::waitUntilTick(uint32 tick, uint32 maxTick, uint32 additionalDelay, u
 			return true;
 		}
 
-		currentTick = _midiParser.getTick();
+		currentTick = _midiParser->getTick();
 		//warning("waitUntilTick: %lx", currentTick);
 
 		if (currentTick <= maxTick) {
diff --git a/engines/sherlock/music.h b/engines/sherlock/music.h
index e651dd7..b11a769 100644
--- a/engines/sherlock/music.h
+++ b/engines/sherlock/music.h
@@ -33,6 +33,10 @@ namespace Sherlock {
 class SherlockEngine;
 
 class MidiParser_SH : public MidiParser {
+public:
+	MidiParser_SH();
+	~MidiParser_SH();
+
 protected:
 	virtual void parseNextEvent(EventInfo &info);
 
@@ -40,16 +44,20 @@ protected:
 	uint8 _lastEvent;
 	byte *_data;
 	byte *_trackEnd;
+
 public:
-	MidiParser_SH();
 	virtual bool loadMusic(byte *data, uint32 size);
 };
 
 class Music {
+public:
+	Music(SherlockEngine *vm, Audio::Mixer *mixer);
+	~Music();
+
 private:
 	SherlockEngine *_vm;
 	Audio::Mixer *_mixer;
-	MidiParser_SH _midiParser;
+	MidiParser_SH *_midiParser;
 	MidiDriver *_driver;
 
 public:
@@ -60,8 +68,6 @@ private:
 	MusicType _musicType;
 
 public:
-	Music(SherlockEngine *vm, Audio::Mixer *mixer);
-
 	/**
 	 * Saves sound-related settings
 	 */






More information about the Scummvm-git-logs mailing list