diff options
-rw-r--r-- | common/timer.cpp | 10 | ||||
-rw-r--r-- | scumm/sound.cpp | 48 | ||||
-rw-r--r-- | scumm/sound.h | 1 |
3 files changed, 23 insertions, 36 deletions
diff --git a/common/timer.cpp b/common/timer.cpp index 92229eecd6..f96a2e553a 100644 --- a/common/timer.cpp +++ b/common/timer.cpp @@ -91,12 +91,10 @@ int Timer::handler(int t) { for (l = 0; l < MAX_TIMERS; l++) { if (_timerSlots[l].procedure && _timerSlots[l].interval > 0) { _timerSlots[l].counter -= interval; - // FIXME: We only check the value of _timerSlots[l].interval here - // because the timer might remove itself. - // Strictly spoken, that is a dirty thing to do for a timer, but for - // now the bundle timer requires this. Of course the whole bundle - // music timer is kind of scary anyway... - while (_timerSlots[l].counter <= 0 && _timerSlots[l].interval > 0) { + while (_timerSlots[l].counter <= 0) { + // A small paranoia check which catches the case where + // a timer removes itself (which it never should do). + assert(_timerSlots[l].procedure && _timerSlots[l].interval > 0); _timerSlots[l].counter += _timerSlots[l].interval; _timerSlots[l].procedure(_timerSlots[l].refCon); } diff --git a/scumm/sound.cpp b/scumm/sound.cpp index b8df43cb63..fc76119742 100644 --- a/scumm/sound.cpp +++ b/scumm/sound.cpp @@ -1011,8 +1011,9 @@ void Sound::playBundleMusic(const char *song) { } if (_nameBundleMusic[0] == 0) { - _outputMixerSize = 66150; // ((22050 * 2 * 2) / 4) * 3 if (_scumm->_gameId == GID_CMI) { + _outputMixerSize = (22050 * 2 * 2); + char bunfile[20]; sprintf(bunfile, "musdisk%d.bun", _scumm->VAR(_scumm->VAR_CURRENTDISK)); if (_musicDisk != _scumm->VAR(_scumm->VAR_CURRENTDISK)) @@ -1026,8 +1027,9 @@ void Sound::playBundleMusic(const char *song) { } _musicDisk = (byte)_scumm->VAR(_scumm->VAR_CURRENTDISK); - _outputMixerSize = 88140; // ((22050 * 2 * 2) } else { + _outputMixerSize = ((22050 * 2 * 2) / 4) * 3; + if (_bundle->openMusicFile("digmusic.bun", _scumm->getGameDataPath()) == false) return; } @@ -1038,17 +1040,13 @@ void Sound::playBundleMusic(const char *song) { _offsetBufBundleMusic = 0; _bundleMusicPosition = 0; _pauseBundleMusic = false; - _musicBundleToBeRemoved = false; _musicBundleToBeChanged = false; _bundleMusicTrack = 0; _numberSamplesBundleMusic = _bundle->getNumberOfMusicSamplesByName(song); _nameBundleMusic = song; _scumm->_timer->installProcedure(&music_handler, 1000000, this); - return; - } - if (strcmp(_nameBundleMusic, song) != 0) { + } else if (strcmp(_nameBundleMusic, song) != 0) { _newNameBundleMusic = song; - _musicBundleToBeRemoved = false; _musicBundleToBeChanged = true; } } @@ -1058,7 +1056,18 @@ void Sound::pauseBundleMusic(bool state) { } void Sound::stopBundleMusic() { - _musicBundleToBeRemoved = true; + // First stop the music timer + _scumm->_timer->releaseProcedure(&music_handler); + _nameBundleMusic = ""; + _scumm->_mixer->stopChannel(_bundleMusicTrack); + if (_musicBundleBufFinal) { + free(_musicBundleBufFinal); + _musicBundleBufFinal = NULL; + } + if (_musicBundleBufOutput) { + free(_musicBundleBufOutput); + _musicBundleBufOutput = NULL; + } } void Sound::bundleMusicHandler(ScummEngine *scumm) { @@ -1070,21 +1079,6 @@ void Sound::bundleMusicHandler(ScummEngine *scumm) { if (_pauseBundleMusic) return; - if (_musicBundleToBeRemoved) { - _scumm->_timer->releaseProcedure(&music_handler); - _nameBundleMusic = ""; - _scumm->_mixer->stopChannel(_bundleMusicTrack); - if (_musicBundleBufFinal) { - free(_musicBundleBufFinal); - _musicBundleBufFinal = NULL; - } - if (_musicBundleBufOutput) { - free(_musicBundleBufOutput); - _musicBundleBufOutput = NULL; - } - return; - } - if (_musicBundleToBeChanged) { _nameBundleMusic = _newNameBundleMusic; _numberSamplesBundleMusic = _bundle->getNumberOfMusicSamplesByName(_nameBundleMusic); @@ -1104,9 +1098,7 @@ void Sound::bundleMusicHandler(ScummEngine *scumm) { if (l == 0) { tag = READ_BE_UINT32(ptr); ptr += 4; if (tag != MKID_BE('iMUS')) { - warning("Decompression of bundle song failed"); - _musicBundleToBeRemoved = true; - return; + error("Decompressing bundle song failed (unknown tag '%s')", tag2str(tag)); } ptr += 12; @@ -1139,9 +1131,7 @@ void Sound::bundleMusicHandler(ScummEngine *scumm) { } } if (size < 0) { - warning("Decompression sound failed (no size field)"); - _musicBundleToBeRemoved = true; - return; + error("Decompressing sound failed (missing size field)"); } header_size = (ptr - _musicBundleBufOutput); } diff --git a/scumm/sound.h b/scumm/sound.h index c9798d2df5..de2a4c4e21 100644 --- a/scumm/sound.h +++ b/scumm/sound.h @@ -57,7 +57,6 @@ protected: bool _pauseBundleMusic; PlayingSoundHandle _bundleMusicTrack; bool _musicBundleToBeChanged; - bool _musicBundleToBeRemoved; int32 _bundleMusicSampleBits; int32 _outputMixerSize; int32 _bundleSampleChannels; |