[Scummvm-cvs-logs] SF.net SVN: scummvm: [30503] scummvm/trunk/engines/scumm/imuse_digi

aquadran at users.sourceforge.net aquadran at users.sourceforge.net
Tue Jan 15 22:35:04 CET 2008


Revision: 30503
          http://scummvm.svn.sourceforge.net/scummvm/?rev=30503&view=rev
Author:   aquadran
Date:     2008-01-15 13:35:03 -0800 (Tue, 15 Jan 2008)

Log Message:
-----------
implement dimuse transition 12, not tested yet

Modified Paths:
--------------
    scummvm/trunk/engines/scumm/imuse_digi/dimuse.cpp
    scummvm/trunk/engines/scumm/imuse_digi/dimuse.h
    scummvm/trunk/engines/scumm/imuse_digi/dimuse_music.cpp
    scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
    scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.h
    scummvm/trunk/engines/scumm/imuse_digi/dimuse_track.cpp

Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse.cpp	2008-01-15 20:36:54 UTC (rev 30502)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse.cpp	2008-01-15 21:35:03 UTC (rev 30503)
@@ -101,6 +101,7 @@
 	memset(_attributes, 0, sizeof(_attributes));
 	_nextSeqToPlay = 0;
 	_stopingSequence = false;
+	_triggerUsed = false;
 }
 
 void IMuseDigital::saveOrLoad(Serializer *ser) {
@@ -364,6 +365,24 @@
 	}
 
 	ImuseDigiSndMgr::SoundDesc *soundDesc = track->soundDesc;
+	if (_triggerUsed && track->soundDesc->numMarkers) {
+		if (_sound->checkForTriggerByRegionAndMarker(soundDesc, track->curRegion, _triggerParams.marker)) {
+			debug(5, "trigger %s reached, switchToNextRegion(track:%d)", track->trackId, _triggerParams.marker);
+			debug(5, "exit current region, switchToNextRegion(track:%d)", track->trackId);
+			Track *fadeTrack = cloneToFadeOutTrack(track, _triggerParams.fadeOutDelay);
+			if (fadeTrack) {
+				fadeTrack->dataOffset = _sound->getRegionOffset(fadeTrack->soundDesc, fadeTrack->curRegion);
+				fadeTrack->regionOffset = 0;
+				debug(5, "switchToNextRegion-sound(%d) select region %d, curHookId: %d", fadeTrack->soundId, fadeTrack->curRegion, fadeTrack->curHookId);
+				fadeTrack->curHookId = 0;
+			}
+			flushTrack(track);
+			startMusic(_triggerParams.filename, _triggerParams.soundId, _triggerParams.hookId, _triggerParams.volume);
+			_triggerUsed = false;
+			return;
+		}
+	}
+
 	int jumpId = _sound->getJumpIdByRegionAndHookId(soundDesc, track->curRegion, track->curHookId);
 	if (jumpId == -1)
 		jumpId = _sound->getJumpIdByRegionAndHookId(soundDesc, track->curRegion, 0);

Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse.h
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse.h	2008-01-15 20:36:54 UTC (rev 30502)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse.h	2008-01-15 21:35:03 UTC (rev 30503)
@@ -117,6 +117,16 @@
 		}
 	};
 
+	struct TriggerParams {
+		char marker[10];
+		int fadeOutDelay;
+		char filename[13];
+		int soundId;
+		int hookId;
+		int volume;
+	} _triggerParams;
+	bool _triggerUsed;
+
 	Track *_track[MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS];
 
 	Common::Mutex _mutex;
@@ -150,6 +160,7 @@
 	int getSoundIdByName(const char *soundName);
 	void fadeOutMusic(int fadeDelay);
 	void fadeOutMusicAndStartNew(int fadeDelay, const char *filename, int soundId);
+	void setTrigger(TriggerParams *trigger);
 	void setHookIdForMusic(int hookId);
 	Track *cloneToFadeOutTrack(Track *track, int fadeDelay);
 

Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse_music.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse_music.cpp	2008-01-15 20:36:54 UTC (rev 30502)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse_music.cpp	2008-01-15 21:35:03 UTC (rev 30503)
@@ -328,8 +328,11 @@
 				(table->attribPos == _comiStateMusicTable[_curMusicState].attribPos)) {
 			fadeOutMusicAndStartNew(table->fadeOutDelay, table->filename, table->soundId);
 		} else if (table->transitionType == 12) {
-			fadeOutMusic(table->fadeOutDelay);
-			startMusic(table->filename, table->soundId, table->hookId, 127);
+			TriggerParams 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;
+			setTrigger(&trigger);
 		} else {
 			fadeOutMusic(table->fadeOutDelay);
 			startMusic(table->filename, table->soundId, hookId, 127);

Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.cpp	2008-01-15 20:36:54 UTC (rev 30502)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.cpp	2008-01-15 21:35:03 UTC (rev 30503)
@@ -567,6 +567,22 @@
 	return -1;
 }
 
+bool ImuseDigiSndMgr::checkForTriggerByRegionAndMarker(SoundDesc *soundDesc, int region, const char *marker) {
+	debug(5, "checkForTriggerByRegionAndMarker() region:%d, marker:%s", region, marker);
+	assert(checkForProperHandle(soundDesc));
+	assert(region >= 0 && region < soundDesc->numRegions);
+	assert(marker);
+	int32 offset = soundDesc->region[region].offset;
+	for (int l = 0; l < soundDesc->numMarkers; l++) {
+		if (offset == soundDesc->marker[l].pos) {
+			if (!stricmp(soundDesc->marker[l].ptr, marker))
+				return true;
+		}
+	}
+
+	return false;
+}
+
 void ImuseDigiSndMgr::getSyncSizeAndPtrById(SoundDesc *soundDesc, int number, int32 &sync_size, byte **sync_ptr) {
 	assert(checkForProperHandle(soundDesc));
 	assert(number >= 0);

Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.h
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.h	2008-01-15 20:36:54 UTC (rev 30502)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.h	2008-01-15 21:35:03 UTC (rev 30503)
@@ -142,6 +142,7 @@
 	int getNumJumps(SoundDesc *soundDesc);
 	int getRegionOffset(SoundDesc *soundDesc, int region);
 	int getJumpIdByRegionAndHookId(SoundDesc *soundDesc, int region, int hookId);
+	bool checkForTriggerByRegionAndMarker(SoundDesc *soundDesc, int region, const char *marker);
 	int getRegionIdByJumpId(SoundDesc *soundDesc, int jumpId);
 	int getJumpHookId(SoundDesc *soundDesc, int number);
 	int getJumpFade(SoundDesc *soundDesc, int number);

Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse_track.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse_track.cpp	2008-01-15 20:36:54 UTC (rev 30502)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse_track.cpp	2008-01-15 21:35:03 UTC (rev 30503)
@@ -322,6 +322,14 @@
 	}
 }
 
+void IMuseDigital::setTrigger(TriggerParams *trigger) {
+	Common::StackLock lock(_mutex, "IMuseDigital::setTrigger()");
+	debug(5, "IMuseDigital::setTrigger");
+
+	memcpy(&_triggerParams, trigger, sizeof(TriggerParams));
+	_triggerUsed = true;
+}
+
 IMuseDigital::Track *IMuseDigital::cloneToFadeOutTrack(Track *track, int fadeDelay) {
 	assert(track);
 	Track *fadeTrack;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list