[Scummvm-cvs-logs] SF.net SVN: scummvm: [30627] tools/branches/branch-0-11-0

aquadran at users.sourceforge.net aquadran at users.sourceforge.net
Thu Jan 24 00:12:56 CET 2008


Revision: 30627
          http://scummvm.svn.sourceforge.net/scummvm/?rev=30627&view=rev
Author:   aquadran
Date:     2008-01-23 15:12:56 -0800 (Wed, 23 Jan 2008)

Log Message:
-----------
backport fixes

Modified Paths:
--------------
    tools/branches/branch-0-11-0/compress_scumm_bun.cpp
    tools/branches/branch-0-11-0/compress_scumm_san.cpp

Modified: tools/branches/branch-0-11-0/compress_scumm_bun.cpp
===================================================================
--- tools/branches/branch-0-11-0/compress_scumm_bun.cpp	2008-01-23 21:00:34 UTC (rev 30626)
+++ tools/branches/branch-0-11-0/compress_scumm_bun.cpp	2008-01-23 23:12:56 UTC (rev 30627)
@@ -854,7 +854,7 @@
 	return outputBuf;
 }
 
-void countMapElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs) {
+void countMapElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs, int &numMarkers) {
 	uint32 tag;
 	int32 size = 0;
 
@@ -862,6 +862,10 @@
 		tag = READ_BE_UINT32(ptr); ptr += 4;
 		switch(tag) {
 		case 'TEXT':
+			if (!scumm_stricmp((const char *)(ptr + 8), "exit"))
+				numMarkers++;
+			size = READ_BE_UINT32(ptr); ptr += size + 4;
+			break;
 		case 'STOP':
 		case 'FRMT':
 		case 'DATA':
@@ -902,6 +906,12 @@
 	byte *ptr;
 };
 
+struct Marker {
+	int32 pos;
+	int32 length;
+	char *ptr;
+};
+
 static Region *_region;
 static int _numRegions;
 
@@ -992,14 +1002,16 @@
 	int curIndexRegion = 0;
 	int curIndexJump = 0;
 	int curIndexSync = 0;
+	int curIndexMarker = 0;
 
-	int numRegions = 0, numJumps = 0, numSyncs = 0;
-	countMapElements(ptr, numRegions, numJumps, numSyncs);
+	int numRegions = 0, numJumps = 0, numSyncs = 0, numMarkers = 0;
+	countMapElements(ptr, numRegions, numJumps, numSyncs, numMarkers);
 	Region *region = (Region *)malloc(sizeof(Region) * numRegions);
 	_region = (Region *)malloc(sizeof(Region) * numRegions);
 	_numRegions = numRegions;
 	Jump *jump = (Jump *)malloc(sizeof(Jump) * numJumps);
 	Sync *sync = (Sync *)malloc(sizeof(Sync) * numSyncs);
+	Marker *marker = (Marker *)malloc(sizeof(Marker) * numMarkers);
 
 	do {
 		tag = READ_BE_UINT32(ptr); ptr += 4;
@@ -1011,6 +1023,15 @@
 			channels = READ_BE_UINT32(ptr); ptr += 4;
 			break;
 		case 'TEXT':
+			if (!scumm_stricmp((const char *)(ptr + 8), "exit")) {
+				marker[curIndexMarker].pos = READ_BE_UINT32(ptr + 4);
+				marker[curIndexMarker].length = strlen((const char *)(ptr + 8)) + 1;
+				marker[curIndexMarker].ptr = new char[marker[curIndexMarker].length];
+				strcpy(marker[curIndexMarker].ptr, (const char *)(ptr + 8));
+				curIndexMarker++;
+			}
+			size = READ_BE_UINT32(ptr); ptr += size + 4;
+			break;
 		case 'STOP':
 			size = READ_BE_UINT32(ptr); ptr += size + 4;
 			break;
@@ -1050,13 +1071,14 @@
 	cbundleTable[cbundleCurIndex].offset = startPos;
 
 	writeUint32BE(output, 'RMAP');
-	writeUint32BE(output, 2); // version
+	writeUint32BE(output, 3); // version
 	writeUint32BE(output, 16); // bits
 	writeUint32BE(output, freq);
 	writeUint32BE(output, channels);
 	writeUint32BE(output, numRegions);
 	writeUint32BE(output, numJumps);
 	writeUint32BE(output, numSyncs);
+	writeUint32BE(output, numMarkers);
 	memcpy(_region, region, sizeof(Region) * numRegions);
 	for (l = 0; l < numRegions; l++) {
 		_region[l].offset -= offsetData;
@@ -1081,9 +1103,16 @@
 		fwrite(sync[l].ptr, sync[l].size, 1, output);
 		free(sync[l].ptr);
 	}
+	for (l = 0; l < numMarkers; l++) {
+		writeUint32BE(output, marker[l].pos);
+		writeUint32BE(output, marker[l].length);
+		fwrite(marker[l].ptr, marker[l].length, 1, output);
+		delete[] marker[l].ptr;
+	}
 	free(region);
 	free(jump);
 	free(sync);
+	free(marker);
 
 	cbundleTable[cbundleCurIndex].size = ftell(output) - startPos;
 	cbundleCurIndex++;

Modified: tools/branches/branch-0-11-0/compress_scumm_san.cpp
===================================================================
--- tools/branches/branch-0-11-0/compress_scumm_san.cpp	2008-01-23 21:00:34 UTC (rev 30626)
+++ tools/branches/branch-0-11-0/compress_scumm_san.cpp	2008-01-23 23:12:56 UTC (rev 30627)
@@ -66,6 +66,7 @@
 	int *sizes;
 	int nbframes;
 	int countFrames;
+	int lastFrame;
 	int32 sdatSize;
 };
 
@@ -257,12 +258,21 @@
 
 AudioTrackInfo *findAudioTrack(int trackId) {
 	for (int l = 0; l < MAX_TRACKS; l++) {
-		if ((_audioTracks[l].trackId == trackId) && (_audioTracks[l].used) && (_audioTracks[l].file))
+		if (_audioTracks[l].trackId == trackId && _audioTracks[l].used && _audioTracks[l].file)
 			return &_audioTracks[l];
 	}
 	return NULL;
 }
 
+void flushTracks(int frame) {
+	for (int l = 0; l < MAX_TRACKS; l++) {
+		if (_audioTracks[l].used && _audioTracks[l].file && (frame - _audioTracks[l].lastFrame) > 1) {
+			fclose(_audioTracks[l].file);
+			_audioTracks[l].file = NULL;
+		}
+	}
+}
+
 void prepareForMixing(char *outputDir, char *inputFilename) {
 	char filename[200];
 
@@ -554,6 +564,7 @@
 			audioTrack->sdatSize = handleSaudChunk(audioTrack, input);
 			audioTrack->sdatSize *= 4;
 			size -= (ftell(input) - pos) + 10;
+			audioTrack->lastFrame = frame;
 		}
 		sprintf(tmpPath, "%s/%s_%04d_%03d.tmp", outputDir, inputFilename, frame, trackId);
 		audioTrack->file = fopen(tmpPath, "wb");
@@ -562,12 +573,16 @@
 			exit(1);
 		}
 	} else {
+		if (!iact)
+			flushTracks(frame);
 		audioTrack = findAudioTrack(trackId);
 		assert(audioTrack);
 		if (iact)
 			size -= 18;
-		else
+		else {
 			size -= 10;
+			audioTrack->lastFrame = frame;
+		}
 	}
 	byte *buffer = (byte *)malloc(size);
 	fread(buffer, size, 1, input);
@@ -586,7 +601,8 @@
 		audioTrack->sizes[index] *= 2;
 	audioTrack->countFrames++;
 	if ((index + 1) == nbframes) {
-		fclose(audioTrack->file);
+		if (audioTrack->file)
+			fclose(audioTrack->file);
 		audioTrack->file = NULL;
 	}
 }


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