aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/sound/qmixer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic/sound/qmixer.cpp')
-rw-r--r--engines/titanic/sound/qmixer.cpp23
1 files changed, 18 insertions, 5 deletions
diff --git a/engines/titanic/sound/qmixer.cpp b/engines/titanic/sound/qmixer.cpp
index 32554a5659..145d142b2d 100644
--- a/engines/titanic/sound/qmixer.cpp
+++ b/engines/titanic/sound/qmixer.cpp
@@ -118,7 +118,7 @@ int QMixer::qsWaveMixPlayEx(int iChannel, uint flags, CWaveFile *waveFile, int l
}
// Add the sound to the channel
- channel._sounds.push_back(SoundEntry(waveFile, params.callback, params.dwUser));
+ channel._sounds.push_back(SoundEntry(waveFile, params.callback, loops, params.dwUser));
qsWaveMixPump();
return 0;
@@ -138,9 +138,21 @@ void QMixer::qsWaveMixPump() {
if (!channel._sounds.empty()) {
SoundEntry &sound = channel._sounds.front();
if (sound._started && !_mixer->isSoundHandleActive(sound._soundHandle)) {
- if (sound._callback)
- sound._callback(iChannel, sound._waveFile, sound._userData);
- channel._sounds.erase(channel._sounds.begin());
+ if (sound._loops == -1 || sound._loops-- > 0) {
+ // Need to loop the sound again
+ sound._waveFile->_stream->rewind();
+ _mixer->playStream(sound._waveFile->_soundType,
+ &sound._soundHandle, sound._waveFile->_stream,
+ -1, 0xff, 0, DisposeAfterUse::NO);
+ } else {
+ // Sound is finished
+ if (sound._callback)
+ // Call the callback to signal end
+ sound._callback(iChannel, sound._waveFile, sound._userData);
+
+ // Remove sound record from channel
+ channel._sounds.erase(channel._sounds.begin());
+ }
}
}
@@ -150,7 +162,8 @@ void QMixer::qsWaveMixPump() {
SoundEntry &sound = channel._sounds.front();
if (!sound._started) {
_mixer->playStream(sound._waveFile->_soundType,
- &sound._soundHandle, sound._waveFile->_stream);
+ &sound._soundHandle, sound._waveFile->_stream,
+ -1, 0xff, 0, DisposeAfterUse::NO);
sound._started = true;
}
}