diff options
-rw-r--r-- | engines/sci/sound/drivers/midi.cpp | 51 |
1 files changed, 33 insertions, 18 deletions
diff --git a/engines/sci/sound/drivers/midi.cpp b/engines/sci/sound/drivers/midi.cpp index 6821b2219f..3f6149daf9 100644 --- a/engines/sci/sound/drivers/midi.cpp +++ b/engines/sci/sound/drivers/midi.cpp @@ -134,6 +134,12 @@ public: kMaxSysExSize = 264 }; + enum Mt32Type { + kMt32TypeNone, + kMt32TypeReal, + kMt32TypeEmulated + }; + MidiPlayer_Midi(SciVersion version); virtual ~MidiPlayer_Midi(); @@ -191,7 +197,7 @@ private: keyShift(0), volAdjust(0), pan(0x40), hold(0), volume(0x7f) { } }; - bool _isMt32; + Mt32Type _mt32Type; bool _useMT32Track; bool _hasReverb; bool _playSwitch; @@ -214,12 +220,17 @@ private: byte _sysExBuf[kMaxSysExSize]; }; -MidiPlayer_Midi::MidiPlayer_Midi(SciVersion version) : MidiPlayer(version), _playSwitch(true), _masterVolume(15), _isMt32(false), _hasReverb(false), _useMT32Track(true) { +MidiPlayer_Midi::MidiPlayer_Midi(SciVersion version) : MidiPlayer(version), _playSwitch(true), _masterVolume(15), _mt32Type(kMt32TypeNone), _hasReverb(false), _useMT32Track(true) { MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI); _driver = MidiDriver::createMidi(dev); - if (MidiDriver::getMusicType(dev) == MT_MT32 || ConfMan.getBool("native_mt32")) - _isMt32 = true; + if (MidiDriver::getMusicType(dev) == MT_MT32 || ConfMan.getBool("native_mt32")) { + if (MidiDriver::getDeviceString(dev, MidiDriver::kDriverId) == "mt32") { + _mt32Type = kMt32TypeEmulated; + } else { + _mt32Type = kMt32TypeReal; + } + } _sysExBuf[0] = 0x41; _sysExBuf[1] = 0x10; @@ -439,13 +450,13 @@ void MidiPlayer_Midi::send(uint32 b) { // We return 1 for mt32, because if we remap channels to 0 for mt32, those won't get played at all // NOTE: SSCI uses channels 1 through 8 for General MIDI as well, in the drivers I checked int MidiPlayer_Midi::getFirstChannel() const { - if (_isMt32) + if (_mt32Type != kMt32TypeNone) return 1; return 0; } int MidiPlayer_Midi::getLastChannel() const { - if (_isMt32) + if (_mt32Type != kMt32TypeNone) return 8; return 15; } @@ -998,8 +1009,10 @@ void MidiPlayer_Midi::resetMt32() { Common::MemoryReadStream s((const byte *)"\x01\x00", 2); sendMt32SysEx(0x7f0000, s, 2, true); - // This seems to require a longer delay than usual - g_system->delayMillis(150); + if (_mt32Type != kMt32TypeEmulated) { + // This seems to require a longer delay than usual + g_sci->sleep(150); + } } int MidiPlayer_Midi::open(ResourceManager *resMan) { @@ -1038,7 +1051,7 @@ int MidiPlayer_Midi::open(ResourceManager *resMan) { } } - if (_isMt32) { + if (_mt32Type != kMt32TypeNone) { // MT-32 resetMt32(); @@ -1145,7 +1158,7 @@ int MidiPlayer_Midi::open(ResourceManager *resMan) { } void MidiPlayer_Midi::close() { - if (_isMt32) { + if (_mt32Type != kMt32TypeNone) { // Send goodbye message sendMt32SysEx(0x200000, SciSpan<const byte>(_goodbyeMsg, 20), true); } @@ -1156,15 +1169,17 @@ void MidiPlayer_Midi::close() { void MidiPlayer_Midi::sysEx(const byte *msg, uint16 length) { _driver->sysEx(msg, length); - // Wait the time it takes to send the SysEx data - uint32 delay = (length + 2) * 1000 / 3125; + if (_mt32Type != kMt32TypeEmulated) { + // Wait the time it takes to send the SysEx data + uint32 delay = (length + 2) * 1000 / 3125; - // Plus an additional delay for the MT-32 rev00 - if (_isMt32) - delay += 40; + // Plus an additional delay for the MT-32 rev00 + if (_mt32Type == kMt32TypeReal) + delay += 40; - g_system->updateScreen(); - g_sci->sleep(delay); + g_system->updateScreen(); + g_sci->sleep(delay); + } } byte MidiPlayer_Midi::getPlayId() const { @@ -1173,7 +1188,7 @@ byte MidiPlayer_Midi::getPlayId() const { case SCI_VERSION_0_LATE: return 0x01; default: - if (_isMt32) + if (_mt32Type != kMt32TypeNone) return 0x0c; else return _useMT32Track ? 0x0c : 0x07; |