[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