From deef0b955ca95c6c4141668f60fd0bccc0b9949d Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 4 Aug 2013 12:56:15 +0100 Subject: MORTEVIELLE: Fix crash in sound mixer when closing the engine This was due to the _speakerHandle being reused between its initialisation in the SoundManager constructor and the destructor causing it to have a wrong value when trying (and failing) to stop the PCSpeaker channel in the mixer before deleting the stream. --- engines/mortevielle/sound.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'engines/mortevielle') diff --git a/engines/mortevielle/sound.cpp b/engines/mortevielle/sound.cpp index 95da5c0e01..d95b12da3c 100644 --- a/engines/mortevielle/sound.cpp +++ b/engines/mortevielle/sound.cpp @@ -187,10 +187,13 @@ void SoundManager::playNote(int frequency, int32 length) { void SoundManager::playSong(const byte* buf, int size) { Audio::AudioStream *stream = Audio::makeRawStream(buf, size, 11025 / 2, Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN | Audio::FLAG_16BITS); - _mixer->playStream(Audio::Mixer::kSFXSoundType, &_speakerHandle, stream, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO); + Audio::SoundHandle songHandle; + _mixer->playStream(Audio::Mixer::kSFXSoundType, &songHandle, stream, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO); - while (_mixer->isSoundHandleActive(_speakerHandle) && !_vm->keyPressed() && !_vm->_mouseClick && !_vm->shouldQuit()) + while (_mixer->isSoundHandleActive(songHandle) && !_vm->keyPressed() && !_vm->_mouseClick && !_vm->shouldQuit()) ; + // In case the handle is still active, stop it. + _mixer->stopHandle(songHandle); } void SoundManager::setParent(MortevielleEngine *vm) { -- cgit v1.2.3