aboutsummaryrefslogtreecommitdiff
path: root/scumm/imuse_digi/dimuse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scumm/imuse_digi/dimuse.cpp')
-rw-r--r--scumm/imuse_digi/dimuse.cpp111
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) {