[Scummvm-cvs-logs] SF.net SVN: scummvm:[48912] scummvm/trunk/engines/sci/sound/audio.cpp

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Mon May 3 17:10:26 CEST 2010


Revision: 48912
          http://scummvm.svn.sourceforge.net/scummvm/?rev=48912&view=rev
Author:   m_kiewitz
Date:     2010-05-03 15:10:25 +0000 (Mon, 03 May 2010)

Log Message:
-----------
SCI: copying over compressed audio (mp3/ogg/flac) buffers, because resourcemanager may free the memory at any time - fixes pseudo-random crashes - also added several assert()s after multiple malloc()s

Modified Paths:
--------------
    scummvm/trunk/engines/sci/sound/audio.cpp

Modified: scummvm/trunk/engines/sci/sound/audio.cpp
===================================================================
--- scummvm/trunk/engines/sci/sound/audio.cpp	2010-05-03 14:33:44 UTC (rev 48911)
+++ scummvm/trunk/engines/sci/sound/audio.cpp	2010-05-03 15:10:25 UTC (rev 48912)
@@ -188,6 +188,7 @@
 
 	if (audioFlags & kSolFlagCompressed) {
 		buffer = (byte *)malloc(size * 2);
+		assert(buffer);
 
 		if (audioFlags & kSolFlag16Bit)
 			deDPCM16(buffer, *audioStream, size);
@@ -198,6 +199,7 @@
 	} else {
 		// We assume that the sound data is raw PCM
 		buffer = (byte *)malloc(size);
+		assert(buffer);
 		audioStream->read(buffer, size);
 	}
 
@@ -234,22 +236,28 @@
 
 	if (audioCompressionType) {
 		// Compressed audio made by our tool
-		Common::MemoryReadStream *compressedStream = new Common::MemoryReadStream(audioRes->data, audioRes->size, DisposeAfterUse::YES);
+		byte *compressedData = (byte *)malloc(audioRes->size);
+		assert(compressedData);
+		// We copy over the compressed data in our own buffer. If we don't do this resourcemanager may free the data
+		//  later. All other compression-types already decompress completely into an additional buffer here.
+		//  MP3/OGG/FLAC decompression works on-the-fly instead.
+		memcpy(compressedData, audioRes->data, audioRes->size);
+		Common::MemoryReadStream *compressedStream = new Common::MemoryReadStream(compressedData, audioRes->size, DisposeAfterUse::YES);
 		
 		switch (audioCompressionType) {
 		case MKID_BE('MP3 '):
 #ifdef USE_MAD
-			audioSeekStream = Audio::makeMP3Stream(compressedStream, DisposeAfterUse::NO);
+			audioSeekStream = Audio::makeMP3Stream(compressedStream, DisposeAfterUse::YES);
 #endif
 			break;
 		case MKID_BE('OGG '):
 #ifdef USE_VORBIS
-			audioSeekStream = Audio::makeVorbisStream(compressedStream, DisposeAfterUse::NO);
+			audioSeekStream = Audio::makeVorbisStream(compressedStream, DisposeAfterUse::YES);
 #endif
 			break;
 		case MKID_BE('FLAC'):
 #ifdef USE_FLAC
-			audioSeekStream = Audio::makeFLACStream(compressedStream, DisposeAfterUse::NO);
+			audioSeekStream = Audio::makeFLACStream(compressedStream, DisposeAfterUse::YES);
 #endif
 			break;
 		}
@@ -300,6 +308,8 @@
 		//*sampleLen = (flags & Audio::FLAG_16BITS ? size >> 1 : size) * 60 / _audioRate;
 		audioStream = audioSeekStream;
 	}
+	// We have to make sure that we don't depend on resource manager pointers after this point, because the actual
+	//  audio resource may get unloaded by resource manager at any time
 	if (audioStream)
 		return audioStream;
 


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