aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/saga/sndres.cpp10
-rw-r--r--engines/saga/sound.cpp8
2 files changed, 12 insertions, 6 deletions
diff --git a/engines/saga/sndres.cpp b/engines/saga/sndres.cpp
index ceb1ebf630..c0c63eb06c 100644
--- a/engines/saga/sndres.cpp
+++ b/engines/saga/sndres.cpp
@@ -169,7 +169,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 +177,9 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
resourceType = kSoundWAV;
}
- if (_vm->getFeatures() & GF_COMPRESSED_SOUNDS) {
+ // If the game has patch files, then it includes a patch file for sound resource 4, used in the intro.
+ // Don't treat this patch file as compressed sound. This file is always included if patch files are present
+ if ((_vm->getFeatures() & GF_COMPRESSED_SOUNDS) && !(_vm->getPatchesCount() > 0 && resourceId == 4)) {
if (soundResource[0] == char(0)) {
resourceType = kSoundMP3;
} else if (soundResource[0] == char(1)) {
@@ -190,6 +191,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 +323,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;
diff --git a/engines/saga/sound.cpp b/engines/saga/sound.cpp
index 6c2516c8a3..95b8c24a2f 100644
--- a/engines/saga/sound.cpp
+++ b/engines/saga/sound.cpp
@@ -83,31 +83,33 @@ void Sound::playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int
if (!(_vm->getFeatures() & GF_COMPRESSED_SOUNDS)) {
_mixer->playRaw(Audio::Mixer::kSFXSoundType, handle, buffer.buffer, buffer.size, buffer.frequency, flags, -1, volume);
} else {
- buffer.soundFile->seek((long)buffer.fileOffset, SEEK_SET);
Audio::AudioStream *stream = NULL;
switch (buffer.soundType) {
#ifdef USE_MAD
case kSoundMP3:
debug(1, "Playing MP3 compressed sound");
+ buffer.soundFile->seek((long)buffer.fileOffset, SEEK_SET);
stream = Audio::makeMP3Stream(buffer.soundFile, buffer.size);
break;
#endif
#ifdef USE_VORBIS
case kSoundOGG:
debug(1, "Playing OGG compressed sound");
+ buffer.soundFile->seek((long)buffer.fileOffset, SEEK_SET);
stream = Audio::makeVorbisStream(buffer.soundFile, buffer.size);
break;
#endif
#ifdef USE_FLAC
case kSoundFLAC:
debug(1, "Playing FLAC compressed sound");
+ buffer.soundFile->seek((long)buffer.fileOffset, SEEK_SET);
stream = Audio::makeFlacStream(buffer.soundFile, buffer.size);
break;
#endif
default:
- // Unknown compression
- error("Trying to play a compressed sound, but the compression is not known");
+ // No compression, play it as raw sound
+ _mixer->playRaw(Audio::Mixer::kSFXSoundType, handle, buffer.buffer, buffer.size, buffer.frequency, flags, -1, volume);
break;
}