[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