[Scummvm-git-logs] scummvm master -> 5ea8e62e5315c940556b27d6fbf91a4e278e4e6c

aquadran aquadran at gmail.com
Sun Nov 22 19:56:54 UTC 2020


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
8be297ea4f SCUMM: COMI: handle edge-case for "start" marker in iMUSE Digital
5ea8e62e53 SCUMM: COMI: improve handling of iMUSE markers and triggers


Commit: 8be297ea4fcb6dc56b28e7484913f149e6ff796d
    https://github.com/scummvm/scummvm/commit/8be297ea4fcb6dc56b28e7484913f149e6ff796d
Author: Andrea Boscarino (andrea.boscarino at studio.unibo.it)
Date: 2020-11-22T20:56:50+01:00

Commit Message:
SCUMM: COMI: handle edge-case for "start" marker in iMUSE Digital

Changed paths:
    engines/scumm/imuse_digi/dimuse.cpp
    engines/scumm/imuse_digi/dimuse_sndmgr.cpp


diff --git a/engines/scumm/imuse_digi/dimuse.cpp b/engines/scumm/imuse_digi/dimuse.cpp
index 28cf2c7942..fb6d9f37df 100644
--- a/engines/scumm/imuse_digi/dimuse.cpp
+++ b/engines/scumm/imuse_digi/dimuse.cpp
@@ -459,9 +459,16 @@ void IMuseDigital::switchToNextRegion(Track *track) {
 			track->curRegion = region;
 			debug(5, "SwToNeReg(trackId:%d) - sound(%d) jump to region %d, curHookId: %d", track->trackId, track->soundId, track->curRegion, track->curHookId);
 			track->curHookId = 0;
-			
 		} else {
-			debug(5, "SwToNeReg(trackId:%d) - Normal switch region, sound(%d), hookId(%d)", track->trackId, track->soundId, track->curHookId);
+			// Check if the jump led to a  "start" marker; if so, we have to enforce it anyway.
+			// Fixes bug/edge-case #11956;
+			// Go see ImuseDigiSndMgr::getJumpIdByRegionAndHookId(...) for further information.
+			if (_vm->_game.id == GID_CMI && soundDesc->jump[jumpId].dest == soundDesc->marker[2].pos && !scumm_stricmp(soundDesc->marker[2].ptr, "start")) {
+				track->curRegion = region;
+				debug(5, "SwToNeReg(trackId:%d) - Enforced sound(%d) jump to region %d marked with a \"start\" marker, hookId(%d)", track->trackId, track->soundId, track->curRegion, track->curHookId);
+			} else {
+				debug(5, "SwToNeReg(trackId:%d) - Normal switch region, sound(%d), hookId(%d)", track->trackId, track->soundId, track->curHookId);
+			}
 		}
 	} else {
 		debug(5, "SwToNeReg(trackId:%d) - Normal switch region, sound(%d), hookId(%d)", track->trackId, track->soundId, track->curHookId);
diff --git a/engines/scumm/imuse_digi/dimuse_sndmgr.cpp b/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
index 618d7098a8..a34e24f28b 100644
--- a/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
+++ b/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
@@ -70,7 +70,7 @@ void ImuseDigiSndMgr::countElements(byte *ptr, int &numRegions, int &numJumps, i
 			size = READ_BE_UINT32(ptr); ptr += size + 4;
 			break;
 		case MKTAG('T','E','X','T'):
-			if (!scumm_stricmp((const char *)(ptr + 8), "exit"))
+			if (!scumm_stricmp((const char *)(ptr + 8), "exit") || _vm->_game.id == GID_CMI)
 				numMarkers++;
 			size = READ_BE_UINT32(ptr); ptr += size + 4;
 			break;
@@ -256,7 +256,7 @@ void ImuseDigiSndMgr::prepareSound(byte *ptr, SoundDesc *sound) {
 				sound->channels = READ_BE_UINT32(ptr); ptr += 4;
 				break;
 			case MKTAG('T','E','X','T'):
-				if (!scumm_stricmp((const char *)(ptr + 8), "exit")) {
+				if (!scumm_stricmp((const char *)(ptr + 8), "exit") || _vm->_game.id == GID_CMI) {
 					sound->marker[curIndexMarker].pos = READ_BE_UINT32(ptr + 4);
 					sound->marker[curIndexMarker].length = strlen((const char *)(ptr + 8)) + 1;
 					sound->marker[curIndexMarker].ptr = new char[sound->marker[curIndexMarker].length];
@@ -567,12 +567,26 @@ int ImuseDigiSndMgr::getJumpIdByRegionAndHookId(SoundDesc *soundDesc, int region
 	assert(checkForProperHandle(soundDesc));
 	assert(region >= 0 && region < soundDesc->numRegions);
 	int32 offset = soundDesc->region[region].offset;
+	int jumpIdCandidate = -1;
 	for (int l = 0; l < soundDesc->numJumps; l++) {
 		if (offset == soundDesc->jump[l].offset) {
+			jumpIdCandidate = l;
 			if (soundDesc->jump[l].hookId == hookId)
 				return l;
 		}
 	}
+	// We missed the jump because we didn't have the right hookId...
+	// ...but if that jump led to a region with a "start" marker we have to enforce it anyway!
+	// This fixes edge-cases (like bug #11956) where a different hookId than the one expected prevents us
+	// from playing the music track from the "start" marker, effectively playing also the
+	// silence (or ambient noise) which precedes it.
+	if (_vm->_game.id == GID_CMI)
+		if (jumpIdCandidate != -1) {
+			offset = soundDesc->jump[jumpIdCandidate].dest;
+			// Element 2 in marker[] should always be "start"
+			if (offset == soundDesc->marker[2].pos && !scumm_stricmp(soundDesc->marker[2].ptr, "start"))
+				return jumpIdCandidate;
+		}
 
 	return -1;
 }


Commit: 5ea8e62e5315c940556b27d6fbf91a4e278e4e6c
    https://github.com/scummvm/scummvm/commit/5ea8e62e5315c940556b27d6fbf91a4e278e4e6c
Author: Andrea Boscarino (andrea.boscarino at studio.unibo.it)
Date: 2020-11-22T20:56:50+01:00

Commit Message:
SCUMM: COMI: improve handling of iMUSE markers and triggers

Changed paths:
    engines/scumm/imuse_digi/dimuse.cpp
    engines/scumm/imuse_digi/dimuse_music.cpp
    engines/scumm/imuse_digi/dimuse_track.cpp


diff --git a/engines/scumm/imuse_digi/dimuse.cpp b/engines/scumm/imuse_digi/dimuse.cpp
index fb6d9f37df..3461f63fcc 100644
--- a/engines/scumm/imuse_digi/dimuse.cpp
+++ b/engines/scumm/imuse_digi/dimuse.cpp
@@ -414,20 +414,36 @@ void IMuseDigital::switchToNextRegion(Track *track) {
 	ImuseDigiSndMgr::SoundDesc *soundDesc = track->soundDesc;
 	if (_triggerUsed && track->soundDesc->numMarkers) {
 		if (_sound->checkForTriggerByRegionAndMarker(soundDesc, track->curRegion, _triggerParams.marker)) {
-			debug(5, "SwToNeReg(trackId:%d) - trigger %s reached", track->trackId, _triggerParams.marker);
-			debug(5, "SwToNeReg(trackId:%d) - exit current region %d", track->trackId, track->curRegion);
-			debug(5, "SwToNeReg(trackId:%d) - call cloneToFadeOutTrack(delay:%d)", track->trackId, _triggerParams.fadeOutDelay);
-			Track *fadeTrack = cloneToFadeOutTrack(track, _triggerParams.fadeOutDelay);
-			if (fadeTrack) {
-				fadeTrack->dataOffset = _sound->getRegionOffset(fadeTrack->soundDesc, fadeTrack->curRegion);
-				fadeTrack->regionOffset = 0;
-				debug(5, "SwToNeReg(trackId:%d)-sound(%d) select region %d, curHookId: %d", fadeTrack->trackId, fadeTrack->soundId, fadeTrack->curRegion, fadeTrack->curHookId);
-				fadeTrack->curHookId = 0;
+			if (_vm->_game.id != GID_CMI) {
+				debug(5, "SwToNeReg(trackId:%d) - trigger %s reached", track->trackId, _triggerParams.marker);
+				debug(5, "SwToNeReg(trackId:%d) - exit current region %d", track->trackId, track->curRegion);
+				debug(5, "SwToNeReg(trackId:%d) - call cloneToFadeOutTrack(delay:%d)", track->trackId, _triggerParams.fadeOutDelay);
+				Track *fadeTrack = cloneToFadeOutTrack(track, _triggerParams.fadeOutDelay);
+				if (fadeTrack) {
+					fadeTrack->dataOffset = _sound->getRegionOffset(fadeTrack->soundDesc, fadeTrack->curRegion);
+					fadeTrack->regionOffset = 0;
+					debug(5, "SwToNeReg(trackId:%d)-sound(%d) select region %d, curHookId: %d", fadeTrack->trackId, fadeTrack->soundId, fadeTrack->curRegion, fadeTrack->curHookId);
+					fadeTrack->curHookId = 0;
+				}
+				flushTrack(track);
+				startMusic(_triggerParams.filename, _triggerParams.soundId, _triggerParams.hookId, _triggerParams.volume);
+				_triggerUsed = false;
+				return;
+			} else {
+				// Behavior for "_end" (and "exit") marker
+				debug(5, "SwToNeReg(trackId:%d) - trigger %s reached", track->trackId, _triggerParams.marker);
+				debug(5, "SwToNeReg(trackId:%d) - exit current region %d", track->trackId, track->curRegion);
+				debug(5, "SwToNeReg(trackId:%d) - call handleComiFadeOut(delay:%d)", track->trackId, _triggerParams.fadeOutDelay);
+				handleComiFadeOut(track, _triggerParams.fadeOutDelay);
+				track->dataOffset = _sound->getRegionOffset(track->soundDesc, track->curRegion);
+				track->regionOffset = 0;
+				debug(5, "SwToNeReg(trackId:%d)-sound(%d) select region %d, curHookId: %d", track->trackId, track->soundId, track->curRegion, track->curHookId);
+				track->curHookId = 0;
+				if (!scumm_stricmp(_triggerParams.marker, "exit"))
+					startMusic(_triggerParams.filename, _triggerParams.soundId, _triggerParams.hookId, _triggerParams.volume);
+				_triggerUsed = false;
+				return;
 			}
-			flushTrack(track);
-			startMusic(_triggerParams.filename, _triggerParams.soundId, _triggerParams.hookId, _triggerParams.volume);
-			_triggerUsed = false;
-			return;
 		}
 	}
 
diff --git a/engines/scumm/imuse_digi/dimuse_music.cpp b/engines/scumm/imuse_digi/dimuse_music.cpp
index 48cac62eeb..9a20d2fe0a 100644
--- a/engines/scumm/imuse_digi/dimuse_music.cpp
+++ b/engines/scumm/imuse_digi/dimuse_music.cpp
@@ -322,6 +322,8 @@ void IMuseDigital::playComiMusic(const char *songName, const imuseComiTable *tab
 		return;
 	}
 
+	TriggerParams trigger;
+
 	switch (table->transitionType) {
 	case 0:
 	default:
@@ -330,12 +332,33 @@ void IMuseDigital::playComiMusic(const char *songName, const imuseComiTable *tab
 		setHookIdForMusic(table->hookId);
 		break;
 	case 9:
-		_stopingSequence = 1;
+		// Setup the trigger
+		strcpy(trigger.marker, "_end"); trigger.fadeOutDelay = table->fadeOutDelay;
+		strcpy(trigger.filename, table->filename); trigger.soundId = table->soundId;
+		trigger.hookId = table->hookId; trigger.volume = 127;
+		setTrigger(&trigger);
+
 		setHookIdForMusic(table->hookId);
 		break;
+	case 4:
+		if (table->filename[0] == 0) {
+			fadeOutMusic(60);
+			return;
+		}
+		if (getCurMusicSoundId() == table->soundId)
+			return;
+
+		// Setup the trigger
+		strcpy(trigger.marker, "_end"); trigger.fadeOutDelay = table->fadeOutDelay;
+		strcpy(trigger.filename, table->filename); trigger.soundId = table->soundId;
+		trigger.hookId = table->hookId; trigger.volume = 127;
+		setTrigger(&trigger);
+
+		fadeOutMusic(table->fadeOutDelay);
+		startMusic(table->filename, table->soundId, hookId, 127);
+		break;
 	case 2:
 	case 3:
-	case 4:
 	case 12:
 		if (table->filename[0] == 0) {
 			fadeOutMusic(60);
@@ -352,7 +375,7 @@ void IMuseDigital::playComiMusic(const char *songName, const imuseComiTable *tab
 				(table->attribPos == _comiStateMusicTable[_curMusicState].attribPos)) {
 			fadeOutMusicAndStartNew(table->fadeOutDelay, table->filename, table->soundId);
 		} else if (table->transitionType == 12) {
-			TriggerParams trigger;
+			// Setup the trigger
 			strcpy(trigger.marker, "exit"); trigger.fadeOutDelay = table->fadeOutDelay;
 			strcpy(trigger.filename, table->filename); trigger.soundId = table->soundId;
 			trigger.hookId = table->hookId; trigger.volume = 127;
diff --git a/engines/scumm/imuse_digi/dimuse_track.cpp b/engines/scumm/imuse_digi/dimuse_track.cpp
index 235209b5e4..b242b57010 100644
--- a/engines/scumm/imuse_digi/dimuse_track.cpp
+++ b/engines/scumm/imuse_digi/dimuse_track.cpp
@@ -353,9 +353,9 @@ void IMuseDigital::setTrigger(TriggerParams *trigger) {
 }
 
 Track *IMuseDigital::handleComiFadeOut(Track *track, int fadeDelay) {
-	track->volFadeDelay = fadeDelay;
+	track->volFadeDelay = fadeDelay != 0 ? fadeDelay : 60;
 	track->volFadeDest = 0;
-	track->volFadeStep = (track->volFadeDest - track->vol) * 60 * (1000 / _callbackFps) / (1000 * fadeDelay);
+	track->volFadeStep = (track->volFadeDest - track->vol) * 60 * (1000 / _callbackFps) / (1000 * track->volFadeDelay);
 	track->volFadeUsed = true;
 	track->toBeRemoved = true;
 	return track;




More information about the Scummvm-git-logs mailing list