diff options
-rw-r--r-- | scumm/script_v7he.cpp | 5 | ||||
-rw-r--r-- | scumm/sound.cpp | 65 | ||||
-rw-r--r-- | scumm/sound.h | 15 |
3 files changed, 51 insertions, 34 deletions
diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp index c812678ade..367b8a3a59 100644 --- a/scumm/script_v7he.cpp +++ b/scumm/script_v7he.cpp @@ -444,9 +444,8 @@ void ScummEngine_v70he::o70_startSound() { break; case 255: - // _sound->addSoundToQueue(_heSndSoundId, _heSndOffset, _heSndChannel, _heSndFlags); - _sound->addSoundToQueue(_heSndSoundId, _heSndOffset); - debug(2, "o70_startSound stub (%d, %d, %d, %d)", _heSndSoundId, _heSndOffset, _heSndChannel, _heSndFlags); + debug(0, "o70_startSound (ID %d, Offset %d, Channel %d, Flags %d)", _heSndSoundId, _heSndOffset, _heSndChannel, _heSndFlags); + _sound->addSoundToQueue(_heSndSoundId, _heSndOffset, _heSndChannel, _heSndFlags); _heSndFlags = 0; break; diff --git a/scumm/sound.cpp b/scumm/sound.cpp index b9896a63eb..afc1eaabd7 100644 --- a/scumm/sound.cpp +++ b/scumm/sound.cpp @@ -76,8 +76,7 @@ Sound::Sound(ScummEngine *parent) _sfxMode(0) { memset(_soundQue, 0, sizeof(_soundQue)); - memset(_soundQue2Sound, 0, sizeof(_soundQue2Sound)); - memset(_soundQue2Offset, 0, sizeof(_soundQue2Offset)); + memset(_soundQue2, 0, sizeof(_soundQue2)); memset(_mouthSyncTimes, 0, sizeof(_mouthSyncTimes)); } @@ -86,31 +85,34 @@ Sound::~Sound() { delete _sfxFile; } -void Sound::addSoundToQueue(int sound, int offset) { +void Sound::addSoundToQueue(int sound, int heOffset, int heChannel, int heFlags) { _vm->VAR(_vm->VAR_LAST_SOUND) = sound; // HE music resources are in separate file if (sound <= _vm->_numSounds) _vm->ensureResourceLoaded(rtSound, sound); - addSoundToQueue2(sound, offset); + addSoundToQueue2(sound, heOffset, heChannel, heFlags); } -void Sound::addSoundToQueue2(int sound, int offset) { +void Sound::addSoundToQueue2(int sound, int heOffset, int heChannel, int heFlags) { if ((_vm->_features & GF_HUMONGOUS) && _soundQue2Pos) { int i = _soundQue2Pos; while (i--) { - if (_soundQue2Sound[i] == sound) + if (_soundQue2[i].sound == sound) return; } } - assert(_soundQue2Pos < ARRAYSIZE(_soundQue2Sound)); - _soundQue2Sound[_soundQue2Pos] = sound; - _soundQue2Offset[_soundQue2Pos] = offset; + assert(_soundQue2Pos < ARRAYSIZE(_soundQue2)); + _soundQue2[_soundQue2Pos].sound = sound; + _soundQue2[_soundQue2Pos].offset = heOffset; + _soundQue2[_soundQue2Pos].channel = heChannel; + _soundQue2[_soundQue2Pos].flags = heFlags; _soundQue2Pos++; } void Sound::processSoundQues() { - int i = 0, num, offset, snd; + int i = 0, num; + int snd, heOffset, heChannel, heFlags; int data[16]; processSfxQueues(); @@ -120,10 +122,12 @@ void Sound::processSoundQues() { while (_soundQue2Pos) { _soundQue2Pos--; - snd = _soundQue2Sound[_soundQue2Pos]; - offset = _soundQue2Offset[_soundQue2Pos]; + snd = _soundQue2[_soundQue2Pos].sound; + heOffset = _soundQue2[_soundQue2Pos].offset; + heChannel = _soundQue2[_soundQue2Pos].channel; + heFlags = _soundQue2[_soundQue2Pos].flags; if (snd) - playSound(snd, offset); + playSound(snd, heOffset, heChannel, heFlags); } while (i < _soundQuePos) { @@ -154,7 +158,7 @@ void Sound::setOverrideFreq(int freq) { _overrideFreq = freq; } -void Sound::playSound(int soundID, int offset) { +void Sound::playSound(int soundID, int heOffset, int heChannel, int heFlags) { byte *ptr; char *sound; int size = -1; @@ -266,15 +270,17 @@ void Sound::playSound(int soundID, int offset) { ptr += 8 + READ_BE_UINT32(ptr + 12); } - if (READ_UINT32(ptr) != MKID('SDAT')) + if (READ_UINT32(ptr) != MKID('SDAT')) { + warning("playSound: Invalid sound %d", soundID); return; // abort + } size = READ_BE_UINT32(ptr+4) - 8; - if (offset > size) { + if (heOffset > size) { warning("playSound: Bad sound offset"); - offset = 0; + heOffset = 0; } - size -= offset; + size -= heOffset; if (_overrideFreq) { // Used by the piano in Fatty Bear's Birthday Surprise @@ -282,9 +288,13 @@ void Sound::playSound(int soundID, int offset) { _overrideFreq = 0; } + // TODO: Set sound channel based on heChannel + if (heFlags & 1) + flags |= SoundMixer::FLAG_LOOP; + // Allocate a sound buffer, copy the data into it, and play sound = (char *)malloc(size); - memcpy(sound, ptr + offset + 8, size); + memcpy(sound, ptr + heOffset + 8, size); if (music == true) { _vm->_mixer->stopHandle(_musicChannelHandle); @@ -823,7 +833,7 @@ bool Sound::isSoundInQueue(int sound) const { i = _soundQue2Pos; while (i--) { - if (_soundQue2Sound[i] == sound) + if (_soundQue2[i].sound == sound) return true; } @@ -845,7 +855,7 @@ void Sound::stopSound(int sound) { if (_vm->_features & GF_HUMONGOUS) { if (sound == -2 || sound >= 10001) { - // Maybe stops sound channel? + // TODO: Stop sound channel (sound - 100000) } else if (sound == -1 || sound == 10000) { // Stop current music if (_vm->_heversion >= 70 || _currentMusic) @@ -867,10 +877,12 @@ void Sound::stopSound(int sound) { if (_vm->_musicEngine) _vm->_musicEngine->stopSound(sound); - for (i = 0; i < ARRAYSIZE(_soundQue2Sound); i++) { - if (_soundQue2Sound[i] == sound) { - _soundQue2Sound[i] = 0; - _soundQue2Offset[i] = 0; + for (i = 0; i < ARRAYSIZE(_soundQue2); i++) { + if (_soundQue2[i].sound == sound) { + _soundQue2[i].sound = 0; + _soundQue2[i].offset = 0; + _soundQue2[i].channel = 0; + _soundQue2[i].flags = 0; } } } @@ -884,8 +896,7 @@ void Sound::stopAllSounds() { // Clear the (secondary) sound queue _soundQue2Pos = 0; - memset(_soundQue2Sound, 0, sizeof(_soundQue2Sound)); - memset(_soundQue2Offset, 0, sizeof(_soundQue2Offset)); + memset(_soundQue2, 0, sizeof(_soundQue2)); if (_vm->_musicEngine) { _vm->_musicEngine->stopAllSounds(); diff --git a/scumm/sound.h b/scumm/sound.h index f743082e4c..6ef8989783 100644 --- a/scumm/sound.h +++ b/scumm/sound.h @@ -57,7 +57,14 @@ protected: ScummEngine *_vm; int16 _soundQuePos, _soundQue[0x100]; - int16 _soundQue2Pos, _soundQue2Sound[10], _soundQue2Offset[10]; + int16 _soundQue2Pos; + + struct { + int16 sound; + int16 offset; + int16 channel; + int16 flags; + } _soundQue2[10]; ScummFile *_sfxFile; SoundMode _soundMode; @@ -85,11 +92,11 @@ public: public: Sound(ScummEngine *parent); ~Sound(); - void addSoundToQueue(int sound, int offset = 0); - void addSoundToQueue2(int sound, int offset = 0); + void addSoundToQueue(int sound, int offset = 0, int channel = 0, int heFlags = 0); + void addSoundToQueue2(int sound, int offset = 0, int channel = 0, int heFlags = 0); void processSoundQues(); void setOverrideFreq(int freq); - void playSound(int sound, int offset = 0); + void playSound(int sound, int offset = 0, int channel = 0, int heFlags = 0); void startTalkSound(uint32 offset, uint32 b, int mode, PlayingSoundHandle *handle = NULL); void stopTalkSound(); bool isMouthSyncOff(uint pos); |