aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
Diffstat (limited to 'scumm')
-rw-r--r--scumm/imuse_digi.cpp26
-rw-r--r--scumm/imuse_digi.h6
2 files changed, 23 insertions, 9 deletions
diff --git a/scumm/imuse_digi.cpp b/scumm/imuse_digi.cpp
index 10bb921fec..4a25804be2 100644
--- a/scumm/imuse_digi.cpp
+++ b/scumm/imuse_digi.cpp
@@ -661,6 +661,10 @@ static uint32 decode12BitsSample(byte *src, byte **dst, uint32 size, bool stereo
return s_size;
}
+IMuseDigital::Channel::Channel()
+ : idSound(-1), used(false), stream(0) {
+}
+
void IMuseDigital::timer_handler(void *refCon) {
IMuseDigital *imuseDigital = (IMuseDigital *)refCon;
imuseDigital->callback();
@@ -691,6 +695,7 @@ IMuseDigital::~IMuseDigital() {
for (int l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
_scumm->_mixer->stopHandle(_channel[l].handle);
+ delete _channel[l].stream;
}
delete _bundle;
@@ -706,7 +711,8 @@ void IMuseDigital::callback() {
if (_channel[l].used) {
if (_channel[l].toBeRemoved) {
debug(5, "IMuseDigital::callback(): stoped sound: %d", _channel[l].idSound);
- _scumm->_mixer->endStream(_channel[l].handle);
+ if (_channel[l].stream)
+ _channel[l].stream->finish();
free(_channel[l].data);
_channel[l].used = false;
continue;
@@ -745,12 +751,15 @@ void IMuseDigital::callback() {
int pan = (_channel[l].pan != 64) ? 2 * _channel[l].pan - 127 : 0;
if (_scumm->_mixer->isReady()) {
- if (!_channel[l].handle.isActive())
- _scumm->_mixer->newStream(&_channel[l].handle, _channel[l].freq,
- _channel[l].mixerFlags, 100000);
- _scumm->_mixer->setChannelVolume(_channel[l].handle, _channel[l].vol / 1000);
- _scumm->_mixer->setChannelPan(_channel[l].handle, pan);
- _scumm->_mixer->appendStream(_channel[l].handle, _channel[l].data + _channel[l].offset, mixer_size);
+ if (!_channel[l].stream) {
+ // Create an AudioInputStream and hook it to the mixer.
+ _channel[l].stream = makeWrappedInputStream(_channel[l].freq, _channel[l].mixerFlags, 100000);
+ _scumm->_mixer->playInputStream(&_channel[l].handle, _channel[l].stream, true, _channel[l].vol / 1000, _channel[l].pan, -1, false);
+ } else {
+ _scumm->_mixer->setChannelVolume(_channel[l].handle, _channel[l].vol / 1000);
+ _scumm->_mixer->setChannelPan(_channel[l].handle, pan);
+ }
+ _channel[l].stream->append(_channel[l].data + _channel[l].offset, mixer_size);
}
_channel[l].offset += mixer_size;
}
@@ -802,6 +811,9 @@ void IMuseDigital::startSound(int sound) {
_channel[l].offset = 0;
_channel[l].idSound = sound;
+
+ delete _channel[l].stream;
+ _channel[l].stream = 0;
uint32 tag;
int32 size = 0;
diff --git a/scumm/imuse_digi.h b/scumm/imuse_digi.h
index eb7ade49d2..9bd7b379e9 100644
--- a/scumm/imuse_digi.h
+++ b/scumm/imuse_digi.h
@@ -25,6 +25,7 @@
#include "common/scummsys.h"
#include "scumm/music.h"
+#include "sound/audiostream.h"
#include "sound/mixer.h"
namespace Scumm {
@@ -84,11 +85,12 @@ private:
int idSound;
int32 mixerSize;
int mixerFlags;
- PlayingSoundHandle handle;
bool used;
bool toBeRemoved;
+ PlayingSoundHandle handle;
+ WrappedAudioInputStream *stream;
- Channel() : idSound(-1), used(false) {}
+ Channel();
};
Channel _channel[MAX_DIGITAL_CHANNELS];