diff options
author | Matthew Hoops | 2010-06-10 20:26:59 +0000 |
---|---|---|
committer | Matthew Hoops | 2010-06-10 20:26:59 +0000 |
commit | 9f907aac095123ac016a23a559f54ada35af6772 (patch) | |
tree | 932c0f972e1a0c31bd943ebbf61888a1e1ac82cf | |
parent | 8f55c4ddb4ceb64e6121ee9fe08b07c2905d4748 (diff) | |
download | scummvm-rg350-9f907aac095123ac016a23a559f54ada35af6772.tar.gz scummvm-rg350-9f907aac095123ac016a23a559f54ada35af6772.tar.bz2 scummvm-rg350-9f907aac095123ac016a23a559f54ada35af6772.zip |
kSciAudioWPlay should not actually play the song, but 'pre-load' it. We fake the pre-loading with a flag that will return 0 if the song has been called with kSciAudioWPlay. Fixes the dream sequence sound in MUMG.
svn-id: r49583
-rw-r--r-- | engines/sci/engine/ksound.cpp | 8 | ||||
-rw-r--r-- | engines/sci/sound/audio.cpp | 16 | ||||
-rw-r--r-- | engines/sci/sound/audio.h | 5 |
3 files changed, 25 insertions, 4 deletions
diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp index 29302181b1..ebfd6e6885 100644 --- a/engines/sci/engine/ksound.cpp +++ b/engines/sci/engine/ksound.cpp @@ -44,7 +44,6 @@ reg_t kDoSound(EngineState *s, int argc, reg_t *argv) { reg_t kDoCdAudio(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { - case kSciAudioWPlay: case kSciAudioPlay: { if (argc < 2) return NULL_REG; @@ -72,6 +71,7 @@ reg_t kDoCdAudio(EngineState *s, int argc, reg_t *argv) { break; case kSciAudioPosition: return make_reg(0, g_sci->_audio->audioCdPosition()); + case kSciAudioWPlay: // CD Audio can't be preloaded case kSciAudioRate: // No need to set the audio rate case kSciAudioVolume: // The speech setting isn't used by CD Audio case kSciAudioLanguage: // No need to set the language @@ -119,7 +119,11 @@ reg_t kDoAudio(EngineState *s, int argc, reg_t *argv) { return NULL_REG; } - return make_reg(0, g_sci->_audio->startAudio(module, number)); // return sample length in ticks + // return sample length in ticks + if (argv[0].toUint16() == kSciAudioWPlay) + return make_reg(0, g_sci->_audio->wPlayAudio(module, number)); + else + return make_reg(0, g_sci->_audio->startAudio(module, number)); } case kSciAudioStop: g_sci->_audio->stopAudio(); diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index f10cc5ed68..62cfcd9621 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -47,6 +47,7 @@ AudioPlayer::AudioPlayer(ResourceManager *resMan) : _resMan(resMan), _audioRate( _syncResource(NULL), _syncOffset(0), _audioCdStart(0) { _mixer = g_system->getMixer(); + _wPlayFlag = false; } AudioPlayer::~AudioPlayer() { @@ -65,6 +66,7 @@ int AudioPlayer::startAudio(uint16 module, uint32 number) { Audio::AudioStream *audioStream = getAudioStream(number, module, &sampleLen); if (audioStream) { + _wPlayFlag = false; _mixer->playStream(Audio::Mixer::kSpeechSoundType, &_audioHandle, audioStream); return sampleLen; } @@ -72,6 +74,18 @@ int AudioPlayer::startAudio(uint16 module, uint32 number) { return 0; } +int AudioPlayer::wPlayAudio(uint16 module, uint32 tuple) { + // Get the audio sample length and set the wPlay flag so we return 0 on position. + // SSCI pre-loads the audio here, but it's much easier for us to just get the + // sample length and return that. wPlayAudio should *not* actually start the sample. + + int sampleLen = 0; + Audio::AudioStream *audioStream = getAudioStream(module, tuple, &sampleLen); + delete audioStream; + _wPlayFlag = true; + return sampleLen; +} + void AudioPlayer::stopAudio() { _mixer->stopHandle(_audioHandle); } @@ -87,6 +101,8 @@ void AudioPlayer::resumeAudio() { int AudioPlayer::getAudioPosition() { if (_mixer->isSoundHandleActive(_audioHandle)) return _mixer->getSoundElapsedTime(_audioHandle) * 6 / 100; // return elapsed time in ticks + else if (_wPlayFlag) + return 0; // Sound has "loaded" so return that it hasn't started else return -1; // Sound finished } diff --git a/engines/sci/sound/audio.h b/engines/sci/sound/audio.h index 9fc3cbac51..7c1221fc4c 100644 --- a/engines/sci/sound/audio.h +++ b/engines/sci/sound/audio.h @@ -33,8 +33,7 @@ namespace Sci { enum AudioCommands { - // TODO: find the difference between kSci1AudioWPlay and kSci1AudioPlay - kSciAudioWPlay = 1, /* Plays an audio stream */ + kSciAudioWPlay = 1, /* Loads an audio stream */ kSciAudioPlay = 2, /* Plays an audio stream */ kSciAudioStop = 3, /* Stops an audio stream */ kSciAudioPause = 4, /* Pauses an audio stream */ @@ -69,6 +68,7 @@ public: Audio::RewindableAudioStream *getAudioStream(uint32 number, uint32 volume, int *sampleLen); int getAudioPosition(); int startAudio(uint16 module, uint32 tuple); + int wPlayAudio(uint16 module, uint32 tuple); void stopAudio(); void pauseAudio(); void resumeAudio(); @@ -92,6 +92,7 @@ private: Resource *_syncResource; /**< Used by kDoSync for speech syncing in CD talkie games */ uint _syncOffset; uint32 _audioCdStart; + bool _wPlayFlag; }; } // End of namespace Sci |