diff options
-rw-r--r-- | scumm/sound.cpp | 19 | ||||
-rw-r--r-- | sound/mixer.cpp | 5 |
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)); } |