diff options
Diffstat (limited to 'scumm')
-rw-r--r-- | scumm/imuse.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/scumm/imuse.cpp b/scumm/imuse.cpp index a1fd7dddf6..826def887a 100644 --- a/scumm/imuse.cpp +++ b/scumm/imuse.cpp @@ -1200,7 +1200,7 @@ void IMuseInternal::initMT32(MidiDriver *midi) { byte checksum = 0; for (int i = 4; i < 27; ++i) checksum -= buffer[i]; - buffer[27] = checksum; + buffer[27] = checksum & 0x7F; midi->sysEx(buffer, 28); g_system->delay_msecs (500); @@ -1224,12 +1224,27 @@ void IMuseInternal::init_queue() { } void IMuseInternal::pause(bool paused) { + if (_paused == paused) + return; int vol = _music_volume; if (paused) _music_volume = 0; update_volumes(); _music_volume = vol; + // Kill master volume on the MT-32, because for some + // reason the MT-32 often fails to respond to the + // channel volume update for a single channel. + // (Ref Bug #817871. Reportedly happens in the + // original distro, too.) + if (_midi_native && _native_mt32) { + byte buffer[8]; + memcpy(buffer, "\x41\x10\x16\x10\x00\x16", 6); + buffer[6] = paused ? 0 : 100; + buffer[7] = (0 - 0x10 - 0x16 - buffer[6]) & 0x7F; // Checksum + _midi_native->sysEx (buffer, 8); + } + _paused = paused; } |