diff options
Diffstat (limited to 'saga')
-rw-r--r-- | saga/events.cpp | 5 | ||||
-rw-r--r-- | saga/ihnm_introproc.cpp | 21 | ||||
-rw-r--r-- | saga/sfuncs.cpp | 2 | ||||
-rw-r--r-- | saga/sndres.cpp | 4 | ||||
-rw-r--r-- | saga/sndres.h | 2 | ||||
-rw-r--r-- | saga/sound.cpp | 4 | ||||
-rw-r--r-- | saga/sound.h | 6 |
7 files changed, 36 insertions, 8 deletions
diff --git a/saga/events.cpp b/saga/events.cpp index 435256517f..f377b444d1 100644 --- a/saga/events.cpp +++ b/saga/events.cpp @@ -309,6 +309,11 @@ int Events::handleOneShot(EVENT *event) { } break; + case SOUND_EVENT: + _vm->_sound->stopSound(); + if (event->op == EVENT_PLAY) + _vm->_sndRes->playSound(event->param, event->param2, event->param3 != 0); + break; case VOICE_EVENT: _vm->_sndRes->playVoice(event->param); break; diff --git a/saga/ihnm_introproc.cpp b/saga/ihnm_introproc.cpp index 0ceba8545c..45ea1e1dee 100644 --- a/saga/ihnm_introproc.cpp +++ b/saga/ihnm_introproc.cpp @@ -339,11 +339,30 @@ int Scene::IHNMHateProc(int param, SCENE_INFO *scene_info) { q_event = _vm->_events->queue(&event); + // Background sound + event.type = ONESHOT_EVENT; + event.code = SOUND_EVENT; + event.op = EVENT_PLAY; + event.param = 260; // FIXME: Verify sound + event.param2 = 255; // FIXME: Verify volume + event.param3 = SOUND_LOOP; + event.time = 0; + + q_event = _vm->_events->queue(&event); + + // End background sound after the voice has finished + event.type = ONESHOT_EVENT; + event.code = SOUND_EVENT; + event.op = EVENT_STOP; + event.time = _vm->_sndRes->getVoiceLength(0); + + q_event = _vm->_events->chain(q_event, &event); + // End scene after the voice has finished event.type = ONESHOT_EVENT; event.code = SCENE_EVENT; event.op = EVENT_END; - event.time = _vm->_sndRes->getVoiceLength(0); + event.time = 0; q_event = _vm->_events->chain(q_event, &event); break; diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp index 1963444a4e..398d075e13 100644 --- a/saga/sfuncs.cpp +++ b/saga/sfuncs.cpp @@ -1156,7 +1156,7 @@ int Script::SF_playSound(SCRIPTFUNC_PARAMS) { SDataWord_T param = thread->pop() - 13; if (/* param >= 0 && */ param < ARRAYSIZE(sfxTable)) - _vm->_sndRes->playSound(sfxTable[param].res, sfxTable[param].vol); + _vm->_sndRes->playSound(sfxTable[param].res, sfxTable[param].vol, false); else _vm->_sound->stopSound(); diff --git a/saga/sndres.cpp b/saga/sndres.cpp index 13426fa91e..5c7b583123 100644 --- a/saga/sndres.cpp +++ b/saga/sndres.cpp @@ -53,7 +53,7 @@ SndRes::SndRes(SagaEngine *vm) : _vm(vm) { _init = 1; } -int SndRes::playSound(uint32 sound_rn, int volume) { +int SndRes::playSound(uint32 sound_rn, int volume, bool loop) { SOUNDBUFFER snd_buffer; debug(0, "SndRes::playSound(%ld)", sound_rn); @@ -63,7 +63,7 @@ int SndRes::playSound(uint32 sound_rn, int volume) { return FAILURE; } - _vm->_sound->playSound(&snd_buffer, volume); + _vm->_sound->playSound(&snd_buffer, volume, loop); return SUCCESS; } diff --git a/saga/sndres.h b/saga/sndres.h index ec823a8673..b5bdd65c48 100644 --- a/saga/sndres.h +++ b/saga/sndres.h @@ -67,7 +67,7 @@ public: SndRes(SagaEngine *vm); int loadSound(uint32 sound_rn); - int playSound(uint32 sound_rn, int volume); + int playSound(uint32 sound_rn, int volume, bool loop); int playVoice(uint32 voice_rn); int getVoiceLength(uint32 voice_rn); diff --git a/saga/sound.cpp b/saga/sound.cpp index e63f675ca0..e68b71384f 100644 --- a/saga/sound.cpp +++ b/saga/sound.cpp @@ -190,8 +190,8 @@ int Sound::playSoundBuffer(PlayingSoundHandle *handle, SOUNDBUFFER *buf, int vol return SUCCESS; } -int Sound::playSound(SOUNDBUFFER *buf, int volume) { - return playSoundBuffer(&_effectHandle, buf, 2 * volume, false); +int Sound::playSound(SOUNDBUFFER *buf, int volume, bool loop) { + return playSoundBuffer(&_effectHandle, buf, 2 * volume, loop); } int Sound::pauseSound() { diff --git a/saga/sound.h b/saga/sound.h index 06292c2099..1f339b2f5a 100644 --- a/saga/sound.h +++ b/saga/sound.h @@ -32,6 +32,10 @@ namespace Saga { +enum SOUND_FLAGS { + SOUND_LOOP = 1 +}; + struct SOUNDBUFFER { uint16 s_freq; int s_samplebits; @@ -48,7 +52,7 @@ public: Sound(SagaEngine *vm, SoundMixer *mixer, int enabled); ~Sound(); - int playSound(SOUNDBUFFER *buf, int volume); + int playSound(SOUNDBUFFER *buf, int volume, bool loop); int pauseSound(); int resumeSound(); int stopSound(); |