[Scummvm-git-logs] scummvm master -> e77a3c7dd6765c6d6d3e191914caff7b6a9465a6
athrxx
noreply at scummvm.org
Fri Jul 31 23:50:58 UTC 2026
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
e77a3c7dd6 SCUMM: (INDY4) - imuse fix (bug no. 17036)
Commit: e77a3c7dd6765c6d6d3e191914caff7b6a9465a6
https://github.com/scummvm/scummvm/commit/e77a3c7dd6765c6d6d3e191914caff7b6a9465a6
Author: athrxx (athrxx at scummvm.org)
Date: 2026-08-01T01:50:23+02:00
Commit Message:
SCUMM: (INDY4) - imuse fix (bug no. 17036)
Changed paths:
engines/scumm/imuse/imuse.cpp
engines/scumm/imuse/imuse_internal.h
engines/scumm/imuse/imuse_part.cpp
engines/scumm/imuse/imuse_player.cpp
engines/scumm/imuse/sysex_scumm.cpp
diff --git a/engines/scumm/imuse/imuse.cpp b/engines/scumm/imuse/imuse.cpp
index 7ec2d8ada65..62ec034945f 100644
--- a/engines/scumm/imuse/imuse.cpp
+++ b/engines/scumm/imuse/imuse.cpp
@@ -1643,7 +1643,7 @@ MidiChannel *IMuseInternal::allocateChannel(MidiDriver *midi, byte prio) {
}
if (best) {
- best->off();
+ best->off(true);
suspendPart(best);
mc = midi->allocateChannel();
}
@@ -1725,7 +1725,7 @@ void IMuseInternal::reallocateMidiChannels(MidiDriver *midi) {
if (lopart == nullptr || lopri >= hipri)
return;
- lopart->off();
+ lopart->off(true);
if ((hipart->_mc = midi->allocateChannel()) == nullptr)
return;
diff --git a/engines/scumm/imuse/imuse_internal.h b/engines/scumm/imuse/imuse_internal.h
index 71206e58455..2237d8012ac 100644
--- a/engines/scumm/imuse/imuse_internal.h
+++ b/engines/scumm/imuse/imuse_internal.h
@@ -363,7 +363,7 @@ struct Part : public Common::Serializable {
void init(bool useNativeMT32);
void setup(Player *player);
void uninit();
- void off();
+ void off(bool releaseChannel);
void set_instrument(uint b);
void set_instrument(byte *data);
void load_global_instrument(byte b);
diff --git a/engines/scumm/imuse/imuse_part.cpp b/engines/scumm/imuse/imuse_part.cpp
index 6401dc1fbde..a87deb37587 100644
--- a/engines/scumm/imuse/imuse_part.cpp
+++ b/engines/scumm/imuse/imuse_part.cpp
@@ -216,16 +216,8 @@ void Part::pitchBendFactor(byte value) {
void Part::set_onoff(bool on) {
if (_on != on) {
_on = on;
- if (!on) {
- if (!_se->_dynamicChanAllocation) {
- if (_mc) {
- _mc->sustain(false);
- _mc->allNotesOff();
- }
- } else {
- off();
- }
- }
+ if (!on)
+ off(_se->_dynamicChanAllocation);
if (!_percussion)
_player->_se->reallocateMidiChannels(_player->getMidiDriver());
}
@@ -341,18 +333,22 @@ void Part::setup(Player *player) {
void Part::uninit() {
if (!_player)
return;
- off();
+ off(false);
+ if (_mc && !_se->reassignChannelAndResumePart(_mc))
+ _mc->release();
+ _mc = nullptr;
_player->removePart(this);
_se->removeSuspendedPart(this);
_player = nullptr;
}
-void Part::off() {
+void Part::off(bool releaseChannel) {
if (_mc) {
_mc->sustain(false);
_mc->allNotesOff();
- if (!_se->reassignChannelAndResumePart(_mc))
- _mc->release();
+ if (!releaseChannel)
+ return;
+ _mc->release();
_mc = nullptr;
}
}
diff --git a/engines/scumm/imuse/imuse_player.cpp b/engines/scumm/imuse/imuse_player.cpp
index 8ca3c161343..44cdee0b067 100644
--- a/engines/scumm/imuse/imuse_player.cpp
+++ b/engines/scumm/imuse/imuse_player.cpp
@@ -789,17 +789,9 @@ int Player::scan(uint totrack, uint tobeat, uint totick) {
}
void Player::turn_off_parts() {
- Part *part;
-
- if (!_se->_dynamicChanAllocation) {
- turn_off_pedals();
- for (part = _parts; part; part = part->_next)
- part->allNotesOff();
- } else {
- for (part = _parts; part; part = part->_next)
- part->off();
- _se->reallocateMidiChannels(_midi);
- }
+ for (Part *part = _parts; part; part = part->_next)
+ part->off(_se->_dynamicChanAllocation);
+ _se->reallocateMidiChannels(_midi);
}
void Player::play_active_notes() {
diff --git a/engines/scumm/imuse/sysex_scumm.cpp b/engines/scumm/imuse/sysex_scumm.cpp
index 2dd43337d26..47118d6b6dc 100644
--- a/engines/scumm/imuse/sysex_scumm.cpp
+++ b/engines/scumm/imuse/sysex_scumm.cpp
@@ -80,7 +80,7 @@ void sysexHandler_Scumm(Player *player, const byte *msg, uint16 len) {
part->pitchBendFactor(buf[7]);
if (part->_percussion) {
if (part->_mc)
- part->off();
+ part->off(true);
} else {
if (player->_isMIDI) {
// Even in cases where a program does not seem to be specified,
More information about the Scummvm-git-logs
mailing list