diff options
Diffstat (limited to 'scumm/imuse_digi/dimuse.cpp')
-rw-r--r-- | scumm/imuse_digi/dimuse.cpp | 111 |
1 files changed, 105 insertions, 6 deletions
diff --git a/scumm/imuse_digi/dimuse.cpp b/scumm/imuse_digi/dimuse.cpp index 1feefff637..58dddc8a07 100644 --- a/scumm/imuse_digi/dimuse.cpp +++ b/scumm/imuse_digi/dimuse.cpp @@ -78,10 +78,19 @@ void IMuseDigital::resetState() { _nextSeqToPlay = 0; } -void IMuseDigital::pullDataForMixer(int32 pullSize, byte *mixerBuffer, AudioStream *stream) { - Common::StackLock lock(_mutex, "IMuseDigital::pullDataForMixer()"); +#ifdef ENABLE_PULLMETHOD + +int IMuseDigital::pullProcCallback(void *refCon, CustomProcInputStream *stream, byte *mixerBuffer, int pullSize) { + IMuseDigital *imuseDigital = (IMuseDigital *)refCon; + return imuseDigital->pullProc(stream, mixerBuffer, pullSize); +} + +int IMuseDigital::pullProc(CustomProcInputStream *stream, byte *mixerBuffer, int pullSize) { + Common::StackLock lock(_mutex, "IMuseDigital::pullProc()"); for (int l = 0; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) { if (_track[l]->stream == stream) { + _vm->_mixer->setChannelVolume(_track[l]->handle, _track[l]->mixerVol); + _vm->_mixer->setChannelBalance(_track[l]->handle, _track[l]->mixerPan); int32 mixer_size = pullSize; byte *data = NULL; int32 result = 0, pos = 0; @@ -114,6 +123,10 @@ void IMuseDigital::pullDataForMixer(int32 pullSize, byte *mixerBuffer, AudioStre result &= ~2; } } else if (bits == 8) { + memset(mixerBuffer, 0x80, pullSize); + _track[l]->toBeRemoved = true; + return pullSize; + result = _sound->getDataFromRegion(_track[l]->soundHandle, _track[l]->curRegion, &data, _track[l]->regionOffset, mixer_size); if (_sound->getChannels(_track[l]->soundHandle) == 2) { result &= ~1; @@ -132,18 +145,103 @@ void IMuseDigital::pullDataForMixer(int32 pullSize, byte *mixerBuffer, AudioStre if (_sound->isEndOfRegion(_track[l]->soundHandle, _track[l]->curRegion)) { switchToNextRegion(l); - if (_track[l]->toBeRemoved) - break; + if (_track[l]->toBeRemoved) { + mixer_size -= result; + return pullSize - mixer_size; + } } mixer_size -= result; assert(mixer_size >= 0); } while (mixer_size != 0); - return; + return pullSize; + } + } + error("IMuseDigital::pullProc() Can't match streams"); +} + +void IMuseDigital::callback() { + Common::StackLock lock(_mutex, "IMuseDigital::callback()"); + int l = 0; + + if (_pause || !_vm) + return; + + for (l = 0; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) { + if (_track[l]->used) { + if (_track[l]->stream2) { + if (!_track[l]->handle.isActive() && _track[l]->started) { + debug(5, "IMuseDigital::callback() A: stopped sound: %d", _track[l]->soundId); + delete _track[l]->stream2; + _track[l]->stream2 = NULL; + _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) { + if (_track[l]->volFadeStep < 0) { + if (_track[l]->vol > _track[l]->volFadeDest) { + _track[l]->vol += _track[l]->volFadeStep; + if (_track[l]->vol < _track[l]->volFadeDest) { + _track[l]->vol = _track[l]->volFadeDest; + _track[l]->volFadeUsed = false; + } + if (_track[l]->vol == 0) { + _track[l]->toBeRemoved = true; + } + } + } else if (_track[l]->volFadeStep > 0) { + if (_track[l]->vol < _track[l]->volFadeDest) { + _track[l]->vol += _track[l]->volFadeStep; + if (_track[l]->vol > _track[l]->volFadeDest) { + _track[l]->vol = _track[l]->volFadeDest; + _track[l]->volFadeUsed = false; + } + } + } + debug(5, "Fade: sound(%d), Vol(%d)", _track[l]->soundId, _track[l]->vol / 1000); + } + + int pan = (_track[l]->pan != 64) ? 2 * _track[l]->pan - 127 : 0; + int vol = _track[l]->vol / 1000; + + if (_track[l]->volGroupId == 1) + vol = (vol * _volVoice) / 128; + if (_track[l]->volGroupId == 2) + vol = (vol * _volSfx) / 128; + if (_track[l]->volGroupId == 3) + vol = (vol * _volMusic) / 128; + + _track[l]->mixerVol = vol; + _track[l]->mixerPan = pan; + + if (_vm->_mixer->isReady()) { + if (_track[l]->stream2) { + if (!_track[l]->started) { + _track[l]->started = true; + _vm->_mixer->playInputStream(&_track[l]->handle, _track[l]->stream2, false, _track[l]->vol / 1000, _track[l]->pan, -1, false); + } else { + _vm->_mixer->setChannelVolume(_track[l]->handle, vol); + _vm->_mixer->setChannelBalance(_track[l]->handle, pan); + } + } + } } } - error("IMuseDigital::pullDataForMixer() Can't match streams"); } +#else + void IMuseDigital::callback() { Common::StackLock lock(_mutex, "IMuseDigital::callback()"); int l = 0; @@ -287,6 +385,7 @@ void IMuseDigital::callback() { } } } +#endif void IMuseDigital::switchToNextRegion(int track) { if (track >= MAX_DIGITAL_TRACKS) { |