diff options
-rw-r--r-- | scumm/scumm.cpp | 2 | ||||
-rw-r--r-- | scumm/sound.cpp | 42 |
2 files changed, 28 insertions, 16 deletions
diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp index ada86b97a3..c55469d008 100644 --- a/scumm/scumm.cpp +++ b/scumm/scumm.cpp @@ -379,6 +379,8 @@ static const ScummGameSettings scumm_settings[] = { // Humongous Entertainment Scumm Version ? {"ff5demo", "Freddi Fish 5: The Case of the Creature of Coral Cave (Demo)", GID_FREDDICOVE, 6, 100, 61, MDT_NONE, GF_USE_KEY | GF_NEW_COSTUMES, Common::kPlatformUnknown, 0, 0}, + {"pjgames", "Pajama Sam: Games to Play On Any Day", GID_HEGAME, 6, 100, 62, MDT_NONE, + GF_USE_KEY | GF_NEW_COSTUMES, Common::kPlatformUnknown, 0, 0}, // Uses smacker in external files {"artdemo", "Blue's Art Time Activities (Demo)", GID_HEGAME, 6, 99, 61, MDT_NONE, diff --git a/scumm/sound.cpp b/scumm/sound.cpp index cfdf33e157..8226c204d7 100644 --- a/scumm/sound.cpp +++ b/scumm/sound.cpp @@ -703,27 +703,37 @@ void Sound::startTalkSound(uint32 offset, uint32 b, int mode, SoundHandle *handl _sfxFile->seek(offset, SEEK_SET); if (_sfxFile->readUint32LE() == TO_LE_32(MKID('WSOU'))) { - debug(1, "IMA ADPCM compression not supported"); - return; + // Skip the WSOU chunk + _sfxFile->seek(offset + 8, SEEK_SET); + + // Try to load the WAVE data into an audio stream + AudioStream *stream = makeWAVStream(*_sfxFile); + if (!stream) { + warning("startTalkSound: IMA ADPCM compression not supported"); + return; + } + + int channel = _vm->VAR(_vm->VAR_SOUND_CHANNEL); + _vm->_mixer->playInputStream(SoundMixer::kSFXSoundType, &_heSoundChannels[channel], stream, 1); } else { // Skip the TALK (8) and HSHD (24) chunks _sfxFile->seek(28, SEEK_CUR); - } - if (_sfxFile->readUint32LE() == TO_LE_32(MKID('SBNG'))) { - // Skip the SBNG, so we end up at the SDAT chunk - size = _sfxFile->readUint32BE() - 4; - _sfxFile->seek(size, SEEK_CUR); - } - size = _sfxFile->readUint32BE() - 8; - sound = (byte *)malloc(size); - _sfxFile->read(sound, size); + if (_sfxFile->readUint32LE() == TO_LE_32(MKID('SBNG'))) { + // Skip the SBNG, so we end up at the SDAT chunk + size = _sfxFile->readUint32BE() - 4; + _sfxFile->seek(size, SEEK_CUR); + } + size = _sfxFile->readUint32BE() - 8; + sound = (byte *)malloc(size); + _sfxFile->read(sound, size); - if (_vm->_heversion >= 70) { - int channel = _vm->VAR(_vm->VAR_SOUND_CHANNEL); - _vm->_mixer->playRaw(&_heSoundChannels[channel], sound, size, 11000, SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_AUTOFREE, 1); - } else { - _vm->_mixer->playRaw(handle, sound, size, 11000, SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_AUTOFREE); + if (_vm->_heversion >= 70) { + int channel = _vm->VAR(_vm->VAR_SOUND_CHANNEL); + _vm->_mixer->playRaw(&_heSoundChannels[channel], sound, size, 11000, SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_AUTOFREE, 1); + } else { + _vm->_mixer->playRaw(handle, sound, size, 11000, SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_AUTOFREE); + } } return; } |