diff options
Diffstat (limited to 'scumm/imuse_digi/dimuse.cpp')
-rw-r--r-- | scumm/imuse_digi/dimuse.cpp | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/scumm/imuse_digi/dimuse.cpp b/scumm/imuse_digi/dimuse.cpp index cee881727a..83c1688bf4 100644 --- a/scumm/imuse_digi/dimuse.cpp +++ b/scumm/imuse_digi/dimuse.cpp @@ -87,8 +87,18 @@ int IMuseDigital::pullProcCallback(void *refCon, CustomProcInputStream *stream, int IMuseDigital::pullProc(CustomProcInputStream *stream, byte *mixerBuffer, int pullSize) { Common::StackLock lock(_mutex, "IMuseDigital::pullProc()"); + debug(5, "pullProc() pullSize:%d", pullSize); for (int l = 0; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) { if ((_track[l]->used) && (_track[l]->stream == stream)) { + if (_track[l]->toBeRemoved) { + debug(5, "IMuseDigital::pullProc() stopped sound: %d", _track[l]->soundId); + _track[l]->stream->finish(); + _track[l]->stream = NULL; + _sound->closeSound(_track[l]->soundHandle); + _track[l]->soundHandle = NULL; + _track[l]->used = false; + return 0; + } _vm->_mixer->setChannelVolume(_track[l]->handle, _track[l]->mixerVol); _vm->_mixer->setChannelBalance(_track[l]->handle, _track[l]->mixerPan); int32 mixer_size = pullSize; @@ -97,11 +107,19 @@ int IMuseDigital::pullProc(CustomProcInputStream *stream, byte *mixerBuffer, int if (_track[l]->curRegion == -1) { switchToNextRegion(l); - if (_track[l]->toBeRemoved) - continue; + if (_track[l]->toBeRemoved) { + return 0; + } } int bits = _sound->getBits(_track[l]->soundHandle); + int channels = _sound->getChannels(_track[l]->soundHandle); + + if ((bits == 16) && (channels == 2)) + assert((pullSize & 3) == 0); + else if ((bits == 16) || (channels == 2)) + assert((pullSize & 1) == 0); + do { if (bits == 12) { byte *ptr = NULL; @@ -175,16 +193,6 @@ void IMuseDigital::callback() { _track[l]->used = false; continue; } - } else if (_track[l]->stream) { - if (_track[l]->toBeRemoved) { - debug(5, "IMuseDigital::callback() B: stopped sound: %d", _track[l]->soundId); - _track[l]->stream->finish(); - _track[l]->stream = NULL; - _sound->closeSound(_track[l]->soundHandle); - _track[l]->soundHandle = NULL; - _track[l]->used = false; - continue; - } } if (_track[l]->volFadeUsed) { @@ -390,8 +398,11 @@ void IMuseDigital::callback() { #endif void IMuseDigital::switchToNextRegion(int track) { + debug(5, "switchToNextRegion(track:%d)", track); + if (track >= MAX_DIGITAL_TRACKS) { _track[track]->toBeRemoved = true; + debug(5, "exit (fadetrack can't go next region) switchToNextRegion(track:%d)", track); return; } @@ -399,6 +410,7 @@ void IMuseDigital::switchToNextRegion(int track) { if (++_track[track]->curRegion == num_regions) { _track[track]->toBeRemoved = true; + debug(5, "exit (end of regions) switchToNextRegion(track:%d)", track); return; } |