diff options
Diffstat (limited to 'engines/saga/sndres.cpp')
-rw-r--r-- | engines/saga/sndres.cpp | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/engines/saga/sndres.cpp b/engines/saga/sndres.cpp index ceb1ebf630..edbdebabab 100644 --- a/engines/saga/sndres.cpp +++ b/engines/saga/sndres.cpp @@ -44,7 +44,7 @@ namespace Saga { SndRes::SndRes(SagaEngine *vm) : _vm(vm) { - /* Load sound module resource file contexts */ + // Load sound module resource file contexts _sfxContext = _vm->_resource->getContext(GAME_SOUNDFILE); if (_sfxContext == NULL) { error("SndRes::SndRes resource context not found"); @@ -68,8 +68,13 @@ SndRes::SndRes(SagaEngine *vm) : _vm(vm) { byte *resourcePointer; size_t resourceLength; - _vm->_resource->loadResource(resourceContext, RID_IHNM_SFX_LUT, - resourcePointer, resourceLength); + if (_vm->getGameId() == GID_IHNM_DEMO) { + _vm->_resource->loadResource(resourceContext, RID_IHNMDEMO_SFX_LUT, + resourcePointer, resourceLength); + } else { + _vm->_resource->loadResource(resourceContext, RID_IHNM_SFX_LUT, + resourcePointer, resourceLength); + } if (resourceLength == 0) { error("Sndres::SndRes can't read SfxIDs table"); @@ -169,7 +174,6 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff MemoryReadStream readS(soundResource, soundResourceLength); resourceType = soundInfo->resourceType; - buffer.isBigEndian = soundInfo->isBigEndian; if (soundResourceLength >= 8) { if (!memcmp(soundResource, "Creative", 8)) { @@ -178,7 +182,17 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff resourceType = kSoundWAV; } - if (_vm->getFeatures() & GF_COMPRESSED_SOUNDS) { + bool uncompressedSound = false; + // If a patch file exists for sound resource 4 (used in ITE intro), don't treat this sound as compressed + if (_vm->getGameType() == GType_ITE && resourceId == 4 && + (Common::File::exists("sound/p2_a.iaf") || Common::File::exists("sound/p2_a.voc"))) + uncompressedSound = true; + + // FIXME: Currently, the SFX.RES file in IHNM cannot be compressed + if (_vm->getGameType() == GType_IHNM && (context->fileType & GAME_SOUNDFILE)) + uncompressedSound = true; + + if ((_vm->getFeatures() & GF_COMPRESSED_SOUNDS) && !uncompressedSound) { if (soundResource[0] == char(0)) { resourceType = kSoundMP3; } else if (soundResource[0] == char(1)) { @@ -190,6 +204,9 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff } + buffer.isBigEndian = soundInfo->isBigEndian; + buffer.soundType = resourceType; + buffer.originalSize = 0; switch (resourceType) { case kSoundPCM: @@ -319,7 +336,7 @@ int SndRes::getVoiceLength(uint32 resourceId) { return -1; } - if (!(_vm->getFeatures() & GF_COMPRESSED_SOUNDS)) + if (!(_vm->getFeatures() & GF_COMPRESSED_SOUNDS) || buffer.originalSize == 0) msDouble = (double)buffer.size; else msDouble = (double)buffer.originalSize; |