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

aquadran at users.sourceforge.net aquadran at users.sourceforge.net
Tue Jan 15 13:51:27 CET 2008


Revision: 30494
          http://scummvm.svn.sourceforge.net/scummvm/?rev=30494&view=rev
Author:   aquadran
Date:     2008-01-15 04:51:26 -0800 (Tue, 15 Jan 2008)

Log Message:
-----------
implement loading markers "exit". dumped version 3 for compressed bun files, compress tools are not ready

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

Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.cpp	2008-01-15 12:28:56 UTC (rev 30493)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.cpp	2008-01-15 12:51:26 UTC (rev 30494)
@@ -58,19 +58,23 @@
 	delete _cacheBundleDir;
 }
 
-void ImuseDigiSndMgr::countElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs) {
+void ImuseDigiSndMgr::countElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs, int &numMarkers) {
 	uint32 tag;
 	int32 size = 0;
 
 	do {
 		tag = READ_BE_UINT32(ptr); ptr += 4;
 		switch (tag) {
-		case MKID_BE('TEXT'):
 		case MKID_BE('STOP'):
 		case MKID_BE('FRMT'):
 		case MKID_BE('DATA'):
 			size = READ_BE_UINT32(ptr); ptr += size + 4;
 			break;
+		case MKID_BE('TEXT'):
+			if (!scumm_stricmp((const char *)(ptr + 8), "exit"))
+				numMarkers++;
+			size = READ_BE_UINT32(ptr); ptr += size + 4;
+			break;
 		case MKID_BE('REGN'):
 			numRegions++;
 			size = READ_BE_UINT32(ptr); ptr += size + 4;
@@ -96,8 +100,8 @@
 	uint32 tag = file->readUint32BE();
 	assert(tag == MKID_BE('RMAP'));
 	int32 version = file->readUint32BE();
-	if (version != 2) {
-		error("ImuseDigiSndMgr::prepareSoundFromRMAP: Wrong version number, expected 2, but it's: %d.", version);
+	if (version != 3) {
+		error("ImuseDigiSndMgr::prepareSoundFromRMAP: Wrong version number, expected 3, but it's: %d.", version);
 	}
 	sound->bits = file->readUint32BE();
 	sound->freq = file->readUint32BE();
@@ -105,12 +109,16 @@
 	sound->numRegions = file->readUint32BE();
 	sound->numJumps = file->readUint32BE();
 	sound->numSyncs = file->readUint32BE();
+	sound->numMarkers = file->readUint32BE();
 	sound->region = new Region[sound->numRegions];
 	assert(sound->region);
 	sound->jump = new Jump[sound->numJumps];
 	assert(sound->jump);
 	sound->sync = new Sync[sound->numSyncs];
 	assert(sound->sync);
+	sound->marker = new Marker[sound->numMarkers];
+	assert(sound->marker);
+
 	for (l = 0; l < sound->numRegions; l++) {
 		sound->region[l].offset = file->readUint32BE();
 		sound->region[l].length = file->readUint32BE();
@@ -126,6 +134,12 @@
 		sound->sync[l].ptr = (byte *)malloc(sound->sync[l].size);
 		file->read(sound->sync[l].ptr, sound->sync[l].size);
 	}
+	for (l = 0; l < sound->numMarkers; l++) {
+		sound->marker[l].pos = file->readUint32BE();
+		sound->marker[l].length = file->readUint32BE();
+		sound->marker[l].ptr = new char[sound->marker[l].length];
+		file->read(sound->marker[l].ptr, sound->marker[l].length);
+	}
 }
 
 void ImuseDigiSndMgr::prepareSound(byte *ptr, SoundDesc *sound) {
@@ -207,17 +221,21 @@
 		int curIndexRegion = 0;
 		int curIndexJump = 0;
 		int curIndexSync = 0;
+		int curIndexMarker = 0;
 
 		sound->numRegions = 0;
 		sound->numJumps = 0;
 		sound->numSyncs = 0;
-		countElements(ptr, sound->numRegions, sound->numJumps, sound->numSyncs);
+		sound->numMarkers = 0;
+		countElements(ptr, sound->numRegions, sound->numJumps, sound->numSyncs, sound->numMarkers);
 		sound->region = new Region[sound->numRegions];
 		assert(sound->region);
 		sound->jump = new Jump[sound->numJumps];
 		assert(sound->jump);
 		sound->sync = new Sync[sound->numSyncs];
 		assert(sound->sync);
+		sound->marker = new Marker[sound->numMarkers];
+		assert(sound->marker);
 
 		do {
 			tag = READ_BE_UINT32(ptr); ptr += 4;
@@ -229,6 +247,15 @@
 				sound->channels = READ_BE_UINT32(ptr); ptr += 4;
 				break;
 			case MKID_BE('TEXT'):
+				if (!scumm_stricmp((const char *)(ptr + 8), "exit")) {
+					sound->marker[curIndexRegion].pos = READ_BE_UINT32(ptr + 4);
+					sound->marker[curIndexRegion].length = strlen((const char *)(ptr + 8)) + 1;
+					sound->marker[curIndexRegion].ptr = new char[sound->marker[curIndexRegion].length];
+					strcpy(sound->marker[curIndexRegion].ptr, (const char *)(ptr + 8));
+					curIndexMarker++;
+				}
+				size = READ_BE_UINT32(ptr); ptr += size + 4;
+				break;
 			case MKID_BE('STOP'):
 				size = READ_BE_UINT32(ptr); ptr += size + 4;
 				break;
@@ -451,6 +478,7 @@
 	delete[] soundDesc->region;
 	delete[] soundDesc->jump;
 	delete[] soundDesc->sync;
+	delete[] soundDesc->marker;
 	memset(soundDesc, 0, sizeof(SoundDesc));
 }
 

Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.h
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.h	2008-01-15 12:28:56 UTC (rev 30493)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.h	2008-01-15 12:51:26 UTC (rev 30494)
@@ -65,6 +65,12 @@
 		byte *ptr;			// pointer to sync
 	};
 
+	struct Marker {
+		int32 pos;			// position Markaer in sound data
+		int32 length;		// length of marker string
+		char *ptr;			// pointer to string
+	};
+
 public:
 
 	struct SoundDesc {
@@ -81,6 +87,9 @@
 		int numSyncs;		// number of Syncs
 		Sync *sync;
 
+		int numMarkers;		// number of Markers
+		Marker *marker;
+
 		bool endFlag;
 		bool inUse;
 		byte *allData;
@@ -113,7 +122,7 @@
 	bool openMusicBundle(SoundDesc *sound, int &disk);
 	bool openVoiceBundle(SoundDesc *sound, int &disk);
 
-	void countElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs);
+	void countElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs, int &numMarkers);
 
 public:
 


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