From 0cba4f030691f83e487ddcc688214feef9a8b65e Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Wed, 8 Sep 2010 20:50:56 +0000 Subject: MOHAWK: Implement blocking sound in Riven Sounds that set the third argument of the playSound opcode to 1 (wherever they may be) will now block. The volume parameter of playSound is also now honored. Merge the Myst sound blocking code with this too. svn-id: r52643 --- engines/mohawk/myst_scripts.cpp | 5 +---- engines/mohawk/riven_external.cpp | 6 ++++-- engines/mohawk/riven_scripts.cpp | 12 +++++++++--- engines/mohawk/sound.cpp | 17 ++++++++++++----- engines/mohawk/sound.h | 8 ++++++-- 5 files changed, 32 insertions(+), 16 deletions(-) (limited to 'engines') diff --git a/engines/mohawk/myst_scripts.cpp b/engines/mohawk/myst_scripts.cpp index 29e9f349c3..bce1824a09 100644 --- a/engines/mohawk/myst_scripts.cpp +++ b/engines/mohawk/myst_scripts.cpp @@ -709,10 +709,7 @@ void MystScriptParser::playSoundBlocking(uint16 op, uint16 var, uint16 argc, uin debugC(kDebugScript, "Opcode %d: playSoundBlocking", op); debugC(kDebugScript, "\tsoundId: %d", soundId); - Audio::SoundHandle *handle = _vm->_sound->playSound(soundId); - - while (_vm->_mixer->isSoundHandleActive(*handle)) - _vm->_system->delayMillis(10); + _vm->_sound->playSoundBlocking(soundId); } else unknown(op, var, argc, argv); } diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp index 4feb1c1ea4..c4e77a6df8 100644 --- a/engines/mohawk/riven_external.cpp +++ b/engines/mohawk/riven_external.cpp @@ -1853,7 +1853,8 @@ void RivenExternal::xtexterior300_telescopedown(uint16 argc, uint16 *argv) { } else { // ...the telescope can't move down anymore. // Play the sound of not being able to move - _vm->_sound->playSound(13); + _vm->_gfx->changeCursor(kRivenHideCursor); + _vm->_sound->playSoundBlocking(13); } } else { // We're not at the bottom, and we can move down again @@ -1879,7 +1880,8 @@ void RivenExternal::xtexterior300_telescopeup(uint16 argc, uint16 *argv) { // Check if we can't move up anymore if (*telescopePos == 5) { // Play the sound of not being able to move - _vm->_sound->playSound(13); + _vm->_gfx->changeCursor(kRivenHideCursor); + _vm->_sound->playSoundBlocking(13); return; } diff --git a/engines/mohawk/riven_scripts.cpp b/engines/mohawk/riven_scripts.cpp index 151df9f147..30d1d727eb 100644 --- a/engines/mohawk/riven_scripts.cpp +++ b/engines/mohawk/riven_scripts.cpp @@ -346,9 +346,14 @@ void RivenScript::playScriptSLST(uint16 op, uint16 argc, uint16 *argv) { _vm->_activatedSLST = true; } -// Command 4: play local tWAV resource (twav_id, volume, u1) +// Command 4: play local tWAV resource (twav_id, volume, block) void RivenScript::playSound(uint16 op, uint16 argc, uint16 *argv) { - _vm->_sound->playSound(argv[0]); + byte volume = Sound::convertRivenVolume(argv[1]); + + if (argv[2] == 1) + _vm->_sound->playSoundBlocking(argv[0], volume); + else + _vm->_sound->playSound(argv[0], volume); } // Command 7: set variable value (variable, value) @@ -572,7 +577,8 @@ void RivenScript::activateFLST(uint16 op, uint16 argc, uint16 *argv) { for (uint16 i = 0; i < recordCount; i++) { uint16 index = flst->readUint16BE(); uint16 sfxeID = flst->readUint16BE(); - if(flst->readUint16BE() != 0) + + if (flst->readUint16BE() != 0) warning("FLST u0 non-zero"); if (index == argv[0]) { diff --git a/engines/mohawk/sound.cpp b/engines/mohawk/sound.cpp index 50a7d016f5..4a8c923c01 100644 --- a/engines/mohawk/sound.cpp +++ b/engines/mohawk/sound.cpp @@ -124,6 +124,13 @@ Audio::SoundHandle *Sound::playSound(uint16 id, byte volume, bool loop) { return NULL; } +void Sound::playSoundBlocking(uint16 id, byte volume) { + Audio::SoundHandle *handle = playSound(id, volume); + + while (_vm->_mixer->isSoundHandleActive(*handle)) + _vm->_system->delayMillis(10); +} + void Sound::playMidi(uint16 id) { uint32 idTag; if (!(_vm->getFeatures() & GF_HASMIDI)) { @@ -165,6 +172,10 @@ void Sound::playMidi(uint16 id) { _midiDriver->setTimerCallback(_midiParser, MidiParser::timerCallback); } +byte Sound::convertRivenVolume(uint16 volume) { + return (volume == 256) ? 255 : volume; +} + void Sound::playSLST(uint16 index, uint16 card) { Common::SeekableReadStream *slstStream = _vm->getRawData(ID_SLST, card); SLSTRecord slstRecord; @@ -287,13 +298,9 @@ void Sound::playSLSTSound(uint16 id, bool fade, bool loop, uint16 volume, int16 if (loop) audStream = Audio::makeLoopingAudioStream((Audio::RewindableAudioStream *)audStream, 0); - // The max mixer volume is 255 and the max Riven volume is 256. Just change it to 255. - if (volume == 256) - volume = 255; - // TODO: Handle fading, possibly just raise the volume of the channel in increments? - _vm->_mixer->playStream(Audio::Mixer::kPlainSoundType, sndHandle.handle, audStream, -1, volume, convertBalance(balance)); + _vm->_mixer->playStream(Audio::Mixer::kPlainSoundType, sndHandle.handle, audStream, -1, convertRivenVolume(volume), convertBalance(balance)); } void Sound::stopSLSTSound(uint16 index, bool fade) { diff --git a/engines/mohawk/sound.h b/engines/mohawk/sound.h index 05c713304d..f493130d35 100644 --- a/engines/mohawk/sound.h +++ b/engines/mohawk/sound.h @@ -115,19 +115,23 @@ class MohawkEngine; class Sound { public: - Sound(MohawkEngine*); + Sound(MohawkEngine *vm); ~Sound(); Audio::SoundHandle *playSound(uint16 id, byte volume = Audio::Mixer::kMaxChannelVolume, bool loop = false); + void playSoundBlocking(uint16 id, byte volume = Audio::Mixer::kMaxChannelVolume); void playMidi(uint16 id); void stopSound(); void pauseSound(); void resumeSound(); + + // Riven-specific void playSLST(uint16 index, uint16 card); void playSLST(SLSTRecord slstRecord); void pauseSLST(); void resumeSLST(); void stopAllSLST(); + static byte convertRivenVolume(uint16 volume); private: MohawkEngine *_vm; @@ -141,7 +145,7 @@ private: Common::Array _handles; SndHandle *getHandle(); - // Riven specific + // Riven-specific void playSLSTSound(uint16 index, bool fade, bool loop, uint16 volume, int16 balance); void stopSLSTSound(uint16 id, bool fade); Common::Array _currentSLSTSounds; -- cgit v1.2.3