[Scummvm-cvs-logs] SF.net SVN: scummvm: [23917] scummvm/trunk

eriktorbjorn at users.sourceforge.net eriktorbjorn at users.sourceforge.net
Sun Sep 17 17:26:05 CEST 2006


Revision: 23917
          http://svn.sourceforge.net/scummvm/?rev=23917&view=rev
Author:   eriktorbjorn
Date:     2006-09-17 08:25:59 -0700 (Sun, 17 Sep 2006)

Log Message:
-----------
Only decompress the number of speech samples indicated by 'resSize'. This
prevents crashes in the demo, and is probably a good idea anyway.

Modified Paths:
--------------
    scummvm/trunk/NEWS
    scummvm/trunk/engines/sword1/sound.cpp

Modified: scummvm/trunk/NEWS
===================================================================
--- scummvm/trunk/NEWS	2006-09-17 13:06:40 UTC (rev 23916)
+++ scummvm/trunk/NEWS	2006-09-17 15:25:59 UTC (rev 23917)
@@ -38,6 +38,9 @@
  BASS:
    - Fixed character spacing in LINC terminals in floppy version v0.0303
 
+ Broken Sword 1:
+   - Fixed speech-related crashes.
+
  Broken Sword 2:
    - More robust handling of the optional startup.inf file.
 

Modified: scummvm/trunk/engines/sword1/sound.cpp
===================================================================
--- scummvm/trunk/engines/sword1/sound.cpp	2006-09-17 13:06:40 UTC (rev 23916)
+++ scummvm/trunk/engines/sword1/sound.cpp	2006-09-17 15:25:59 UTC (rev 23917)
@@ -260,24 +260,30 @@
 		uint32 srcPos = headerPos >> 1;
 		cSize /= 2;
 		uint32 dstPos = 0;
-		/* alloc 200 additional bytes, as the demo sometimes has ASCII junk
-		   at the end of the wave data */
-		int16 *dstData = (int16*)malloc(resSize * 2 + 200);
-		while (srcPos < cSize) {
+		int16 *dstData = (int16*)malloc(resSize * 2);
+		int32 samplesLeft = resSize;
+		while (srcPos < cSize && samplesLeft > 0) {
 			int16 length = (int16)READ_LE_UINT16(srcData + srcPos);
 			srcPos++;
 			if (length < 0) {
 				length = -length;
+				if (length > samplesLeft)
+					length = samplesLeft;
 				for (uint16 cnt = 0; cnt < (uint16)length; cnt++)
 					dstData[dstPos++] = srcData[srcPos];
 				srcPos++;
 			} else {
+				if (length > samplesLeft)
+					length = samplesLeft;
 				memcpy(dstData + dstPos, srcData + srcPos, length * 2);
 				dstPos += length;
 				srcPos += length;
 			}
+			samplesLeft -= length;
 		}
-		assert(dstPos < (uint32)resSize + 100);
+		if (samplesLeft > 0) {
+			memset(dstData + dstPos, 0, samplesLeft * 2);
+		}
 		if (_cowMode == CowDemo) // demo has wave output size embedded in the compressed data
 			*(uint32*)dstData = 0;
 		free(fBuf);


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