diff options
| -rw-r--r-- | common/frac.h | 3 | ||||
| -rw-r--r-- | engines/gob/sound.cpp | 31 | ||||
| -rw-r--r-- | engines/gob/sound.h | 7 | 
3 files changed, 14 insertions, 27 deletions
| diff --git a/common/frac.h b/common/frac.h index d4df455c32..1c2c622a2c 100644 --- a/common/frac.h +++ b/common/frac.h @@ -46,6 +46,7 @@ enum {   */  typedef int32 frac_t; -inline frac_t  intToFrac(int16 value) { return value << FRAC_BITS; } +inline frac_t intToFrac(int16 value) { return value << FRAC_BITS; } +inline int16 fracToInt(frac_t value) { return value >> FRAC_BITS; }  #endif diff --git a/engines/gob/sound.cpp b/engines/gob/sound.cpp index e3a4715920..acee317f03 100644 --- a/engines/gob/sound.cpp +++ b/engines/gob/sound.cpp @@ -35,8 +35,6 @@  namespace Gob { -#define FRAC_BITS 16 -  void SoundDesc::set(SoundType type, SoundSource src,  		byte *data, uint32 dSize) { @@ -174,9 +172,7 @@ Snd::Snd(GobEngine *vm) : _vm(vm) {  	_repCount = 0;  	_offset = 0; -	_offsetFrac = 0;  	_offsetInc = 0; -	_offsetIncFrac = 0;  	_cur = 0;  	_last = 0; @@ -324,11 +320,7 @@ void Snd::setSample(SoundDesc &sndDesc, int16 repCount, int16 frequency,  	_playingSound = 1;  	_offset = 0; -	_offsetFrac = 0; - -	uint32 incr = (_freq << FRAC_BITS) / _rate; -	_offsetInc = incr >> FRAC_BITS; -	_offsetIncFrac = incr & ((1UL << FRAC_BITS) - 1); +	_offsetInc = (_freq << FRAC_BITS) / _rate;  	_last = _cur;  	_cur = _data[0]; @@ -381,7 +373,6 @@ void Snd::checkEndSample() {  		nextCompositionPos();  	else if ((_repCount == -1) || (--_repCount > 0)) {  		_offset = 0; -		_offsetFrac = 0;  		_end = false;  		_playingSound = 1;  	} else { @@ -393,30 +384,26 @@ void Snd::checkEndSample() {  int Snd::readBuffer(int16 *buffer, const int numSamples) {  	Common::StackLock slock(_mutex); -	int16 val; -	uint32 tmp, oldOffset; -  	for (int i = 0; i < numSamples; i++) {  		if (!_data)  			return i; -		if (_end || (_offset >= _length)) +		if (_end || (fracToInt(_offset) >= (int)_length))  			checkEndSample();  		if (_end)  			return i;  		// Linear interpolation. See sound/rate.cpp -		val = (_last + (((_cur - _last) * _offsetFrac + -					(1UL << (FRAC_BITS - 1))) >> FRAC_BITS)) << 8; -		*buffer++ = (((int32) val) * _fadeVol) >> 16; +		int32 val = (_last + (((_cur - _last) * (_offset & FRAC_LO_MASK) + +					FRAC_HALF) >> FRAC_BITS)) << 8; +		*buffer++ = (val * _fadeVol) >> 16; -		oldOffset = _offset; +		int16 oldOffset = fracToInt(_offset); -		tmp = _offsetFrac + _offsetIncFrac; -		_offset += _offsetInc + (tmp >> FRAC_BITS); -		_offsetFrac = tmp & ((1UL << FRAC_BITS) - 1); +		_offset += _offsetInc; -		if (oldOffset < _offset) { +		// Was there an integral change? +		if (oldOffset < fracToInt(_offset)) {  			_last = _cur;  			_cur = _data[oldOffset];  		} diff --git a/engines/gob/sound.h b/engines/gob/sound.h index 76b9f2b159..4e9a640b6b 100644 --- a/engines/gob/sound.h +++ b/engines/gob/sound.h @@ -27,6 +27,7 @@  #define GOB_SOUND_H  #include "common/mutex.h" +#include "common/frac.h"  #include "sound/audiostream.h"  #include "sound/mixer.h" @@ -174,10 +175,8 @@ protected:  	int32 _freq;  	int32 _repCount; -	uint32 _offset; -	uint32 _offsetFrac; -	uint32 _offsetInc; -	uint32 _offsetIncFrac; +	frac_t _offset; +	frac_t _offsetInc;  	int16 _cur;  	int16 _last; | 
