aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/script_v7he.cpp5
-rw-r--r--scumm/sound.cpp65
-rw-r--r--scumm/sound.h15
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);