aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/sound.cpp19
-rw-r--r--sound/mixer.cpp5
2 files changed, 20 insertions, 4 deletions
diff --git a/scumm/sound.cpp b/scumm/sound.cpp
index 516cedbf89..6bac62dd21 100644
--- a/scumm/sound.cpp
+++ b/scumm/sound.cpp
@@ -370,6 +370,8 @@ void Sound::playSound(int soundID) {
#endif
rate = 11000;
int type = *(ptr + 0x0D);
+ int loop_start = READ_LE_UINT32(ptr+0x26);
+ int loop_end = READ_LE_UINT32(ptr+0x2A);
// Check if it is a CD playback resource
if (type == 2) {
@@ -399,8 +401,15 @@ void Sound::playSound(int soundID) {
sound[x] = bit;
}
- // FIXME: Maybe something in the header signifies looping? Need to
- // track it down and add a mixer flag or something.
+ if (loop_end > 0) {
+ flags |= SoundMixer::FLAG_LOOP;
+
+ if ((loop_end < size) || (loop_start > 0)) {
+ // FIXME: Implement partial loops
+ warning("Partial loops not implemented. Loop at 0x%X thru 0x%X", loop_start, loop_end);
+ }
+ }
+
_scumm->_mixer->playRaw(NULL, sound, size, 11000, flags, soundID);
return;
}
@@ -724,13 +733,15 @@ void Sound::stopSound(int a) {
stopCD();
}
- if (_scumm->_imuseDigital) {
+ if (_scumm->_gameId == GID_ZAK256) {
+ _scumm->_mixer->stopID(a);
+ } else if (_scumm->_imuseDigital) {
_scumm->_imuseDigital->stopSound(a);
} else if (_scumm->_imuse) {
_scumm->_imuse->stopSound(a);
} else if (_scumm->_playerV2) {
_scumm->_playerV2->stopSound (a);
- }
+ }
for (i = 0; i < 10; i++)
if (_soundQue2[i] == a)
diff --git a/sound/mixer.cpp b/sound/mixer.cpp
index 3a34642030..6dbead7e49 100644
--- a/sound/mixer.cpp
+++ b/sound/mixer.cpp
@@ -229,6 +229,11 @@ int SoundMixer::insertChannel(PlayingSoundHandle *handle, Channel *chan) {
}
int SoundMixer::playRaw(PlayingSoundHandle *handle, void *sound, uint32 size, uint rate, byte flags, int id) {
+ // Prevent duplicate sounds
+ for (int i = 0; i != NUM_CHANNELS; i++)
+ if (_channels[i] != NULL && _channels[i]->_id == id)
+ return -1;
+
return insertChannel(handle, new ChannelRaw(this, sound, size, rate, flags, id));
}