aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Snover2017-05-10 15:29:10 -0500
committerColin Snover2017-05-10 15:29:53 -0500
commitea6eebca09f9303cd08aa6d767123ba383c548e8 (patch)
tree27ceffdad276e2a0ed0c30e4ab7d4d7d0b174599
parent80e7eaa442b435d64ade13d175cfa05b762fa397 (diff)
downloadscummvm-rg350-ea6eebca09f9303cd08aa6d767123ba383c548e8.tar.gz
scummvm-rg350-ea6eebca09f9303cd08aa6d767123ba383c548e8.tar.bz2
scummvm-rg350-ea6eebca09f9303cd08aa6d767123ba383c548e8.zip
SCI: Fix reading of Rave data from compressed KQ6 audio volumes
Refs Trac#9764.
-rw-r--r--engines/sci/resource.cpp6
-rw-r--r--engines/sci/resource.h2
-rw-r--r--engines/sci/resource_audio.cpp11
3 files changed, 15 insertions, 4 deletions
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp
index 2f34f8f433..6ee77fd4c7 100644
--- a/engines/sci/resource.cpp
+++ b/engines/sci/resource.cpp
@@ -2010,10 +2010,12 @@ bool ResourceManager::validateResource(const ResourceId &resourceId, const Commo
return true;
}
-void ResourceManager::addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size, const Common::String &sourceMapLocation) {
+Resource *ResourceManager::addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size, const Common::String &sourceMapLocation) {
// Adding new resource only if it does not exist
if (_resMap.contains(resId) == false) {
- updateResource(resId, src, offset, size, sourceMapLocation);
+ return updateResource(resId, src, offset, size, sourceMapLocation);
+ } else {
+ return _resMap.getVal(resId);
}
}
diff --git a/engines/sci/resource.h b/engines/sci/resource.h
index d8651304be..2bbbd42a4a 100644
--- a/engines/sci/resource.h
+++ b/engines/sci/resource.h
@@ -520,7 +520,7 @@ protected:
void loadResource(Resource *res);
void freeOldResources();
bool validateResource(const ResourceId &resourceId, const Common::String &sourceMapLocation, const Common::String &sourceName, const uint32 offset, const uint32 size, const uint32 sourceSize) const;
- void addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size = 0, const Common::String &sourceMapLocation = Common::String("(no map location)"));
+ Resource *addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size = 0, const Common::String &sourceMapLocation = Common::String("(no map location)"));
Resource *updateResource(ResourceId resId, ResourceSource *src, uint32 size, const Common::String &sourceMapLocation = Common::String("(no map location)"));
Resource *updateResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size, const Common::String &sourceMapLocation = Common::String("(no map location)"));
void removeAudioResource(ResourceId resId);
diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp
index 2cd157a631..0b00725d8b 100644
--- a/engines/sci/resource_audio.cpp
+++ b/engines/sci/resource_audio.cpp
@@ -444,7 +444,16 @@ int ResourceManager::readAudioMapSCI11(IntMapResourceSource *map) {
ptr += 2;
if (kq6HiresSyncSize > 0) {
- addResource(ResourceId(kResourceTypeRave, map->_mapNumber, n & 0xffffff3f), src, offset + syncSize, kq6HiresSyncSize, map->getLocationName());
+ // Rave resources do not have separate entries in the audio
+ // map (their data was just appended to sync resources), so
+ // we have to use the sync resource offset first and then
+ // adjust the offset & size later, otherwise offset
+ // validation will fail for compressed volumes (since the
+ // relocation table in a compressed volume only contains
+ // offsets that existed in the original audio map)
+ Resource *res = addResource(ResourceId(kResourceTypeRave, map->_mapNumber, n & 0xffffff3f), src, offset, syncSize + kq6HiresSyncSize, map->getLocationName());
+ res->_fileOffset += syncSize;
+ res->_size -= syncSize;
syncSize += kq6HiresSyncSize;
}
}