[Scummvm-cvs-logs] SF.net SVN: scummvm:[52736] scummvm/trunk

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Thu Sep 16 00:00:21 CEST 2010


Revision: 52736
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52736&view=rev
Author:   lordhoto
Date:     2010-09-15 22:00:20 +0000 (Wed, 15 Sep 2010)

Log Message:
-----------
MIDI: Send a reset MIDI device signal on startup.

This is currently done in the engine code. I adapted AGI, AGOS, DRACI,
GROOVIE, LURE, MADE, QUEEN, SAGA, SKY, TINSEL and TOUCHE to send a reset
device on startup. The sound output still works fine (started up a game
from every engine), so this should hopefully not introduce any regressions.

As far as I can tell it seems that SCUMM does send a proper device reset, so
I did not touch it. KYRA only sends a proper reset for MT-32 currently. I am
not sure about SCI though.

This fixes bug #3066826 "SIMON: MIDI notes off when using RTL after SCI".

Modified Paths:
--------------
    scummvm/trunk/engines/agi/sound_midi.cpp
    scummvm/trunk/engines/agos/agos.cpp
    scummvm/trunk/engines/agos/midi.cpp
    scummvm/trunk/engines/agos/midi.h
    scummvm/trunk/engines/draci/draci.cpp
    scummvm/trunk/engines/draci/music.cpp
    scummvm/trunk/engines/groovie/music.cpp
    scummvm/trunk/engines/lure/sound.cpp
    scummvm/trunk/engines/made/made.cpp
    scummvm/trunk/engines/made/music.cpp
    scummvm/trunk/engines/queen/music.cpp
    scummvm/trunk/engines/saga/music.cpp
    scummvm/trunk/engines/saga/music.h
    scummvm/trunk/engines/sky/music/gmmusic.cpp
    scummvm/trunk/engines/sky/music/mt32music.cpp
    scummvm/trunk/engines/tinsel/tinsel.cpp
    scummvm/trunk/engines/touche/midi.cpp
    scummvm/trunk/sound/mididrv.cpp
    scummvm/trunk/sound/mididrv.h

Modified: scummvm/trunk/engines/agi/sound_midi.cpp
===================================================================
--- scummvm/trunk/engines/agi/sound_midi.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/agi/sound_midi.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -74,8 +74,12 @@
 	DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB);
 	_driver = MidiDriver::createMidi(dev);
 
-	if (ConfMan.getBool("native_mt32"))
+	if (ConfMan.getBool("native_mt32") || MidiDriver::getMusicType(dev) == MT_MT32) {
+		_nativeMT32 = true;
 		_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
+	} else {
+		_nativeMT32 = false;
+	}
 
 	memset(_channel, 0, sizeof(_channel));
 	memset(_channelVolume, 255, sizeof(_channelVolume));
@@ -125,10 +129,10 @@
 
 	_driver->setTimerCallback(this, &onTimer);
 
-	// General MIDI System On message
-	// Resets all GM devices to default settings
-	_driver->sysEx((const byte *)"\x7E\x7F\x09\x01", 4);
-	g_system->delayMillis(20);
+	if (_nativeMT32)
+		_driver->sendMT32Reset();
+	else
+		_driver->sendGMReset();
 
 	return 0;
 }

Modified: scummvm/trunk/engines/agos/agos.cpp
===================================================================
--- scummvm/trunk/engines/agos/agos.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/agos/agos.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -562,11 +562,11 @@
 
 		_driver = MidiDriver::createMidi(dev);
 
-		if (_nativeMT32) {
+		if (_nativeMT32)
 			_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
-		}
 
-		_midi.mapMT32toGM (getGameType() != GType_SIMON2 && !_nativeMT32);
+		_midi.setNativeMT32(_nativeMT32);
+		_midi.mapMT32toGM(getGameType() != GType_SIMON2 && !_nativeMT32);
 
 		_midi.setDriver(_driver);
 

Modified: scummvm/trunk/engines/agos/midi.cpp
===================================================================
--- scummvm/trunk/engines/agos/midi.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/agos/midi.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -77,10 +77,10 @@
 		return ret;
 	_driver->setTimerCallback(this, &onTimer);
 
-	// General MIDI System On message
-	// Resets all GM devices to default settings
-	_driver->sysEx((const byte *)"\x7E\x7F\x09\x01", 4);
-	g_system->delayMillis(20);
+	if (_nativeMT32)
+		_driver->sendMT32Reset();
+	else
+		_driver->sendGMReset();
 
 	return 0;
 }

Modified: scummvm/trunk/engines/agos/midi.h
===================================================================
--- scummvm/trunk/engines/agos/midi.h	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/agos/midi.h	2010-09-15 22:00:20 UTC (rev 52736)
@@ -61,6 +61,7 @@
 	MidiDriver *_driver;
 	bool _map_mt32_to_gm;
 	bool _passThrough;
+	bool _nativeMT32;
 
 	MusicInfo _music;
 	MusicInfo _sfx;
@@ -97,6 +98,7 @@
 	void loadS1D(Common::File *in, bool sfx = false);
 
 	void mapMT32toGM(bool map);
+	void setNativeMT32(bool nativeMT32) { _nativeMT32 = nativeMT32; }
 	void setLoop(bool loop);
 	void startTrack(int track);
 	void queueTrack(int track, bool loop);

Modified: scummvm/trunk/engines/draci/draci.cpp
===================================================================
--- scummvm/trunk/engines/draci/draci.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/draci/draci.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -170,6 +170,7 @@
 
 	_music = new MusicPlayer(_midiDriver, musicPathMask);
 	_music->setNativeMT32(native_mt32);
+	_music->open();
 	//_music->setAdLib(adlib);
 
 	// Load the game's fonts

Modified: scummvm/trunk/engines/draci/music.cpp
===================================================================
--- scummvm/trunk/engines/draci/music.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/draci/music.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -40,13 +40,8 @@
 	memset(_channel, 0, sizeof(_channel));
 	memset(_channelVolume, 255, sizeof(_channelVolume));
 	_masterVolume = 0;
-	this->open();
 	_smfParser = MidiParser::createParser_SMF();
 	_midiMusicData = NULL;
-
-	// TODO: Load cmf.ins with the instrument table.  It seems that an
-	// interface for such an operation is supported for AdLib.  Maybe for
-	// this card, setting instruments is necessary.
 }
 
 MusicPlayer::~MusicPlayer() {
@@ -89,6 +84,15 @@
 	if (ret)
 		return ret;
 
+	if (_nativeMT32)
+		_driver->sendMT32Reset();
+	else
+		_driver->sendGMReset();
+
+	// TODO: Load cmf.ins with the instrument table.  It seems that an
+	// interface for such an operation is supported for AdLib.  Maybe for
+	// this card, setting instruments is necessary.
+
 	_driver->setTimerCallback(this, &onTimer);
 	return 0;
 }

Modified: scummvm/trunk/engines/groovie/music.cpp
===================================================================
--- scummvm/trunk/engines/groovie/music.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/groovie/music.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -427,10 +427,14 @@
 				setTimbreAD(9, _timbres[i]);
 		}
 	} else if ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32")) {
+		_driver->sendMT32Reset();
+
 		// MT-32
 		_musicType = MT_MT32;
 		loadTimbres(gtlName + ".mt");
 	} else {
+		_driver->sendGMReset();
+
 		// GM
 		_musicType = 0;
 	}

Modified: scummvm/trunk/engines/lure/sound.cpp
===================================================================
--- scummvm/trunk/engines/lure/sound.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/lure/sound.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -63,8 +63,12 @@
 		_driver = NULL;
 
 	} else {
-		if (_nativeMT32)
+		if (_nativeMT32) {
 			_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
+			_driver->sendMT32Reset();
+		} else {
+			_driver->sendGMReset();
+		}
 
 		for (index = 0; index < NUM_CHANNELS; ++index) {
 			_channelsInner[index].midiChannel = _driver->allocateChannel();

Modified: scummvm/trunk/engines/made/made.cpp
===================================================================
--- scummvm/trunk/engines/made/made.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/made/made.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -107,6 +107,7 @@
 
 	_music = new MusicPlayer(driver);
 	_music->setNativeMT32(native_mt32);
+	_music->open();
 	//_music->setAdLib(adlib);
 
 	// Set default sound frequency

Modified: scummvm/trunk/engines/made/music.cpp
===================================================================
--- scummvm/trunk/engines/made/music.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/made/music.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -40,7 +40,6 @@
 MusicPlayer::MusicPlayer(MidiDriver *driver) : _parser(0), _driver(driver), _looping(false), _isPlaying(false), _passThrough(false), _isGM(false) {
 	memset(_channel, 0, sizeof(_channel));
 	_masterVolume = 0;
-	this->open();
 	_xmidiParser = MidiParser::createParser_XMIDI();
 	_smfParser = MidiParser::createParser_SMF();
 }
@@ -81,6 +80,11 @@
 	if (ret)
 		return ret;
 
+	if (_nativeMT32)
+		_driver->sendMT32Reset();
+	else
+		_driver->sendGMReset();
+
 	_driver->setTimerCallback(this, &onTimer);
 	return 0;
 }

Modified: scummvm/trunk/engines/queen/music.cpp
===================================================================
--- scummvm/trunk/engines/queen/music.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/queen/music.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -82,6 +82,11 @@
 	_driver->open();
 	_driver->setTimerCallback(this, &timerCallback);
 
+	if (_nativeMT32)
+		_driver->sendMT32Reset();
+	else
+		_driver->sendGMReset();
+
 	_parser = MidiParser::createParser_SMF();
 	_parser->setMidiDriver(this);
 	_parser->setTimerRate(_driver->getBaseTempo());

Modified: scummvm/trunk/engines/saga/music.cpp
===================================================================
--- scummvm/trunk/engines/saga/music.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/saga/music.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -60,6 +60,19 @@
 	delete _driver;
 }
 
+int MusicDriver::open() {
+	int retValue = _driver->open();
+	if (retValue)
+		return retValue;
+
+	if (_nativeMT32)
+		_driver->sendMT32Reset();
+	else
+		_driver->sendGMReset();
+
+	return 0;
+}
+
 void MusicDriver::setVolume(int volume) {
 	volume = CLIP(volume, 0, 255);
 

Modified: scummvm/trunk/engines/saga/music.h
===================================================================
--- scummvm/trunk/engines/saga/music.h	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/saga/music.h	2010-09-15 22:00:20 UTC (rev 52736)
@@ -57,7 +57,7 @@
 	void setGM(bool isGM) { _isGM = isGM; }
 
 	//MidiDriver interface implementation
-	int open() { return _driver->open(); }
+	int open();
 	void close() { _driver->close(); }
 	void send(uint32 b);
 

Modified: scummvm/trunk/engines/sky/music/gmmusic.cpp
===================================================================
--- scummvm/trunk/engines/sky/music/gmmusic.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/sky/music/gmmusic.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -44,6 +44,7 @@
 		error("Can't open midi device. Errorcode: %d", midiRes);
 	_timerCount = 0;
 	_midiDrv->setTimerCallback(this, passTimerFunc);
+	_midiDrv->sendGMReset();
 }
 
 GmMusic::~GmMusic() {

Modified: scummvm/trunk/engines/sky/music/mt32music.cpp
===================================================================
--- scummvm/trunk/engines/sky/music/mt32music.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/sky/music/mt32music.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -44,6 +44,7 @@
 		error("Can't open midi device. Errorcode: %d",midiRes);
 	_timerCount = 0;
 	_midiDrv->setTimerCallback(this, passTimerFunc);
+	_midiDrv->sendMT32Reset();
 }
 
 MT32Music::~MT32Music() {

Modified: scummvm/trunk/engines/tinsel/tinsel.cpp
===================================================================
--- scummvm/trunk/engines/tinsel/tinsel.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/tinsel/tinsel.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -867,6 +867,11 @@
 	//_midiMusic->setNativeMT32(native_mt32);
 	//_midiMusic->setAdLib(adlib);
 
+	if (native_mt32)
+		_driver->sendMT32Reset();
+	else
+		_driver->sendGMReset();
+
 	_musicVolume = ConfMan.getInt("music_volume");
 
 	_sound = new SoundManager(this);

Modified: scummvm/trunk/engines/touche/midi.cpp
===================================================================
--- scummvm/trunk/engines/touche/midi.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/engines/touche/midi.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -101,6 +101,11 @@
 		_parser->setMidiDriver(this);
 		_parser->setTimerRate(_driver->getBaseTempo());
 		_driver->setTimerCallback(this, &timerCallback);
+
+		if (_nativeMT32)
+			_driver->sendMT32Reset();
+		else
+			_driver->sendGMReset();
 	}
 	return ret;
 }

Modified: scummvm/trunk/sound/mididrv.cpp
===================================================================
--- scummvm/trunk/sound/mididrv.cpp	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/sound/mididrv.cpp	2010-09-15 22:00:20 UTC (rev 52736)
@@ -306,3 +306,16 @@
 
 	return 0;
 }
+
+void MidiDriver::sendMT32Reset() {
+	static const byte resetSysEx[] = { 0x41, 0x10, 0x16, 0x12, 0x7F, 0x00, 0x00, 0x01, 0x00 };
+	sysEx(resetSysEx, sizeof(resetSysEx));
+	g_system->delayMillis(100);
+}
+
+void MidiDriver::sendGMReset() {
+	static const byte resetSysEx[] = { 0x7E, 0x7F, 0x09, 0x01 };
+	sysEx(resetSysEx, sizeof(resetSysEx));
+	g_system->delayMillis(100);
+}
+

Modified: scummvm/trunk/sound/mididrv.h
===================================================================
--- scummvm/trunk/sound/mididrv.h	2010-09-15 20:28:42 UTC (rev 52735)
+++ scummvm/trunk/sound/mididrv.h	2010-09-15 22:00:20 UTC (rev 52736)
@@ -216,6 +216,16 @@
 	}
 
 	/**
+	 * Send a Roland MT-32 reset sysEx to the midi device.
+	 */
+	void sendMT32Reset();
+
+	/**
+	 * Send a General MIDI reset sysEx to the midi device.
+	 */
+	void sendGMReset();
+
+	/**
 	 * Transmit a sysEx to the midi device.
 	 *
 	 * The given msg MUST NOT contain the usual SysEx frame, i.e.


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