[Scummvm-cvs-logs] scummvm master -> 7949d7c6def2df6f3d44db4f55e9d1d3a87a0412

fingolfin max at quendi.de
Fri Mar 25 14:18:21 CET 2011


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

Summary:
00ad039b4c TOUCHE: Change MidiPlayer to derive from Audio::MidiPlayer
bd637b4c5c TOUCHE: Move _gmToRol to midi.cpp
6bf4745a1b HUGO: Move MidiDriver creation into MidiPlayer constructor
9ffc4e0151 PARALLACTION: Move MidiDriver creation into MidiPlayer(_MSC) constructors
61ff5de0cf AUDIO: Rename 'channel' to 'ch'
f333d93fe8 TINSEL: Remove unused TinselEngine::_musicVolume member
db3802b021 AUDIO: Whitespace fix
7949d7c6de AUDIO: Move more common code to Audio::MidiPlayer


Commit: 00ad039b4cb0959b602592579d16adfac89bffc1
    https://github.com/scummvm/scummvm/commit/00ad039b4cb0959b602592579d16adfac89bffc1
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:14:13-07:00

Commit Message:
TOUCHE: Change MidiPlayer to derive from Audio::MidiPlayer

Changed paths:
    engines/touche/midi.cpp
    engines/touche/midi.h



diff --git a/engines/touche/midi.cpp b/engines/touche/midi.cpp
index 4349a29..9450f04 100644
--- a/engines/touche/midi.cpp
+++ b/engines/touche/midi.cpp
@@ -33,8 +33,9 @@
 namespace Touche {
 
 MidiPlayer::MidiPlayer()
-	: _driver(0), _parser(0), _midiData(0), _isLooping(false), _isPlaying(false), _masterVolume(0) {
-	memset(_channelsTable, 0, sizeof(_channelsTable));
+	: _midiData(0) {
+
+	// FIXME: Necessary?
 	memset(_channelsVolume, 0, sizeof(_channelsVolume));
 
 	MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
@@ -81,13 +82,9 @@ void MidiPlayer::play(Common::ReadStream &stream, int size, bool loop) {
 }
 
 void MidiPlayer::stop() {
-	Common::StackLock lock(_mutex);
-	if (_isPlaying) {
-		_isPlaying = false;
-		_parser->unloadMusic();
-		free(_midiData);
-		_midiData = 0;
-	}
+	Audio::MidiPlayer::stop();
+	free(_midiData);
+	_midiData = 0;
 }
 
 void MidiPlayer::updateTimer() {
@@ -102,9 +99,17 @@ void MidiPlayer::adjustVolume(int diff) {
 }
 
 void MidiPlayer::setVolume(int volume) {
+	// FIXME: This is almost identical to Audio::MidiPlayer::setVolume,
+	// the only difference is that this implementation will always
+	// transmit the volume change, even if the current _masterVolume
+	// equals the new master volume. This *could* make a difference in
+	// some situations.
+	// So, we should determine whether Touche requires this behavioral
+	// difference; and maybe also if other engines could benefit from it
+	// (as hypothetically, it might fix some subtle bugs?)
 	_masterVolume = CLIP(volume, 0, 255);
 	Common::StackLock lock(_mutex);
-	for (int i = 0; i < NUM_CHANNELS; ++i) {
+	for (int i = 0; i < kNumChannels; ++i) {
 		if (_channelsTable[i]) {
 			_channelsTable[i]->volume(_channelsVolume[i] * _masterVolume / 255);
 		}
@@ -112,47 +117,10 @@ void MidiPlayer::setVolume(int volume) {
 }
 
 void MidiPlayer::send(uint32 b) {
-	byte volume, ch = (byte)(b & 0xF);
-	switch (b & 0xFFF0) {
-	case 0x07B0: // volume change
-		volume = (byte)((b >> 16) & 0x7F);
-		_channelsVolume[ch] = volume;
-		volume = volume * _masterVolume / 255;
-		b = (b & 0xFF00FFFF) | (volume << 16);
-		break;
-	case 0x7BB0: // all notes off
-		if (!_channelsTable[ch]) {
-			// channel not yet allocated, no need to send the event
-			return;
-		}
-		break;
-	default:
-		if ((b & 0xF0) == 0xC0 && _nativeMT32) { // program change
-			b = (b & 0xFFFF00FF) | (_gmToRol[(b >> 8) & 0x7F] << 8);
-		}
-		break;
-	}
-	if (!_channelsTable[ch]) {
-		_channelsTable[ch] = (ch == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel();
-	}
-	if (_channelsTable[ch]) {
-		_channelsTable[ch]->send(b);
-	}
-}
-
-void MidiPlayer::metaEvent(byte type, byte *data, uint16 length) {
-	switch (type) {
-	case 0x2F: // end of Track
-		if (_isLooping) {
-			_parser->jumpToTick(0);
-		} else {
-			stop();
-		}
-		break;
-	default:
-//		warning("Unhandled meta event: %02x", type);
-		break;
+	if ((b & 0xF0) == 0xC0 && _nativeMT32) { // program change
+		b = (b & 0xFFFF00FF) | (_gmToRol[(b >> 8) & 0x7F] << 8);
 	}
+	Audio::MidiPlayer::send(b);
 }
 
 void MidiPlayer::timerCallback(void *p) {
diff --git a/engines/touche/midi.h b/engines/touche/midi.h
index bc5adc6..091deab 100644
--- a/engines/touche/midi.h
+++ b/engines/touche/midi.h
@@ -29,7 +29,7 @@
 #include "common/util.h"
 #include "common/mutex.h"
 
-#include "audio/mididrv.h"
+#include "audio/midiplayer.h"
 
 class MidiParser;
 
@@ -39,13 +39,8 @@ namespace Common {
 
 namespace Touche {
 
-class MidiPlayer : public MidiDriver_BASE {
+class MidiPlayer : public Audio::MidiPlayer {
 public:
-
-	enum {
-		NUM_CHANNELS = 16
-	};
-
 	MidiPlayer();
 	~MidiPlayer();
 
@@ -54,27 +49,15 @@ public:
 	void updateTimer();
 	void adjustVolume(int diff);
 	void setVolume(int volume);
-	int getVolume() const { return _masterVolume; }
-	void setLooping(bool loop) { _isLooping = loop; }
 
 	// MidiDriver_BASE interface
 	virtual void send(uint32 b);
-	virtual void metaEvent(byte type, byte *data, uint16 length);
 
 private:
 
 	static void timerCallback(void *p);
 
-	MidiDriver *_driver;
-	MidiParser *_parser;
 	uint8 *_midiData;
-	bool _isLooping;
-	bool _isPlaying;
-	int _masterVolume;
-	bool _nativeMT32;
-	MidiChannel *_channelsTable[NUM_CHANNELS];
-	uint8 _channelsVolume[NUM_CHANNELS];
-	Common::Mutex _mutex;
 
 	static const uint8 _gmToRol[];
 };


Commit: bd637b4c5c159c2eeefe14634a7c227c1e2df800
    https://github.com/scummvm/scummvm/commit/bd637b4c5c159c2eeefe14634a7c227c1e2df800
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:14:13-07:00

Commit Message:
TOUCHE: Move _gmToRol to midi.cpp

Changed paths:
    engines/touche/midi.cpp
    engines/touche/midi.h
    engines/touche/staticres.cpp



diff --git a/engines/touche/midi.cpp b/engines/touche/midi.cpp
index 9450f04..bdf5788 100644
--- a/engines/touche/midi.cpp
+++ b/engines/touche/midi.cpp
@@ -32,6 +32,18 @@
 
 namespace Touche {
 
+static const uint8 _gmToRol[256] = {
+	0x01, 0x02, 0x03, 0x08, 0x04, 0x05, 0x11, 0x14, 0x66, 0x66, 0x66, 0x62, 0x69, 0x68, 0x67, 0x26,
+	0x09, 0x0A, 0x0B, 0x0E, 0x0F, 0x10, 0x10, 0x10, 0x3C, 0x3D, 0x3D, 0x3D, 0x3D, 0x3E, 0x3F, 0x3F,
+	0x47, 0x41, 0x42, 0x48, 0x45, 0x46, 0x1D, 0x1E, 0x35, 0x36, 0x37, 0x39, 0x33, 0x34, 0x3A, 0x71,
+	0x31, 0x32, 0x31, 0x32, 0x23, 0x23, 0x23, 0x7B, 0x59, 0x5B, 0x5F, 0x5A, 0x5D, 0x60, 0x19, 0x1A,
+	0x4F, 0x50, 0x51, 0x52, 0x55, 0x56, 0x57, 0x53, 0x4B, 0x49, 0x4D, 0x4E, 0x6F, 0x6C, 0x6D, 0x6E,
+	0x30, 0x19, 0x4E, 0x2B, 0x28, 0x23, 0x19, 0x30, 0x21, 0x25, 0x1C, 0x21, 0x24, 0x22, 0x21, 0x22,
+	0x2A, 0x25, 0x24, 0x26, 0x2E, 0x22, 0x29, 0x21, 0x40, 0x40, 0x6A, 0x6A, 0x68, 0x10, 0x35, 0x10,
+	0x7F, 0x6B, 0x69, 0x75, 0x76, 0x72, 0x74, 0x01, 0x01, 0x70, 0x01, 0x7D, 0x7C, 0x01, 0x01, 0x01
+};
+
+
 MidiPlayer::MidiPlayer()
 	: _midiData(0) {
 
diff --git a/engines/touche/midi.h b/engines/touche/midi.h
index 091deab..8f2f850 100644
--- a/engines/touche/midi.h
+++ b/engines/touche/midi.h
@@ -58,8 +58,6 @@ private:
 	static void timerCallback(void *p);
 
 	uint8 *_midiData;
-
-	static const uint8 _gmToRol[];
 };
 
 } // namespace Touche
diff --git a/engines/touche/staticres.cpp b/engines/touche/staticres.cpp
index a377a6e..74aa795 100644
--- a/engines/touche/staticres.cpp
+++ b/engines/touche/staticres.cpp
@@ -1822,15 +1822,4 @@ int Graphics::_fontSize = Graphics::_engFontSize;
 
 const uint8 *Graphics::_fontData = Graphics::_engFontData;
 
-const uint8 MidiPlayer::_gmToRol[] = {
-	0x01, 0x02, 0x03, 0x08, 0x04, 0x05, 0x11, 0x14, 0x66, 0x66, 0x66, 0x62, 0x69, 0x68, 0x67, 0x26,
-	0x09, 0x0A, 0x0B, 0x0E, 0x0F, 0x10, 0x10, 0x10, 0x3C, 0x3D, 0x3D, 0x3D, 0x3D, 0x3E, 0x3F, 0x3F,
-	0x47, 0x41, 0x42, 0x48, 0x45, 0x46, 0x1D, 0x1E, 0x35, 0x36, 0x37, 0x39, 0x33, 0x34, 0x3A, 0x71,
-	0x31, 0x32, 0x31, 0x32, 0x23, 0x23, 0x23, 0x7B, 0x59, 0x5B, 0x5F, 0x5A, 0x5D, 0x60, 0x19, 0x1A,
-	0x4F, 0x50, 0x51, 0x52, 0x55, 0x56, 0x57, 0x53, 0x4B, 0x49, 0x4D, 0x4E, 0x6F, 0x6C, 0x6D, 0x6E,
-	0x30, 0x19, 0x4E, 0x2B, 0x28, 0x23, 0x19, 0x30, 0x21, 0x25, 0x1C, 0x21, 0x24, 0x22, 0x21, 0x22,
-	0x2A, 0x25, 0x24, 0x26, 0x2E, 0x22, 0x29, 0x21, 0x40, 0x40, 0x6A, 0x6A, 0x68, 0x10, 0x35, 0x10,
-	0x7F, 0x6B, 0x69, 0x75, 0x76, 0x72, 0x74, 0x01, 0x01, 0x70, 0x01, 0x7D, 0x7C, 0x01, 0x01, 0x01
-};
-
 } // namespace Touche


Commit: 6bf4745a1bdd2116702e8b53107315ed621c6627
    https://github.com/scummvm/scummvm/commit/6bf4745a1bdd2116702e8b53107315ed621c6627
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:15:43-07:00

Commit Message:
HUGO: Move MidiDriver creation into MidiPlayer constructor

Changed paths:
    engines/hugo/sound.cpp
    engines/hugo/sound.h



diff --git a/engines/hugo/sound.cpp b/engines/hugo/sound.cpp
index 04da0c8..f0a0882 100644
--- a/engines/hugo/sound.cpp
+++ b/engines/hugo/sound.cpp
@@ -47,8 +47,11 @@
 
 namespace Hugo {
 
-MidiPlayer::MidiPlayer(MidiDriver *driver)
+MidiPlayer::MidiPlayer()
 	: _midiData(0) {
+
+	MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
+	_driver = MidiDriver::createMidi(dev);
 	assert(_driver);
 	_paused = false;
 }
@@ -158,10 +161,7 @@ void MidiPlayer::timerCallback(void *p) {
 }
 
 SoundHandler::SoundHandler(HugoEngine *vm) : _vm(vm) {
-	MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
-	MidiDriver *driver = MidiDriver::createMidi(dev);
-
-	_midiPlayer = new MidiPlayer(driver);
+	_midiPlayer = new MidiPlayer();
 	_speakerStream = new Audio::PCSpeaker(_vm->_mixer->getOutputRate());
 	_vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_speakerHandle,
 						_speakerStream, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
diff --git a/engines/hugo/sound.h b/engines/hugo/sound.h
index b8a7bf9..f3a141a 100644
--- a/engines/hugo/sound.h
+++ b/engines/hugo/sound.h
@@ -41,7 +41,7 @@ namespace Hugo {
 
 class MidiPlayer : public Audio::MidiPlayer {
 public:
-	MidiPlayer(MidiDriver *driver);
+	MidiPlayer();
 	~MidiPlayer();
 
 	void pause(bool p);


Commit: 9ffc4e015138098fa21d234bb195c99a29b17380
    https://github.com/scummvm/scummvm/commit/9ffc4e015138098fa21d234bb195c99a29b17380
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:15:47-07:00

Commit Message:
PARALLACTION: Move MidiDriver creation into MidiPlayer(_MSC) constructors

Changed paths:
    engines/parallaction/parallaction_br.cpp
    engines/parallaction/parallaction_ns.cpp
    engines/parallaction/sound.h
    engines/parallaction/sound_br.cpp
    engines/parallaction/sound_ns.cpp



diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp
index 457c421..619a4f7 100644
--- a/engines/parallaction/parallaction_br.cpp
+++ b/engines/parallaction/parallaction_br.cpp
@@ -61,9 +61,7 @@ Common::Error Parallaction_br::init() {
 			_disk = new DosDisk_br(this);
 		}
 		_disk->setLanguage(2);					// NOTE: language is now hardcoded to English. Original used command-line parameters.
-		MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
-		MidiDriver *driver = MidiDriver::createMidi(dev);
-		_soundManI = new DosSoundMan_br(this, driver);
+		_soundManI = new DosSoundMan_br(this);
 	} else {
 		_disk = new AmigaDisk_br(this);
 		_disk->setLanguage(2);					// NOTE: language is now hardcoded to English. Original used command-line parameters.
diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp
index c3d917a..ffac22e 100644
--- a/engines/parallaction/parallaction_ns.cpp
+++ b/engines/parallaction/parallaction_ns.cpp
@@ -166,9 +166,7 @@ Common::Error Parallaction_ns::init() {
 	_disk->init();
 
 	if (getPlatform() == Common::kPlatformPC) {
-		MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
-		MidiDriver *driver = MidiDriver::createMidi(dev);
-		_soundManI = new DosSoundMan_ns(this, driver);
+		_soundManI = new DosSoundMan_ns(this);
 		_soundManI->setMusicVolume(ConfMan.getInt("music_volume"));
 	} else {
 		_soundManI = new AmigaSoundMan_ns(this);
diff --git a/engines/parallaction/sound.h b/engines/parallaction/sound.h
index 7b3eff3..455189d 100644
--- a/engines/parallaction/sound.h
+++ b/engines/parallaction/sound.h
@@ -140,7 +140,7 @@ class DosSoundMan_ns : public SoundMan_ns {
 
 	
 public:
-	DosSoundMan_ns(Parallaction_ns *vm, MidiDriver *midiDriver);
+	DosSoundMan_ns(Parallaction_ns *vm);
 	~DosSoundMan_ns();
 	void playMusic();
 	void stopMusic();
@@ -228,7 +228,7 @@ class DosSoundMan_br : public SoundMan_br {
 	Audio::AudioStream *loadChannelData(const char *filename, Channel *ch, bool looping);
 
 public:
-	DosSoundMan_br(Parallaction_br *vm, MidiDriver *midiDriver);
+	DosSoundMan_br(Parallaction_br *vm);
 	~DosSoundMan_br();
 
 	void playMusic();
diff --git a/engines/parallaction/sound_br.cpp b/engines/parallaction/sound_br.cpp
index 1bc085f..9f807f5 100644
--- a/engines/parallaction/sound_br.cpp
+++ b/engines/parallaction/sound_br.cpp
@@ -204,7 +204,7 @@ MidiParser *createParser_MSC() {
 class MidiPlayer_MSC : public Audio::MidiPlayer {
 public:
 
-	MidiPlayer_MSC(MidiDriver *driver);
+	MidiPlayer_MSC();
 	~MidiPlayer_MSC();
 
 	void play(Common::SeekableReadStream *stream);
@@ -227,9 +227,11 @@ private:
 
 
 
-MidiPlayer_MSC::MidiPlayer_MSC(MidiDriver *driver)
+MidiPlayer_MSC::MidiPlayer_MSC()
 	: _midiData(0), _paused(false) {
-	_driver = driver;
+
+	MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
+	_driver = MidiDriver::createMidi(dev);
 	assert(_driver);
 
 	int ret = _driver->open();
@@ -333,8 +335,8 @@ void MidiPlayer_MSC::timerCallback(void *p) {
 	player->updateTimer();
 }
 
-DosSoundMan_br::DosSoundMan_br(Parallaction_br *vm, MidiDriver *driver) : SoundMan_br(vm) {
-	_midiPlayer = new MidiPlayer_MSC(driver);
+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 8f3f0c3..239abab 100644
--- a/engines/parallaction/sound_ns.cpp
+++ b/engines/parallaction/sound_ns.cpp
@@ -42,7 +42,7 @@ namespace Parallaction {
 class MidiPlayer : public Audio::MidiPlayer {
 public:
 
-	MidiPlayer(MidiDriver *driver);
+	MidiPlayer();
 	~MidiPlayer();
 
 	void play(Common::SeekableReadStream *stream);
@@ -57,10 +57,12 @@ private:
 	bool _paused;
 };
 
-MidiPlayer::MidiPlayer(MidiDriver *driver)
+MidiPlayer::MidiPlayer()
 	: _midiData(0), _paused(false) {
-	assert(driver);
-	_driver = driver;
+
+	MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
+	_driver = MidiDriver::createMidi(dev);
+	assert(_driver);
 
 	int ret = _driver->open();
 	if (ret == 0) {
@@ -137,8 +139,8 @@ void MidiPlayer::timerCallback(void *p) {
 	player->updateTimer();
 }
 
-DosSoundMan_ns::DosSoundMan_ns(Parallaction_ns *vm, MidiDriver *midiDriver) : SoundMan_ns(vm), _playing(false) {
-	_midiPlayer = new MidiPlayer(midiDriver);
+DosSoundMan_ns::DosSoundMan_ns(Parallaction_ns *vm) : SoundMan_ns(vm), _playing(false) {
+	_midiPlayer = new MidiPlayer();
 }
 
 DosSoundMan_ns::~DosSoundMan_ns() {


Commit: 61ff5de0cfb286443e0554d83ad74ee3577c51ae
    https://github.com/scummvm/scummvm/commit/61ff5de0cfb286443e0554d83ad74ee3577c51ae
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:15:51-07:00

Commit Message:
AUDIO: Rename 'channel' to 'ch'

Changed paths:
    audio/midiplayer.cpp
    audio/midiplayer.h



diff --git a/audio/midiplayer.cpp b/audio/midiplayer.cpp
index 12d03d7..d797ba2 100644
--- a/audio/midiplayer.cpp
+++ b/audio/midiplayer.cpp
@@ -75,32 +75,33 @@ void MidiPlayer::syncVolume() {
 
 
 void MidiPlayer::send(uint32 b) {
-	byte channel = (byte)(b & 0x0F);
+	byte ch = (byte)(b & 0x0F);
 	if ((b & 0xFFF0) == 0x07B0) {
 		// Adjust volume changes by master volume
 		byte volume = (byte)((b >> 16) & 0x7F);
-		_channelsVolume[channel] = volume;
+		_channelsVolume[ch] = volume;
 		volume = volume * _masterVolume / 255;
 		b = (b & 0xFF00FFFF) | (volume << 16);
 	} else if ((b & 0xFFF0) == 0x007BB0) {
 		// Only respond to All Notes Off if this channel
 		// has currently been allocated
-		if (!_channelsTable[channel])
+		if (!_channelsTable[ch])
 			return;
 	}
 
-	sendToChannel(channel, b);
+	sendToChannel(ch, b);
 }
 
-void MidiPlayer::sendToChannel(byte channel, uint32 b) {
-	if (!_channelsTable[channel]) {
-		_channelsTable[channel] = (channel == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel();
+void MidiPlayer::sendToChannel(byte ch, uint32 b) {
+	if (!_channelsTable[ch]) {
+		_channelsTable[ch] = (ch == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel();
 		// TODO: Some engines overload this method to insert code at this
 		// point which calls the channel's volume() method.
 		// Does this make sense, and should we maybe do it in general?
 	}
-	if (_channelsTable[channel])
-		_channelsTable[channel]->send(b);
+	if (_channelsTable[ch]) {
+		_channelsTable[ch]->send(b);
+	}
 }
 
 void MidiPlayer::metaEvent(byte type, byte *data, uint16 length) {
diff --git a/audio/midiplayer.h b/audio/midiplayer.h
index fd60d0b..7815489 100644
--- a/audio/midiplayer.h
+++ b/audio/midiplayer.h
@@ -85,7 +85,7 @@ public:
 	 * This method is invoked by send() after suitably filtering
 	 * the message b.
 	 */
-	virtual void sendToChannel(byte channel, uint32 b);
+	virtual void sendToChannel(byte ch, uint32 b);
 
 	/**
 	 * This method is invoked by metaEvent when an end-of-track


Commit: f333d93fe8985ad2b50f1ef936737cde40d926e9
    https://github.com/scummvm/scummvm/commit/f333d93fe8985ad2b50f1ef936737cde40d926e9
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:15:52-07:00

Commit Message:
TINSEL: Remove unused TinselEngine::_musicVolume member

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



diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp
index 943beb4..d53b985 100644
--- a/engines/tinsel/music.cpp
+++ b/engines/tinsel/music.cpp
@@ -405,20 +405,6 @@ MidiMusicPlayer::MidiMusicPlayer() {
 
 		_driver->setTimerCallback(this, &onTimer);
 	}
-
-	_xmidiParser = MidiParser::createParser_XMIDI();
-}
-
-MidiMusicPlayer::~MidiMusicPlayer() {
-	_driver->setTimerCallback(NULL, NULL);
-	stop();
-	if (_driver) {
-		_driver->close();
-		delete _driver;
-		_driver = 0;
-	}
-	_xmidiParser->setMidiDriver(NULL);
-	delete _xmidiParser;
 }
 
 void MidiMusicPlayer::setVolume(int volume) {
@@ -441,15 +427,9 @@ void MidiMusicPlayer::send(uint32 b) {
 	}
 }
 
-void MidiMusicPlayer::onTimer(void *refCon) {
-	MidiMusicPlayer *music = (MidiMusicPlayer *)refCon;
-	Common::StackLock lock(music->_mutex);
-
-	if (music->_isPlaying)
-		music->_parser->onTimer();
-}
-
 void MidiMusicPlayer::playXMIDI(byte *midiData, uint32 size, bool loop) {
+	Common::StackLock lock(_mutex);
+
 	if (_isPlaying)
 		return;
 
@@ -467,8 +447,8 @@ void MidiMusicPlayer::playXMIDI(byte *midiData, uint32 size, bool loop) {
 
 	// Load XMID resource data
 
-	if (_xmidiParser->loadMusic(midiData, size)) {
-		MidiParser *parser = _xmidiParser;
+	MidiParser *parser = MidiParser::createParser_XMIDI();
+	if (parser->loadMusic(midiData, size)) {
 		parser->setTrack(0);
 		parser->setMidiDriver(this);
 		parser->setTimerRate(getBaseTempo());
@@ -479,6 +459,8 @@ void MidiMusicPlayer::playXMIDI(byte *midiData, uint32 size, bool loop) {
 
 		_isLooping = loop;
 		_isPlaying = true;
+	} else {
+		delete parser;
 	}
 }
 
diff --git a/engines/tinsel/music.h b/engines/tinsel/music.h
index 9436c02..af089ca 100644
--- a/engines/tinsel/music.h
+++ b/engines/tinsel/music.h
@@ -64,7 +64,6 @@ void dumpMusic();
 class MidiMusicPlayer : public Audio::MidiPlayer {
 public:
 	MidiMusicPlayer();
-	~MidiMusicPlayer();
 
 	virtual void setVolume(int volume);
 
@@ -80,12 +79,6 @@ public:
 	// The original sets the "sequence timing" to 109 Hz, whatever that
 	// means. The default is 120.
 	uint32 getBaseTempo()	{ return _driver ? (109 * _driver->getBaseTempo()) / 120 : 0; }
-
-protected:
-
-	static void onTimer(void *data);
-
-	MidiParser *_xmidiParser;
 };
 
 class PCMMusicPlayer : public Audio::AudioStream {
diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp
index ef0fe1c..1b31737 100644
--- a/engines/tinsel/tinsel.cpp
+++ b/engines/tinsel/tinsel.cpp
@@ -859,8 +859,6 @@ TinselEngine::TinselEngine(OSystem *syst, const TinselGameDescription *gameDesc)
 	_midiMusic = new MidiMusicPlayer();
 	_pcmMusic = new PCMMusicPlayer();
 
-	_musicVolume = ConfMan.getInt("music_volume");
-
 	_sound = new SoundManager(this);
 
 	_bmv = new BMVPlayer();
diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h
index 009f6fe..5c7a1cd 100644
--- a/engines/tinsel/tinsel.h
+++ b/engines/tinsel/tinsel.h
@@ -219,9 +219,6 @@ public:
 	RectList _clipRects;
 
 private:
-	//MidiMusicPlayer *_midiMusic;
-	int _musicVolume;
-
 	void NextGameCycle();
 	void CreateConstProcesses();
 	void RestartGame();


Commit: db3802b02140d80e1a4e8ead91c1b7e39ee940c5
    https://github.com/scummvm/scummvm/commit/db3802b02140d80e1a4e8ead91c1b7e39ee940c5
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:15:52-07:00

Commit Message:
AUDIO: Whitespace fix

Changed paths:
    audio/midiparser.cpp



diff --git a/audio/midiparser.cpp b/audio/midiparser.cpp
index e01b8a7..a6df602 100644
--- a/audio/midiparser.cpp
+++ b/audio/midiparser.cpp
@@ -350,7 +350,7 @@ void MidiParser::hangAllActiveNotes() {
 		if (_next_event.command() == 0x8) {
 			if (temp_active[_next_event.basic.param1] & (1 << _next_event.channel())) {
 				hangingNote(_next_event.channel(), _next_event.basic.param1, (advance_tick - _position._last_event_tick) * _psec_per_tick, false);
-				temp_active[_next_event.basic.param1] &= ~ (1 << _next_event.channel());
+				temp_active[_next_event.basic.param1] &= ~(1 << _next_event.channel());
 			}
 		} else if (_next_event.event == 0xFF && _next_event.ext.type == 0x2F) {
 			// warning("MidiParser::hangAllActiveNotes(): Hit End of Track with active notes left");


Commit: 7949d7c6def2df6f3d44db4f55e9d1d3a87a0412
    https://github.com/scummvm/scummvm/commit/7949d7c6def2df6f3d44db4f55e9d1d3a87a0412
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:15:53-07:00

Commit Message:
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.

Changed paths:
    audio/midiplayer.cpp
    audio/midiplayer.h
    engines/agi/sound_midi.cpp
    engines/agi/sound_midi.h
    engines/draci/music.cpp
    engines/draci/music.h
    engines/hugo/sound.cpp
    engines/hugo/sound.h
    engines/m4/midi.cpp
    engines/m4/midi.h
    engines/made/music.cpp
    engines/made/music.h
    engines/parallaction/sound_br.cpp
    engines/parallaction/sound_ns.cpp
    engines/tinsel/music.cpp
    engines/touche/midi.cpp
    engines/touche/midi.h



diff --git a/audio/midiplayer.cpp b/audio/midiplayer.cpp
index d797ba2..1e39b99 100644
--- a/audio/midiplayer.cpp
+++ b/audio/midiplayer.cpp
@@ -33,6 +33,7 @@ namespace Audio {
 MidiPlayer::MidiPlayer() :
 	_driver(0),
 	_parser(0),
+	_midiData(0),
 	_isLooping(false),
 	_isPlaying(false),
 	_masterVolume(0),
@@ -45,19 +46,29 @@ MidiPlayer::MidiPlayer() :
 }
 
 MidiPlayer::~MidiPlayer() {
-// TODO
+	// FIXME/TODO: In some engines, stop() was called first;
+	// in others, _driver->setTimerCallback(NULL, NULL) came first.
+	// Hopefully, this make no real difference, but we should
+	// watch out for regressions.
+	stop();
+
+	// Unhook & unload the driver
+	if (_driver) {
+		_driver->setTimerCallback(0, 0);
+		_driver->close();
+		delete _driver;
+		_driver = 0;
+	}
 }
 
 void MidiPlayer::setVolume(int volume) {
 	volume = CLIP(volume, 0, 255);
-
 	if (_masterVolume == volume)
 		return;
 
 	Common::StackLock lock(_mutex);
 
 	_masterVolume = volume;
-
 	for (int i = 0; i < kNumChannels; ++i) {
 		if (_channelsTable[i]) {
 			_channelsTable[i]->volume(_channelsVolume[i] * _masterVolume / 255);
@@ -123,8 +134,7 @@ void MidiPlayer::endOfTrack() {
 		stop();
 }
 
-#if 0
-void MidiPlayer::onTimer(void *data) {
+void MidiPlayer::timerCallback(void *data) {
 	assert(data);
 	((MidiPlayer *)data)->onTimer();
 }
@@ -132,20 +142,13 @@ void MidiPlayer::onTimer(void *data) {
 void MidiPlayer::onTimer() {
 	Common::StackLock lock(_mutex);
 
-	// FIXME: There are various alternatives for this function:
+	// TODO: Maybe we can replace _isPlaying
+	// by a simple check for "_parser != 0" ?
 
-#if 0
-	if (_parser) {
+	if (_isPlaying && _parser) {
 		_parser->onTimer();
 	}
-#elif 0
-	if (_isPlaying) {
-		assert(_parser);
-		_parser->onTimer();
-	}
-#endif
 }
-#endif
 
 
 void MidiPlayer::stop() {
@@ -154,8 +157,19 @@ void MidiPlayer::stop() {
 	_isPlaying = false;
 	if (_parser) {
 		_parser->unloadMusic();
+
+		// FIXME/TODO: The MidiParser destructor calls allNotesOff()
+		// but unloadMusic also does. To suppress double notes-off,
+		// we reset the midi driver of _parser before deleting it.
+		// This smells very fishy, in any case.
+		_parser->setMidiDriver(0);
+
+		delete _parser;
 		_parser = NULL;
 	}
+
+	free(_midiData);
+	_midiData = 0;
 }
 
 void MidiPlayer::pause() {
diff --git a/audio/midiplayer.h b/audio/midiplayer.h
index 7815489..1bb7942 100644
--- a/audio/midiplayer.h
+++ b/audio/midiplayer.h
@@ -47,11 +47,10 @@ namespace Audio {
  * should perform memory management on the MidiParser object(s) being
  * used, and possibly more.
  *
- * Also, care should be taken to ensure that mutex locking is done right;
- * currently, it isn't: That is, many engines have (and already had before
- * this class was introduced) various potential deadlocks hiding in their
- * MIDI code, caused by a thread trying to lock a mutex twice -- this may
- * work on some systems, but on others is a sure way towards a deadlock.
+ * Also, pause/resume handling should be unified (we provide an implementation,
+ * but several subclasses use different ones).
+ *
+ * Also, care should be taken to ensure that mutex locking is done right.
  *
  * @todo Document origin of this class. It is based on code shared by
  * several engines (e.g. DRACI says it copied it from MADE, which took
@@ -64,6 +63,7 @@ public:
 
 	// TODO: Implement ways to actually play stuff
 	//virtual void play(TODO);
+
 	// TODO: Document these
 	virtual void stop();
 	virtual void pause();
@@ -71,19 +71,42 @@ public:
 
 	bool isPlaying() const { return _isPlaying; }
 
+	/**
+	 * Return the currently active master volume, in the range 0-255.
+	 */
 	int getVolume() const { return _masterVolume; }
-	virtual void setVolume(int volume);	// FIXME: Overloaded by Tinsel
+
+	/**
+	 * Set the master volume to the specified value in the range 0-255.
+	 * (values outside this range are automatically clipped).
+	 * This may cause suitable MIDI events to be sent to active channels.
+	 *
+	 * @todo This method currently does not do anything if the new volume
+	 *       matches the old volume. But some engines always update the
+	 *       volume (Parallaction, Tinsel, Touche, ...). This is why
+	 *       this method is currently virtual. We really should figure
+	 *       which way to do it, and then make this the default, and make
+	 *       this method non-virtual again.
+	 */
+	virtual void setVolume(int volume);
+
+	/**
+	 * Update the volume according to the ConfMan's 'music_volume'
+	 * setting. also respects the 'mute' setting.
+	 */
 	void syncVolume();
 
+	// TODO: Document this
 	bool hasNativeMT32() const { return _nativeMT32; }
 
-	// MidiDriver_BASE interface
+	// MidiDriver_BASE implementation
 	virtual void send(uint32 b);
 	virtual void metaEvent(byte type, byte *data, uint16 length);
 
+protected:
 	/**
-	 * This method is invoked by send() after suitably filtering
-	 * the message b.
+	 * This method is invoked by the default send() implementation,
+	 * after suitably filtering the message b.
 	 */
 	virtual void sendToChannel(byte ch, uint32 b);
 
@@ -96,28 +119,46 @@ public:
 	 */
 	virtual void endOfTrack();
 
-protected:
-
-#if 0
-	// TODO: Start to make use of these, once we figured
-	// out the right way :)
-	static void onTimer(void *data);
+	// TODO: Document this
 	virtual void onTimer();
-#endif
+
+	static void timerCallback(void *data);
 
 	enum {
+		/**
+		 * The number of MIDI channels supported.
+		 */
 		kNumChannels = 16
 	};
 
 	Common::Mutex _mutex;
 	MidiDriver *_driver;
+
+	/**
+	 * A MidiParser instances, to be created by methods of a MidiPlayer
+	 * subclass.
+	 * @note The stop() method (and hence the destructor) invoke the
+	 * unloadMusic() method of _parser and then delete it.
+	 */
 	MidiParser *_parser;
 
+	/**
+	 * This is an (optional) pointer to a malloc'ed buffer containing
+	 * MIDI data used by _parser. The stop() method (and hence the
+	 * destructor) will free this if set.
+	 * Subclasses of this class may use _midiData, but don't have to
+	 */
+	byte *_midiData;
+
 	MidiChannel *_channelsTable[kNumChannels];
 	uint8 _channelsVolume[kNumChannels];
 
 	bool _isLooping;
 	bool _isPlaying;
+
+	/**
+	 * The master volume, in the range 0-255.
+	 */
 	int _masterVolume;	// FIXME: byte or int ?
 
 	bool _nativeMT32;
diff --git a/engines/agi/sound_midi.cpp b/engines/agi/sound_midi.cpp
index 2c6a189..ff23a70 100644
--- a/engines/agi/sound_midi.cpp
+++ b/engines/agi/sound_midi.cpp
@@ -90,24 +90,11 @@ SoundGenMIDI::SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, p
 		else
 			_driver->sendGMReset();
 
-		_driver->setTimerCallback(this, &onTimer);
+		// FIXME: We need to cast "this" here due to the effects of
+		// multiple inheritance. This hack can go away once this
+		// setTimerCallback() has been moved inside Audio::MidiPlayer code.
+		_driver->setTimerCallback(static_cast<Audio::MidiPlayer *>(this), &timerCallback);
 	}
-
-	_smfParser = MidiParser::createParser_SMF();
-	_midiMusicData = NULL;
-}
-
-SoundGenMIDI::~SoundGenMIDI() {
-	_driver->setTimerCallback(NULL, NULL);
-	stop();
-	if (_driver) {
-		_driver->close();
-		delete _driver;
-		_driver = 0;
-	}
-	_smfParser->setMidiDriver(NULL);
-	delete _smfParser;
-	delete[] _midiMusicData;
 }
 
 void SoundGenMIDI::send(uint32 b) {
@@ -136,14 +123,6 @@ void SoundGenMIDI::endOfTrack() {
 	_vm->_sound->soundIsFinished();
 }
 
-void SoundGenMIDI::onTimer(void *refCon) {
-	SoundGenMIDI *music = (SoundGenMIDI *)refCon;
-	Common::StackLock lock(music->_mutex);
-
-	if (music->_parser)
-		music->_parser->onTimer();
-}
-
 void SoundGenMIDI::play(int resnum) {
 	MIDISound *track;
  
@@ -154,10 +133,10 @@ void SoundGenMIDI::play(int resnum) {
 	track = (MIDISound *)_vm->_game.sounds[resnum];
 
 	// Convert AGI Sound data to MIDI
-	int midiMusicSize = convertSND2MIDI(track->_data, &_midiMusicData);
+	int midiMusicSize = convertSND2MIDI(track->_data, &_midiData);
 
-	if (_smfParser->loadMusic(_midiMusicData, midiMusicSize)) {
-		MidiParser *parser = _smfParser;
+	MidiParser *parser = MidiParser::createParser_SMF();
+	if (parser->loadMusic(_midiData, midiMusicSize)) {
 		parser->setTrack(0);
 		parser->setMidiDriver(this);
 		parser->setTimerRate(_driver->getBaseTempo());
@@ -168,6 +147,8 @@ void SoundGenMIDI::play(int resnum) {
 		syncVolume();
 
 		_isPlaying = true;
+	} else {
+		delete parser;
 	}
 }
 
diff --git a/engines/agi/sound_midi.h b/engines/agi/sound_midi.h
index 9551673..5733358 100644
--- a/engines/agi/sound_midi.h
+++ b/engines/agi/sound_midi.h
@@ -28,6 +28,8 @@
 #ifndef AGI_SOUND_MIDI_H
 #define AGI_SOUND_MIDI_H
 
+#include "agi/sound.h"
+
 #include "audio/midiplayer.h"
 
 namespace Agi {
@@ -47,13 +49,12 @@ protected:
 class SoundGenMIDI : public SoundGen, public Audio::MidiPlayer {
 public:
 	SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer);
-	~SoundGenMIDI();
 
 	void play(int resnum);
+	// We must overload stop() here to implement the pure virtual
+	// stop() method of the SoundGen class.
 	void stop() { Audio::MidiPlayer::stop(); }
 
-	void setGM(bool isGM) { _isGM = isGM; }
-
 	// MidiDriver_BASE interface implementation
 	virtual void send(uint32 b);
 
@@ -62,14 +63,8 @@ public:
 	virtual void endOfTrack();
 
 private:
-
-	static void onTimer(void *data);
-
-	MidiParser *_smfParser;
 	bool _isGM;
 
-	byte *_midiMusicData;
-
 	SoundMgr *_manager;
 };
 
diff --git a/engines/draci/music.cpp b/engines/draci/music.cpp
index 77f5154..242e58e 100644
--- a/engines/draci/music.cpp
+++ b/engines/draci/music.cpp
@@ -47,9 +47,6 @@ MusicPlayer::MusicPlayer(const char *pathMask) : _pathMask(pathMask), _isGM(fals
 	if (_nativeMT32)
 		_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
 
-	_smfParser = MidiParser::createParser_SMF();
-	_midiMusicData = NULL;
-
 	int ret = _driver->open();
 	if (ret == 0) {
 		if (_nativeMT32)
@@ -61,21 +58,8 @@ MusicPlayer::MusicPlayer(const char *pathMask) : _pathMask(pathMask), _isGM(fals
 		// interface for such an operation is supported for AdLib.  Maybe for
 		// this card, setting instruments is necessary.
 
-		_driver->setTimerCallback(this, &onTimer);
-	}
-}
-
-MusicPlayer::~MusicPlayer() {
-	_driver->setTimerCallback(NULL, NULL);
-	stop();
-	if (_driver) {
-		_driver->close();
-		delete _driver;
-		_driver = 0;
+		_driver->setTimerCallback(this, &timerCallback);
 	}
-	_smfParser->setMidiDriver(NULL);
-	delete _smfParser;
-	delete[] _midiMusicData;
 }
 
 void MusicPlayer::sendToChannel(byte channel, uint32 b) {
@@ -91,15 +75,9 @@ void MusicPlayer::sendToChannel(byte channel, uint32 b) {
 		_channelsTable[channel]->send(b);
 }
 
-void MusicPlayer::onTimer(void *refCon) {
-	MusicPlayer *music = (MusicPlayer *)refCon;
-	Common::StackLock lock(music->_mutex);
-
-	if (music->_parser)
-		music->_parser->onTimer();
-}
-
 void MusicPlayer::playSMF(int track, bool loop) {
+	Common::StackLock lock(_mutex);
+
 	if (_isPlaying && track == _track) {
 		debugC(2, kDraciSoundDebugLevel, "Already plaing track %d", track);
 		return;
@@ -109,24 +87,23 @@ void MusicPlayer::playSMF(int track, bool loop) {
 
 	_isGM = true;
 
-
 	// Load MIDI resource data
 	Common::File musicFile;
 	char musicFileName[40];
-	sprintf(musicFileName, _pathMask.c_str(), track);
+	snprintf(musicFileName, sizeof(musicFileName), _pathMask.c_str(), track);
 	musicFile.open(musicFileName);
 	if (!musicFile.isOpen()) {
 		debugC(2, kDraciSoundDebugLevel, "Cannot open track %d", track);
 		return;
 	}
 	int midiMusicSize = musicFile.size();
-	delete[] _midiMusicData;
-	_midiMusicData = new byte[midiMusicSize];
-	musicFile.read(_midiMusicData, midiMusicSize);
+	free(_midiData);
+	_midiData = (byte *)malloc(midiMusicSize);
+	musicFile.read(_midiData, midiMusicSize);
 	musicFile.close();
 
-	if (_smfParser->loadMusic(_midiMusicData, midiMusicSize)) {
-		MidiParser *parser = _smfParser;
+	MidiParser *parser = MidiParser::createParser_SMF();
+	if (parser->loadMusic(_midiData, midiMusicSize)) {
 		parser->setTrack(0);
 		parser->setMidiDriver(this);
 		parser->setTimerRate(_driver->getBaseTempo());
@@ -142,6 +119,7 @@ void MusicPlayer::playSMF(int track, bool loop) {
 		debugC(2, kDraciSoundDebugLevel, "Playing track %d", track);
 	} else {
 		debugC(2, kDraciSoundDebugLevel, "Cannot play track %d", track);
+		delete parser;
 	}
 }
 
diff --git a/engines/draci/music.h b/engines/draci/music.h
index a1d0aaa..c022807 100644
--- a/engines/draci/music.h
+++ b/engines/draci/music.h
@@ -37,27 +37,18 @@ namespace Draci {
 class MusicPlayer : public Audio::MidiPlayer {
 public:
 	MusicPlayer(const char *pathMask);
-	~MusicPlayer();
 
 	void playSMF(int track, bool loop);
 	void stop();
 
-	void setGM(bool isGM) { _isGM = isGM; }
-
 	// Overload Audio::MidiPlayer method
 	virtual void sendToChannel(byte channel, uint32 b);
 
 protected:
-
-	static void onTimer(void *data);
-
-	MidiParser *_smfParser;
 	Common::String _pathMask;
 	bool _isGM;
 
 	int _track;
-
-	byte *_midiMusicData;
 };
 
 } // End of namespace Draci
diff --git a/engines/hugo/sound.cpp b/engines/hugo/sound.cpp
index f0a0882..24359a2 100644
--- a/engines/hugo/sound.cpp
+++ b/engines/hugo/sound.cpp
@@ -47,61 +47,46 @@
 
 namespace Hugo {
 
-MidiPlayer::MidiPlayer()
-	: _midiData(0) {
-
+MidiPlayer::MidiPlayer() {
 	MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
 	_driver = MidiDriver::createMidi(dev);
 	assert(_driver);
 	_paused = false;
-}
 
-MidiPlayer::~MidiPlayer() {
-	stop();
 
-	Common::StackLock lock(_mutex);
-	_driver->setTimerCallback(0, 0);
-	_driver->close();
-	delete _driver;
-	_driver = 0;
-	if (_parser)
-		_parser->setMidiDriver(0);
-	delete _parser;
+	int ret = _driver->open();
+	if (ret == 0) {
+		_driver->sendGMReset();
+
+		_driver->setTimerCallback(this, &timerCallback);
+	}
 }
 
 void MidiPlayer::play(uint8 *stream, uint16 size) {
 	debugC(3, kDebugMusic, "MidiPlayer::play");
-	if (!stream) {
-		stop();
-		return;
-	}
+
+	Common::StackLock lock(_mutex);
 
 	stop();
+	if (!stream)
+		return;
+
 	_midiData = (uint8 *)malloc(size);
 	if (_midiData) {
 		memcpy(_midiData, stream, size);
 
-		Common::StackLock lock(_mutex);
 		syncVolume();	// FIXME: syncVolume calls setVolume which in turn also locks the mutex! ugh
+
+		_parser = MidiParser::createParser_SMF();
 		_parser->loadMusic(_midiData, size);
 		_parser->setTrack(0);
+		_parser->setMidiDriver(this);
+		_parser->setTimerRate(_driver->getBaseTempo());
 		_isLooping = false;
 		_isPlaying = true;
 	}
 }
 
-void MidiPlayer::stop() {
-	debugC(3, kDebugMusic, "MidiPlayer::stop");
-
-	Common::StackLock lock(_mutex);
-	if (_isPlaying) {
-		_isPlaying = false;
-		_parser->unloadMusic();
-		free(_midiData);
-		_midiData = 0;
-	}
-}
-
 void MidiPlayer::pause(bool p) {
 	_paused = p;
 
@@ -112,34 +97,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();
 	}
 }
 
-int MidiPlayer::open() {
-	if (!_driver)
-		return 255;
-	int ret = _driver->open();
-	if (ret)
-		return ret;
-
-	_driver->sendGMReset();
-
-	_parser = MidiParser::createParser_SMF();
-	_parser->setMidiDriver(this);
-	_parser->setTimerRate(_driver->getBaseTempo());
-	_driver->setTimerCallback(this, &timerCallback);
-
-	return 0;
-}
-
 void MidiPlayer::sendToChannel(byte channel, uint32 b) {
 	if (!_channelsTable[channel]) {
 		_channelsTable[channel] = (channel == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel();
@@ -154,12 +119,6 @@ void MidiPlayer::sendToChannel(byte channel, uint32 b) {
 }
 
 
-void MidiPlayer::timerCallback(void *p) {
-	MidiPlayer *player = (MidiPlayer *)p;
-
-	player->updateTimer();
-}
-
 SoundHandler::SoundHandler(HugoEngine *vm) : _vm(vm) {
 	_midiPlayer = new MidiPlayer();
 	_speakerStream = new Audio::PCSpeaker(_vm->_mixer->getOutputRate());
@@ -263,7 +222,7 @@ void SoundHandler::playSound(int16 sound, const byte priority) {
  * Initialize for MCI sound and midi
  */
 void SoundHandler::initSound() {
-	_midiPlayer->open();
+	//_midiPlayer->open();
 }
 
 void SoundHandler::syncVolume() {
diff --git a/engines/hugo/sound.h b/engines/hugo/sound.h
index f3a141a..d5f5170 100644
--- a/engines/hugo/sound.h
+++ b/engines/hugo/sound.h
@@ -42,23 +42,17 @@ namespace Hugo {
 class MidiPlayer : public Audio::MidiPlayer {
 public:
 	MidiPlayer();
-	~MidiPlayer();
 
 	void pause(bool p);
 	void play(uint8 *stream, uint16 size);
-	void stop();
-	void updateTimer();
 
-	int open();
 	uint32 getBaseTempo();
 
 	// Overload Audio::MidiPlayer method
 	virtual void sendToChannel(byte channel, uint32 b);
+	virtual void onTimer();
 
 private:
-	static void timerCallback(void *p);
-
-	uint8 *_midiData;
 	bool _paused;
 };
 
diff --git a/engines/m4/midi.cpp b/engines/m4/midi.cpp
index b982fc8..d58b92b 100644
--- a/engines/m4/midi.cpp
+++ b/engines/m4/midi.cpp
@@ -34,7 +34,7 @@
 
 namespace M4 {
 
-MidiPlayer::MidiPlayer(MadsM4Engine *vm) : _vm(vm), _midiData(NULL), _isGM(false) {
+MidiPlayer::MidiPlayer(MadsM4Engine *vm) : _vm(vm), _isGM(false) {
 
 	MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
 	_nativeMT32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32"));
@@ -44,26 +44,10 @@ MidiPlayer::MidiPlayer(MadsM4Engine *vm) : _vm(vm), _midiData(NULL), _isGM(false
 	if (_nativeMT32)
 		_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
 
-	_parser = MidiParser::createParser_SMF();
-	_parser->setMidiDriver(this);
-	_parser->setTimerRate(_driver->getBaseTempo());
-
 	int ret = _driver->open();
-	if (ret == 0)
-		_driver->setTimerCallback(this, &onTimer);
-}
-
-MidiPlayer::~MidiPlayer() {
-	_driver->setTimerCallback(NULL, NULL);
-	_parser->setMidiDriver(NULL);
-	stop();
-	if (_driver) {
-		_driver->close();
-		delete _driver;
+	if (ret == 0) {
+		_driver->setTimerCallback(this, &timerCallback);
 	}
-	_driver = 0;
-	delete _parser;
-	free(_midiData);
 }
 
 void MidiPlayer::send(uint32 b) {
@@ -74,15 +58,9 @@ void MidiPlayer::send(uint32 b) {
 	Audio::MidiPlayer::send(b);
 }
 
-void MidiPlayer::onTimer(void *refCon) {
-	MidiPlayer *midi = (MidiPlayer *)refCon;
-	Common::StackLock lock(midi->_mutex);
-
-	if (midi->_isPlaying)
-		midi->_parser->onTimer();
-}
-
 void MidiPlayer::playMusic(const char *name, int32 vol, bool loop, int32 trigger, int32 scene) {
+	Common::StackLock lock(_mutex);
+
 	stop();
 
 	char fullname[144];
@@ -99,11 +77,10 @@ void MidiPlayer::playMusic(const char *name, int32 vol, bool loop, int32 trigger
 	_vm->res()->purge();
 
 	if (_midiData) {
-		/*
-		FILE *out = fopen("music.mid", "wb");
-		fwrite(_midiData, smfSize, 1, out);
-		fclose(out);
-		*/
+		_parser = MidiParser::createParser_SMF();
+		_parser->setMidiDriver(this);
+		_parser->setTimerRate(_driver->getBaseTempo());
+
 		_parser->loadMusic(_midiData, smfSize);
 		_parser->property(MidiParser::mpAutoLoop, loop);
 	}
@@ -113,20 +90,6 @@ void MidiPlayer::playMusic(const char *name, int32 vol, bool loop, int32 trigger
 	_isPlaying = true;
 }
 
-void MidiPlayer::stop() {
-	Common::StackLock lock(_mutex);
-
-	_isPlaying = false;
-	if (_parser) {
-		_parser->unloadMusic();
-	}
-
-	if (_midiData) {
-		free(_midiData);
-		_midiData = NULL;
-	}
-}
-
 // This function will convert HMP music into type 1 SMF, which our SMF parser
 // will be able to handle. It is based on Hans de Goede's HMP 2 MIDI file
 // converter, which in turn is "based on the conversion algorithms found in
diff --git a/engines/m4/midi.h b/engines/m4/midi.h
index e1f92cd..a544fb7 100644
--- a/engines/m4/midi.h
+++ b/engines/m4/midi.h
@@ -35,10 +35,8 @@ namespace M4 {
 class MidiPlayer : public Audio::MidiPlayer {
 public:
 	MidiPlayer(MadsM4Engine *vm);
-	~MidiPlayer();
 
 	void playMusic(const char *name, int32 vol, bool loop, int32 trigger, int32 scene);
-	virtual void stop();
 
 	void setGM(bool isGM) { _isGM = isGM; }
 
@@ -46,10 +44,7 @@ public:
 	virtual void send(uint32 b);
 
 protected:
-	static void onTimer(void *data);
-
 	MadsM4Engine *_vm;
-	byte *_midiData;
 
 	bool _isGM;
 
diff --git a/engines/made/music.cpp b/engines/made/music.cpp
index 054f812..c8b13ba 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;
 	}
 }
 
diff --git a/engines/made/music.h b/engines/made/music.h
index 8925440..f8f70cd 100644
--- a/engines/made/music.h
+++ b/engines/made/music.h
@@ -44,7 +44,6 @@ enum MusicFlags {
 class MusicPlayer : public Audio::MidiPlayer {
 public:
 	MusicPlayer();
-	~MusicPlayer();
 
 	void playXMIDI(GenericResource *midiResource, MusicFlags flags = MUSIC_NORMAL);
 	void playSMF(GenericResource *midiResource, MusicFlags flags = MUSIC_NORMAL);
@@ -52,16 +51,10 @@ public:
 	void pause();
 	void resume();
 
-	void setGM(bool isGM) { _isGM = isGM; }
-
 	// MidiDriver_BASE interface implementation
 	virtual void send(uint32 b);
 
 protected:
-
-	static void onTimer(void *data);
-
-	MidiParser *_xmidiParser, *_smfParser;
 	bool _isGM;
 };
 
diff --git a/engines/parallaction/sound_br.cpp b/engines/parallaction/sound_br.cpp
index 9f807f5..ee53f96 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 239abab..ba81314 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();
 }
diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp
index d53b985..3b9833b 100644
--- a/engines/tinsel/music.cpp
+++ b/engines/tinsel/music.cpp
@@ -388,22 +388,22 @@ void DeleteMidiBuffer() {
 
 MidiMusicPlayer::MidiMusicPlayer() {
 	MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
-	bool native_mt32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32"));
+	_nativeMT32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32"));
 	//bool adlib = (MidiDriver::getMusicType(dev) == MT_ADLIB);
 
 	_driver = MidiDriver::createMidi(dev);
 	assert(_driver);
-	if (native_mt32)
+	if (_nativeMT32)
 		_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
 
 	int ret = _driver->open();
 	if (ret == 0) {
-		if (native_mt32)
+		if (_nativeMT32)
 			_driver->sendMT32Reset();
 		else
 			_driver->sendGMReset();
 
-		_driver->setTimerCallback(this, &onTimer);
+		_driver->setTimerCallback(this, &timerCallback);
 	}
 }
 
diff --git a/engines/touche/midi.cpp b/engines/touche/midi.cpp
index bdf5788..c89375d 100644
--- a/engines/touche/midi.cpp
+++ b/engines/touche/midi.cpp
@@ -44,8 +44,7 @@ static const uint8 _gmToRol[256] = {
 };
 
 
-MidiPlayer::MidiPlayer()
-	: _midiData(0) {
+MidiPlayer::MidiPlayer() {
 
 	// FIXME: Necessary?
 	memset(_channelsVolume, 0, sizeof(_channelsVolume));
@@ -55,9 +54,6 @@ MidiPlayer::MidiPlayer()
 	_driver = MidiDriver::createMidi(dev);
 	int ret = _driver->open();
 	if (ret == 0) {
-		_parser = MidiParser::createParser_SMF();
-		_parser->setMidiDriver(this);
-		_parser->setTimerRate(_driver->getBaseTempo());
 		_driver->setTimerCallback(this, &timerCallback);
 
 		if (_nativeMT32)
@@ -67,25 +63,18 @@ MidiPlayer::MidiPlayer()
 	}
 }
 
-MidiPlayer::~MidiPlayer() {
-	stop();
-
+void MidiPlayer::play(Common::ReadStream &stream, int size, bool loop) {
 	Common::StackLock lock(_mutex);
-	_driver->setTimerCallback(NULL, NULL);
-	_driver->close();
-	delete _driver;
-	_driver = 0;
-	_parser->setMidiDriver(NULL);
-	delete _parser;
-}
 
-void MidiPlayer::play(Common::ReadStream &stream, int size, bool loop) {
 	stop();
-	_midiData = (uint8 *)malloc(size);
+	_midiData = (byte *)malloc(size);
 	if (_midiData) {
 		stream.read(_midiData, size);
 
-		Common::StackLock lock(_mutex);
+		_parser = MidiParser::createParser_SMF();
+		_parser->setMidiDriver(this);
+		_parser->setTimerRate(_driver->getBaseTempo());
+
 		_parser->loadMusic(_midiData, size);
 		_parser->setTrack(0);
 		_isLooping = loop;
@@ -93,19 +82,6 @@ void MidiPlayer::play(Common::ReadStream &stream, int size, bool loop) {
 	}
 }
 
-void MidiPlayer::stop() {
-	Audio::MidiPlayer::stop();
-	free(_midiData);
-	_midiData = 0;
-}
-
-void MidiPlayer::updateTimer() {
-	Common::StackLock lock(_mutex);
-	if (_isPlaying) {
-		_parser->onTimer();
-	}
-}
-
 void MidiPlayer::adjustVolume(int diff) {
 	setVolume(_masterVolume + diff);
 }
@@ -135,9 +111,4 @@ void MidiPlayer::send(uint32 b) {
 	Audio::MidiPlayer::send(b);
 }
 
-void MidiPlayer::timerCallback(void *p) {
-	MidiPlayer *player = (MidiPlayer *)p;
-	player->updateTimer();
-}
-
 } // Touche namespace
diff --git a/engines/touche/midi.h b/engines/touche/midi.h
index 8f2f850..f0f55e6 100644
--- a/engines/touche/midi.h
+++ b/engines/touche/midi.h
@@ -42,22 +42,13 @@ namespace Touche {
 class MidiPlayer : public Audio::MidiPlayer {
 public:
 	MidiPlayer();
-	~MidiPlayer();
 
 	void play(Common::ReadStream &stream, int size, bool loop = false);
-	void stop();
-	void updateTimer();
 	void adjustVolume(int diff);
 	void setVolume(int volume);
 
 	// MidiDriver_BASE interface
 	virtual void send(uint32 b);
-
-private:
-
-	static void timerCallback(void *p);
-
-	uint8 *_midiData;
 };
 
 } // namespace Touche






More information about the Scummvm-git-logs mailing list