aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Hoops2010-04-06 23:38:43 +0000
committerMatthew Hoops2010-04-06 23:38:43 +0000
commit3fe570cd70bda759dd9863c9da05289d0d072d98 (patch)
tree4abb3f33c2abb01a4bcaef9e79597668d56f0bfb
parent8e8b6cfa788c594ad8a841999afaeba779254b58 (diff)
downloadscummvm-rg350-3fe570cd70bda759dd9863c9da05289d0d072d98.tar.gz
scummvm-rg350-3fe570cd70bda759dd9863c9da05289d0d072d98.tar.bz2
scummvm-rg350-3fe570cd70bda759dd9863c9da05289d0d072d98.zip
Cleanup the Myst resource caching code a bit and add support for caching Myst ME MJMP sound 'jumps'
svn-id: r48579
-rw-r--r--engines/mohawk/myst.cpp31
-rw-r--r--engines/mohawk/resource_cache.cpp27
-rw-r--r--engines/mohawk/resource_cache.h6
3 files changed, 40 insertions, 24 deletions
diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp
index 5835c7e69d..f935e576b7 100644
--- a/engines/mohawk/myst.cpp
+++ b/engines/mohawk/myst.cpp
@@ -94,10 +94,10 @@ MohawkEngine_Myst::~MohawkEngine_Myst() {
// Uses cached data objects in preference to disk access
Common::SeekableReadStream *MohawkEngine_Myst::getRawData(uint32 tag, uint16 id) {
- Common::SeekableReadStream *ret;
+ Common::SeekableReadStream *ret = _cache.search(tag, id);
- ret = _cache.search(tag, id);
- if(ret != NULL) return ret;
+ if (ret)
+ return ret;
for (uint32 i = 0; i < _mhk.size(); i++)
if (_mhk[i]->hasResource(tag, id)) {
@@ -106,24 +106,37 @@ Common::SeekableReadStream *MohawkEngine_Myst::getRawData(uint32 tag, uint16 id)
return ret;
}
- error ("Could not find a \'%s\' resource with ID %04x", tag2str(tag), id);
+ error("Could not find a \'%s\' resource with ID %04x", tag2str(tag), id);
return NULL;
}
void MohawkEngine_Myst::cachePreload(uint32 tag, uint16 id) {
- Common::SeekableReadStream *tempData;
+ if (!_cache.enabled)
+ return;
- if (!_cache.enabled) return;
+ for (uint32 i = 0; i < _mhk.size(); i++) {
+ // Check for MJMP in Myst ME
+ if ((getFeatures() & GF_ME) && tag == ID_MSND && _mhk[i]->hasResource(ID_MJMP, id)) {
+ Common::SeekableReadStream *tempData = _mhk[i]->getRawData(ID_MJMP, id);
+ uint16 msndId = tempData->readUint16LE();
+ delete tempData;
+
+ // We've found where the real MSND data is, so go get that
+ tempData = _mhk[i]->getRawData(tag, msndId);
+ _cache.add(tag, id, tempData);
+ delete tempData;
+ return;
+ }
- for (uint32 i = 0; i < _mhk.size(); i++)
if (_mhk[i]->hasResource(tag, id)) {
- tempData = _mhk[i]->getRawData(tag, id);
+ Common::SeekableReadStream *tempData = _mhk[i]->getRawData(tag, id);
_cache.add(tag, id, tempData);
delete tempData;
return;
}
+ }
- warning ("cachePreload : Could not find a \'%s\' resource with ID %04x", tag2str(tag), id);
+ warning("cachePreload: Could not find a \'%s\' resource with ID %04x", tag2str(tag), id);
}
static const char *mystFiles[] = {
diff --git a/engines/mohawk/resource_cache.cpp b/engines/mohawk/resource_cache.cpp
index 20838ec1bd..8525bbc127 100644
--- a/engines/mohawk/resource_cache.cpp
+++ b/engines/mohawk/resource_cache.cpp
@@ -38,46 +38,49 @@ ResourceCache::~ResourceCache() {
}
void ResourceCache::clear() {
- if (!enabled) return;
+ if (!enabled)
+ return;
debugC(kDebugCache, "Clearing Cache...");
- // TODO : Not sure if need to explicitly delete dataObject.data element ie.
- // returned by readStream method here.
+ // TODO: Not sure if need to explicitly delete DataObject.data element ie.
+ // returned by readStream method here.
store.clear();
}
void ResourceCache::add(uint32 tag, uint16 id, Common::SeekableReadStream *data) {
- if (!enabled) return;
+ if (!enabled)
+ return;
- debugC(kDebugCache, "Adding item %u - tag 0x%04X id %u", store.size(), tag, id);
+ debugC(kDebugCache, "Adding item %d - tag 0x%04X id %d", store.size(), tag, id);
- dataObject current;
+ DataObject current;
current.tag = tag;
current.id = id;
- uint32 dataCurPos = data->pos();
+ uint32 dataCurPos = data->pos();
current.data = data->readStream(data->size());
- data->seek(dataCurPos, SEEK_SET);
+ data->seek(dataCurPos);
store.push_back(current);
}
// Returns NULL if not found
Common::SeekableReadStream *ResourceCache::search(uint32 tag, uint16 id) {
- if (!enabled) return NULL;
+ if (!enabled)
+ return NULL;
- debugC(kDebugCache, "Searching for tag 0x%04X id %u", tag, id);
+ debugC(kDebugCache, "Searching for tag 0x%04X id %d", tag, id);
for (uint32 i = 0; i < store.size(); i++) {
if (tag == store[i].tag && id == store[i].id) {
debugC(kDebugCache, "Found cached tag 0x%04X id %u", tag, id);
uint32 dataCurPos = store[i].data->pos();
Common::SeekableReadStream *ret = store[i].data->readStream(store[i].data->size());
- store[i].data->seek(dataCurPos, SEEK_SET);
+ store[i].data->seek(dataCurPos);
return ret;
}
}
- debugC(kDebugCache, "tag 0x%04X id %u not found", tag, id);
+ debugC(kDebugCache, "tag 0x%04X id %d not found", tag, id);
return NULL;
}
diff --git a/engines/mohawk/resource_cache.h b/engines/mohawk/resource_cache.h
index e82b43b89e..506d223ff1 100644
--- a/engines/mohawk/resource_cache.h
+++ b/engines/mohawk/resource_cache.h
@@ -45,13 +45,13 @@ public:
Common::SeekableReadStream *search(uint32 tag, uint16 id);
private:
- typedef struct {
+ struct DataObject {
uint32 tag;
uint16 id;
Common::SeekableReadStream *data;
- } dataObject;
+ };
- Common::Array<dataObject> store;
+ Common::Array<DataObject> store;
};
} // End of namespace Mohawk