aboutsummaryrefslogtreecommitdiff
path: root/engines/saga/sndres.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/saga/sndres.cpp')
-rw-r--r--engines/saga/sndres.cpp47
1 files changed, 44 insertions, 3 deletions
diff --git a/engines/saga/sndres.cpp b/engines/saga/sndres.cpp
index c0442c75de..39dd9b5c06 100644
--- a/engines/saga/sndres.cpp
+++ b/engines/saga/sndres.cpp
@@ -156,7 +156,6 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
return false;
}
-
_vm->_resource->loadResource(context, resourceId, soundResource, soundResourceLength);
if ((context->fileType & GAME_VOICEFILE) != 0) {
@@ -175,8 +174,19 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
if (soundResourceLength >= 8) {
if (!memcmp(soundResource, "Creative", 8)) {
resourceType = kSoundVOC;
- } else if (!memcmp(soundResource, "RIFF", 4) != 0) {
+ } else if (!memcmp(soundResource, "RIFF", 4) != 0) {
resourceType = kSoundWAV;
+ } else if (soundResource[0] == char(0)) {
+ readS.seek(1);
+ uint16 test = readS.readUint16LE(); // the frequency
+ // the sound's frequency is not supposed to be 0, if it is then it's an empty sound,
+ // so don't treat it as MP3
+ if (test > 0) // Skip compression identifier byte
+ resourceType = kSoundMP3;
+ } else if (soundResource[0] == char(1)) {
+ resourceType = kSoundOGG;
+ } else if (soundResource[0] == char(2)) {
+ resourceType = kSoundFLAC;
}
}
@@ -188,6 +198,7 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
buffer.sampleBits = soundInfo->sampleBits;
buffer.size = soundResourceLength;
buffer.stereo = soundInfo->stereo;
+ buffer.isCompressed = false;
if (onlyHeader) {
buffer.buffer = NULL;
free(soundResource);
@@ -202,6 +213,7 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
buffer.sampleBits = soundInfo->sampleBits;
buffer.size = soundResourceLength - 36;
buffer.stereo = soundInfo->stereo;
+ buffer.isCompressed = false;
if (onlyHeader) {
buffer.buffer = NULL;
} else {
@@ -217,6 +229,7 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
buffer.sampleBits = soundInfo->sampleBits;
buffer.stereo = soundInfo->stereo;
buffer.size = soundResourceLength * 4;
+ buffer.isCompressed = false;
if (onlyHeader) {
buffer.buffer = NULL;
free(soundResource);
@@ -239,6 +252,7 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
buffer.stereo = false;
buffer.isSigned = false;
buffer.size = size;
+ buffer.isCompressed = false;
if (onlyHeader) {
buffer.buffer = NULL;
free(data);
@@ -256,6 +270,7 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
buffer.stereo = ((flags & Audio::Mixer::FLAG_STEREO) != 0);
buffer.isSigned = true;
buffer.size = size;
+ buffer.isCompressed = false;
if (onlyHeader) {
buffer.buffer = NULL;
} else {
@@ -266,6 +281,29 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
}
free(soundResource);
break;
+ case kSoundMP3:
+ case kSoundOGG:
+ case kSoundFLAC:
+ ResourceData *resourceData;
+ resourceData = _vm->_resource->getResourceData(context, resourceId);
+
+ readS.seek(1); // Skip compression identifier byte
+
+ buffer.frequency = readS.readUint16LE();
+ buffer.size = soundResourceLength;
+ buffer.originalSize = readS.readUint32LE();
+ buffer.sampleBits = readS.readByte();
+ buffer.stereo = (readS.readByte() == char(0)) ? false : true;
+ buffer.isCompressed = true;
+ buffer.soundType = resourceType;
+ buffer.soundFile = context->getFile(resourceData);
+ buffer.fileOffset = resourceData->offset;
+
+ buffer.buffer = NULL;
+
+ result = true;
+ free(soundResource);
+ break;
default:
error("SndRes::load Unknown sound type");
}
@@ -286,7 +324,10 @@ int SndRes::getVoiceLength(uint32 resourceId) {
return -1;
}
- msDouble = (double)buffer.size;
+ if (!buffer.isCompressed)
+ msDouble = (double)buffer.size;
+ else
+ msDouble = (double)buffer.originalSize;
if (buffer.sampleBits == 16) {
msDouble /= 2.0;
}