[Scummvm-cvs-logs] SF.net SVN: scummvm:[49821] scummvm/trunk/engines/sci

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Tue Jun 15 14:14:15 CEST 2010


Revision: 49821
          http://scummvm.svn.sourceforge.net/scummvm/?rev=49821&view=rev
Author:   fingolfin
Date:     2010-06-15 12:14:15 +0000 (Tue, 15 Jun 2010)

Log Message:
-----------
SCI: Add loadResource impls for WaveResourceSource and AudioVolumeResourceSource

Modified Paths:
--------------
    scummvm/trunk/engines/sci/resource.cpp
    scummvm/trunk/engines/sci/resource.h
    scummvm/trunk/engines/sci/resource_intern.h

Modified: scummvm/trunk/engines/sci/resource.cpp
===================================================================
--- scummvm/trunk/engines/sci/resource.cpp	2010-06-15 12:13:52 UTC (rev 49820)
+++ scummvm/trunk/engines/sci/resource.cpp	2010-06-15 12:14:15 UTC (rev 49821)
@@ -376,89 +376,101 @@
 	}
 }
 
-void ResourceSource::loadResource(Resource *res, ResourceManager *resMan) {
+Common::SeekableReadStream *ResourceSource::getVolumeFile(Resource *res, ResourceManager *resMan) {
 	Common::SeekableReadStream *fileStream = resMan->getVolumeFile(this);
 
 	if (!fileStream) {
 		warning("Failed to open %s", getLocationName().c_str());
 		res->unalloc();
-		return;
 	}
 
-	switch(getSourceType()) {
-	case kSourceWave:
-		fileStream->seek(res->_fileOffset, SEEK_SET);
-		resMan->loadFromWaveFile(res, fileStream);
-		if (_resourceFile)
-			delete fileStream;
+	return fileStream;
+}
+
+void WaveResourceSource::loadResource(Resource *res, ResourceManager *resMan) {
+	Common::SeekableReadStream *fileStream = getVolumeFile(res, resMan);
+	if (!fileStream)
 		return;
 
-	case kSourceAudioVolume:
-		if (audioCompressionType) {
-			// this file is compressed, so lookup our offset in the offset-translation table and get the new offset
-			//  also calculate the compressed size by using the next offset
-			int32 *mappingTable = audioCompressionOffsetMapping;
-			int32 compressedOffset = 0;
+	fileStream->seek(res->_fileOffset, SEEK_SET);
+	resMan->loadFromWaveFile(res, fileStream);
+	if (_resourceFile)
+		delete fileStream;
+}
 
-			do {
-				if (*mappingTable == res->_fileOffset) {
-					mappingTable++;
-					compressedOffset = *mappingTable;
-					// Go to next compressed offset and use that to calculate size of compressed sample
-					switch (res->_id.type) {
-					case kResourceTypeSync:
-					case kResourceTypeSync36:
-						// we should already have a (valid) size
-						break;
-					default:
-						mappingTable += 2;
-						res->size = *mappingTable - compressedOffset;
-					}
+void AudioVolumeResourceSource::loadResource(Resource *res, ResourceManager *resMan) {
+	Common::SeekableReadStream *fileStream = getVolumeFile(res, resMan);
+	if (!fileStream)
+		return;
+
+	if (audioCompressionType) {
+		// this file is compressed, so lookup our offset in the offset-translation table and get the new offset
+		//  also calculate the compressed size by using the next offset
+		int32 *mappingTable = audioCompressionOffsetMapping;
+		int32 compressedOffset = 0;
+
+		do {
+			if (*mappingTable == res->_fileOffset) {
+				mappingTable++;
+				compressedOffset = *mappingTable;
+				// Go to next compressed offset and use that to calculate size of compressed sample
+				switch (res->_id.type) {
+				case kResourceTypeSync:
+				case kResourceTypeSync36:
+					// we should already have a (valid) size
 					break;
+				default:
+					mappingTable += 2;
+					res->size = *mappingTable - compressedOffset;
 				}
-				mappingTable += 2;
-			} while (*mappingTable);
+				break;
+			}
+			mappingTable += 2;
+		} while (*mappingTable);
 
-			if (!compressedOffset)
-				error("could not translate offset to compressed offset in audio volume");
-			fileStream->seek(compressedOffset, SEEK_SET);
+		if (!compressedOffset)
+			error("could not translate offset to compressed offset in audio volume");
+		fileStream->seek(compressedOffset, SEEK_SET);
 
-			switch (res->_id.type) {
-			case kResourceTypeAudio:
-			case kResourceTypeAudio36:
-				// Directly read the stream, compressed audio wont have resource type id and header size for SCI1.1
-				resMan->loadFromAudioVolumeSCI1(res, fileStream);
-				if (_resourceFile)
-					delete fileStream;
-				return;
-			default:
-				break;
-			}
-		} else {
-			// original file, directly seek to given offset and get SCI1/SCI1.1 audio resource
-			fileStream->seek(res->_fileOffset, SEEK_SET);
+		switch (res->_id.type) {
+		case kResourceTypeAudio:
+		case kResourceTypeAudio36:
+			// Directly read the stream, compressed audio wont have resource type id and header size for SCI1.1
+			resMan->loadFromAudioVolumeSCI1(res, fileStream);
+			if (_resourceFile)
+				delete fileStream;
+			return;
+		default:
+			break;
 		}
-		if (getSciVersion() < SCI_VERSION_1_1)
-			resMan->loadFromAudioVolumeSCI1(res, fileStream);
-		else
-			resMan->loadFromAudioVolumeSCI11(res, fileStream);
+	} else {
+		// original file, directly seek to given offset and get SCI1/SCI1.1 audio resource
+		fileStream->seek(res->_fileOffset, SEEK_SET);
+	}
+	if (getSciVersion() < SCI_VERSION_1_1)
+		resMan->loadFromAudioVolumeSCI1(res, fileStream);
+	else
+		resMan->loadFromAudioVolumeSCI11(res, fileStream);
 
-		if (_resourceFile)
-			delete fileStream;
+	if (_resourceFile)
+		delete fileStream;
+}
+
+void ResourceSource::loadResource(Resource *res, ResourceManager *resMan) {
+	Common::SeekableReadStream *fileStream = getVolumeFile(res, resMan);
+	if (!fileStream)
 		return;
 
-	default:
-		fileStream->seek(res->_fileOffset, SEEK_SET);
-		int error = resMan->decompress(res, fileStream);
+	fileStream->seek(res->_fileOffset, SEEK_SET);
+	int error = resMan->decompress(res, fileStream);
 
-		if (_resourceFile)
-			delete fileStream;
+	if (_resourceFile)
+		delete fileStream;
 
-		if (error) {
-			warning("Error %d occured while reading %s from resource file: %s",
-				    error, res->_id.toString().c_str(), sci_error_types[error]);
-			res->unalloc();
-		}
+	if (error) {
+		warning("Error %d occured while reading %s from resource file: %s",
+				error, res->_id.toString().c_str(), sci_error_types[error]);
+		res->unalloc();
 	}
 }
 
@@ -1541,7 +1553,7 @@
 }
 
 int ResourceManager::readResourceInfo(Resource *res, Common::SeekableReadStream *file,
-                                      uint32&szPacked, ResourceCompression &compression) {
+                                      uint32 &szPacked, ResourceCompression &compression) {
 	// SCI0 volume format:  {wResId wPacked+4 wUnpacked wCompression} = 8 bytes
 	// SCI1 volume format:  {bResType wResNumber wPacked+4 wUnpacked wCompression} = 9 bytes
 	// SCI1.1 volume format:  {bResType wResNumber wPacked wUnpacked wCompression} = 9 bytes

Modified: scummvm/trunk/engines/sci/resource.h
===================================================================
--- scummvm/trunk/engines/sci/resource.h	2010-06-15 12:13:52 UTC (rev 49820)
+++ scummvm/trunk/engines/sci/resource.h	2010-06-15 12:14:15 UTC (rev 49821)
@@ -167,6 +167,8 @@
 	// FIXME: These 'friend' declarations are meant to be a temporary hack to
 	// ease transition to the ResourceSource class system.
 	friend class ResourceSource;
+	friend class WaveResourceSource;
+	friend class AudioVolumeResourceSource;
 	friend class MacResourceForkResourceSource;
 
 public:
@@ -393,7 +395,7 @@
 	bool loadFromAudioVolumeSCI11(Resource *res, Common::SeekableReadStream *file);
 	void freeOldResources();
 	int decompress(Resource *res, Common::SeekableReadStream *file);
-	int readResourceInfo(Resource *res, Common::SeekableReadStream *file, uint32&szPacked, ResourceCompression &compression);
+	int readResourceInfo(Resource *res, Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression);
 	void addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size = 0);
 	void removeAudioResource(ResourceId resId);
 

Modified: scummvm/trunk/engines/sci/resource_intern.h
===================================================================
--- scummvm/trunk/engines/sci/resource_intern.h	2010-06-15 12:13:52 UTC (rev 49820)
+++ scummvm/trunk/engines/sci/resource_intern.h	2010-06-15 12:14:15 UTC (rev 49821)
@@ -68,6 +68,9 @@
 	ResSourceType getSourceType() const { return _sourceType; }
 	const Common::String &getLocationName() const { return _name; }
 
+	// Auxiliary method, used by loadResource implementations.
+	Common::SeekableReadStream *getVolumeFile(Resource *res, ResourceManager *resMan);
+
 	/**
 	 * TODO: Document this
 	 */
@@ -136,7 +139,7 @@
 		: VolumeResourceSource(name, map, kSourceAudioVolume) {
 	}
 
-	//virtual void loadResource(Resource *res, ResourceManager *resMan);
+	virtual void loadResource(Resource *res, ResourceManager *resMan);
 };
 
 class ExtAudioMapResourceSource : public ResourceSource {
@@ -150,7 +153,7 @@
 public:
 	WaveResourceSource(const Common::String &name) : ResourceSource(kSourceWave, name) {}
 
-	//virtual void loadResource(Resource *res, ResourceManager *resMan);
+	virtual void loadResource(Resource *res, ResourceManager *resMan);
 };
 
 class MacResourceForkResourceSource : public ResourceSource {


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