diff options
| -rw-r--r-- | engines/sci/resource.cpp | 6 | ||||
| -rw-r--r-- | engines/sci/resource_audio.cpp | 20 | 
2 files changed, 19 insertions, 7 deletions
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index bf669c9176..29f3017acb 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1877,12 +1877,6 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) {  				// if we use the first entries in the resource file, half of the  				// game will be English and umlauts will also be missing :P  				if (resource->_source->getSourceType() == kSourceVolume) { -					// Maps are read during the scanning process (below), so -					// need to be treated as unallocated in order for the new -					// data from this volume to be picked up and used -					if (resId.getType() == kResourceTypeMap) { -						resource->_status = kResStatusNoMalloc; -					}  					updateResource(resId, source, fileOffset, 0, map->getLocationName());  				}  			} diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 92761cae39..741968b293 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -297,13 +297,29 @@ int ResourceManager::readAudioMapSCI11(IntMapResourceSource *map) {  	uint32 offset = 0;  	const ResourceId mapResId(kResourceTypeMap, map->_mapNumber); -	Resource *mapRes = findResource(mapResId, false); +	Resource *mapRes = _resMap.getVal(mapResId, nullptr);  	if (!mapRes) {  		warning("Failed to open %s", mapResId.toString().c_str());  		return SCI_ERROR_RESMAP_NOT_FOUND;  	} +	// Here, we allocate audio maps ourselves instead of using findResource to +	// do this for us. This is in order to prevent the map resources from +	// getting into the LRU cache. These resources must be read and then +	// deallocated in games with multi-disc audio in order to read the audio +	// maps from every CD, and LRU eviction freaks out if an unallocated +	// resource ends up in the LRU list. It is also not necessary for these +	// resources to be cached in the LRU at all, since they are only used upon +	// game startup to populate _resMap. +	assert(mapRes->_status == kResStatusNoMalloc); +	loadResource(mapRes); + +	if (!mapRes->data()) { +		warning("Failed to read data for %s", mapResId.toString().c_str()); +		return SCI_ERROR_RESMAP_NOT_FOUND; +	} +  	ResourceSource *src = findVolume(map, map->_volumeNumber);  	if (!src) { @@ -484,6 +500,8 @@ int ResourceManager::readAudioMapSCI11(IntMapResourceSource *map) {  		}  	} +	mapRes->unalloc(); +  	return 0;  }  | 
