diff options
author | Norbert Lange | 2009-08-17 12:58:53 +0000 |
---|---|---|
committer | Norbert Lange | 2009-08-17 12:58:53 +0000 |
commit | cc3a20c13cbf642dd08454d3cbd79edb6b3d3176 (patch) | |
tree | 64197760262270bf9c90d367864150ceb4b1f5b4 /engines/saga/sndres.cpp | |
parent | c96affd0c1e5480fe1a4a3d3e82583c795570d21 (diff) | |
parent | e548e71ba1092a1091da79c5d4652c9d52578e65 (diff) | |
download | scummvm-rg350-cc3a20c13cbf642dd08454d3cbd79edb6b3d3176.tar.gz scummvm-rg350-cc3a20c13cbf642dd08454d3cbd79edb6b3d3176.tar.bz2 scummvm-rg350-cc3a20c13cbf642dd08454d3cbd79edb6b3d3176.zip |
merge with trunk
svn-id: r43478
Diffstat (limited to 'engines/saga/sndres.cpp')
-rw-r--r-- | engines/saga/sndres.cpp | 59 |
1 files changed, 32 insertions, 27 deletions
diff --git a/engines/saga/sndres.cpp b/engines/saga/sndres.cpp index b2744482bd..eddd35300e 100644 --- a/engines/saga/sndres.cpp +++ b/engines/saga/sndres.cpp @@ -192,7 +192,6 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff GameSoundTypes resourceType = kSoundPCM; byte *data = 0; int rate = 0, size = 0; - byte flags = 0; Common::File* file; if (resourceId == (uint32)-1) { @@ -269,21 +268,17 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff } - // Default sound type is 16-bit PCM (used in ITE) - buffer.isBigEndian = context->isBigEndian; - if ((context->fileType & GAME_VOICEFILE) && (_vm->getFeatures() & GF_LE_VOICES)) - buffer.isBigEndian = false; + // Default sound type is 16-bit signed PCM, used in ITE by PCM and VOX files buffer.isCompressed = context->isCompressed; buffer.soundType = resourceType; buffer.originalSize = 0; - buffer.stereo = false; - buffer.isSigned = true; // default for PCM and VOX - buffer.frequency = 22050; // default for PCM and VOX - buffer.sampleBits = 16; // default for PCM and VOX + // Set default flags and frequency for PCM, VOC and VOX files, which got no header + buffer.flags = Audio::Mixer::FLAG_16BITS; + buffer.frequency = 22050; if (_vm->getGameId() == GID_ITE) { if (_vm->getFeatures() & GF_8BIT_UNSIGNED_PCM) { // older ITE demos - buffer.isSigned = false; - buffer.sampleBits = 8; + buffer.flags |= Audio::Mixer::FLAG_UNSIGNED; + buffer.flags &= ~Audio::Mixer::FLAG_16BITS; } else { // Voice files in newer ITE demo versions are OKI ADPCM (VOX) encoded if (!scumm_stricmp(context->fileName, "voicesd.rsc")) @@ -292,6 +287,12 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff } buffer.buffer = NULL; + // Check for LE sounds + if (!context->isBigEndian) + buffer.flags |= Audio::Mixer::FLAG_LITTLE_ENDIAN; + if ((context->fileType & GAME_VOICEFILE) && (_vm->getFeatures() & GF_LE_VOICES)) + buffer.flags |= Audio::Mixer::FLAG_LITTLE_ENDIAN; + // Older Mac versions of ITE were Macbinary packed int soundOffset = (context->fileType & GAME_MACBINARY) ? 36 : 0; @@ -321,25 +322,23 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff case kSoundShorten: case kSoundVOC: if (resourceType == kSoundWAV) { - result = Audio::loadWAVFromStream(readS, size, rate, flags); + result = Audio::loadWAVFromStream(readS, size, rate, buffer.flags); } else if (resourceType == kSoundAIFF) { - result = Audio::loadAIFFFromStream(readS, size, rate, flags); + result = Audio::loadAIFFFromStream(readS, size, rate, buffer.flags); +#ifdef ENABLE_SAGA2 + } else if (resourceType == kSoundShorten) { + result = Audio::loadShortenFromStream(readS, size, rate, buffer.flags); +#endif } else if (resourceType == kSoundVOC) { data = Audio::loadVOCFromStream(readS, size, rate); result = (data != 0); if (onlyHeader) free(data); -#ifdef ENABLE_SAGA2 - } else if (resourceType == kSoundShorten) { - result = Audio::loadShortenFromStream(readS, size, rate, flags); -#endif + buffer.flags |= Audio::Mixer::FLAG_UNSIGNED; } if (result) { buffer.frequency = rate; - buffer.sampleBits = (flags & Audio::Mixer::FLAG_16BITS) ? 16 : 8; - buffer.stereo = flags & Audio::Mixer::FLAG_STEREO; - buffer.isSigned = (resourceType == kSoundVOC) ? false : !(flags & Audio::Mixer::FLAG_UNSIGNED); buffer.size = size; if (!onlyHeader && resourceType != kSoundVOC) { @@ -360,14 +359,20 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff readS.readByte(); // Skip compression identifier byte buffer.frequency = readS.readUint16LE(); buffer.originalSize = readS.readUint32LE(); - buffer.sampleBits = readS.readByte(); - buffer.stereo = (readS.readByte() == char(0)) ? false : true; + if (readS.readByte() == 8) // read sample bits + buffer.flags &= ~Audio::Mixer::FLAG_16BITS; + if (readS.readByte() != 0) // read stereo flag + buffer.flags |= Audio::Mixer::FLAG_STEREO; buffer.size = soundResourceLength; buffer.soundType = resourceType; - buffer.soundFile = context->getFile(resourceData); buffer.fileOffset = resourceData->offset + 9; // skip compressed sfx header: byte + uint16 + uint32 + byte + byte + if (!onlyHeader) { + buffer.buffer = (byte *)malloc(buffer.size); + readS.read(buffer.buffer, buffer.size); + } + result = true; break; default: @@ -403,12 +408,12 @@ int SndRes::getVoiceLength(uint32 resourceId) { msDouble = (double)buffer.size; else msDouble = (double)buffer.originalSize; - if (buffer.sampleBits == 16) { + + if (buffer.flags & Audio::Mixer::FLAG_16BITS) msDouble /= 2.0; - } - if (buffer.stereo) { + + if (buffer.flags & Audio::Mixer::FLAG_STEREO) msDouble /= 2.0; - } msDouble = msDouble / buffer.frequency * 1000.0; return (int)msDouble; |