diff options
author | Sven Hesse | 2007-02-04 15:45:15 +0000 |
---|---|---|
committer | Sven Hesse | 2007-02-04 15:45:15 +0000 |
commit | f54a97a02cfcf7abf8fd06cbed25aa7bba7d41ee (patch) | |
tree | f2abe52c7d32b98943c1292d47465bdf92041f7d /engines/gob/sound.cpp | |
parent | 8f084baf66a2ce3b09103f6ea133cc7d6a3f9611 (diff) | |
download | scummvm-rg350-f54a97a02cfcf7abf8fd06cbed25aa7bba7d41ee.tar.gz scummvm-rg350-f54a97a02cfcf7abf8fd06cbed25aa7bba7d41ee.tar.bz2 scummvm-rg350-f54a97a02cfcf7abf8fd06cbed25aa7bba7d41ee.zip |
- Plugged some leaks and fixed some memory errors
- Fixed the cursor animation loops in Ween and Bargon
- Added Draw_Bargon + Inter_Bargon
- Implemented Bargon Attack's hardcoded intro parts
svn-id: r25387
Diffstat (limited to 'engines/gob/sound.cpp')
-rw-r--r-- | engines/gob/sound.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/engines/gob/sound.cpp b/engines/gob/sound.cpp index 9ee1cb2f98..5475c7407b 100644 --- a/engines/gob/sound.cpp +++ b/engines/gob/sound.cpp @@ -82,6 +82,9 @@ Snd::Snd(GobEngine *vm) : _vm(vm) { _fadeSamples = 0; _curFadeSamples = 0; + _compositionSamples = 0; + _compositionSampleTypes = 0; + _compositionSampleCount = 0; _compositionPos = -1; _vm->_mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_handle, @@ -119,10 +122,16 @@ void Snd::stopSound(int16 fadeLength) _curFadeSamples = 0; } -void Snd::waitEndPlay(void) { - _compositionPos = -1; - while (!_end && !_vm->_quitRequested) +void Snd::waitEndPlay(bool interruptible, bool stopComp) { + if (stopComp) + _compositionPos = -1; + while (!_end && !_vm->_quitRequested) { + if (interruptible && (_vm->_util->checkKey() == 0x11B)) { + WRITE_VAR(57, -1); + return; + } _vm->_util->longDelay(200); + } stopSound(0); } @@ -137,21 +146,32 @@ void Snd::nextCompositionPos(void) { int8 slot; while ((++_compositionPos < 50) && ((slot = _composition[_compositionPos]) != -1)) { - if ((slot >= 0) && (slot <= 60) && (_vm->_game->_soundSamples[slot] != 0) - && !(_vm->_game->_soundTypes[slot] & 8)) { - setSample(_vm->_game->_soundSamples[slot], 1, 0, 0); + if ((slot >= 0) && (slot < _compositionSampleCount) && + (_compositionSamples[slot] != 0) && !(_compositionSampleTypes[slot] & 8)) { + setSample(_compositionSamples[slot], 1, 0, 0); return; } } _compositionPos = -1; } -void Snd::playComposition(int16 *composition, int16 freqVal) { +void Snd::playComposition(int16 *composition, int16 freqVal, SoundDesc **sndDescs, + int8 *sndTypes, int8 sndCount) { + int i; + waitEndPlay(); stopComposition(); - for (int i = 0; i < 50; i++) + _compositionSamples = sndDescs ? sndDescs : _vm->_game->_soundSamples; + _compositionSampleTypes = sndTypes ? sndTypes : _vm->_game->_soundTypes; + _compositionSampleCount = sndCount; + + i = -1; + do { + i++; _composition[i] = composition[i]; + } while ((i < 50) && (composition[i] != -1)); + nextCompositionPos(); } @@ -255,7 +275,7 @@ int Snd::readBuffer(int16 *buffer, const int numSamples) { *buffer++ = (int16) ((_last + (_cur - _last) * _frac) * _fadeVol); _frac += _ratio; _offset += _ratio; - while (_frac > 1) { + while ((_frac > 1) && (_offset < _length)) { _frac -= 1; _last = _cur; _cur = _data[(int) _offset]; |