diff options
| -rw-r--r-- | engines/saga/music.cpp | 25 | 
1 files changed, 14 insertions, 11 deletions
diff --git a/engines/saga/music.cpp b/engines/saga/music.cpp index c8b8b1ea6b..01e3e3f805 100644 --- a/engines/saga/music.cpp +++ b/engines/saga/music.cpp @@ -148,10 +148,6 @@ void DigitalMusicInputStream::createCompressedStream() {  }  int DigitalMusicInputStream::readBuffer(int16 *buffer, const int numSamples) { -	// TODO/FIXME: Add looping support for compressed digital music - remove this once it's done -	// Currently, an illegal read is made, leading to a crash. Therefore, it's disabled for now -	if (_compressedStream != NULL) _looping = false; -  	if (!_looping && _compressedStream != NULL)  		return _compressedStream->readBuffer(buffer, numSamples); @@ -161,20 +157,27 @@ int DigitalMusicInputStream::readBuffer(int16 *buffer, const int numSamples) {  		if (_compressedStream != NULL) {  			len = _compressedStream->readBuffer(buffer, numSamples);  			if (len < numSamples) { +				// FIXME: When a looping compressed track finishes and before it restarts, there's a slight pause. +				// This might be caused by the time it takes to reset the compressed stream + +				// Skip to the beginning of the track in the data file +				_filePos = _startPos; +				_file->seek(_filePos, SEEK_SET); +				// Reset the compressed stream  				delete _compressedStream;  				createCompressedStream(); -				//_file->seek(_startPos, SEEK_SET); -				//_pos = 0; +				len = _compressedStream->readBuffer(buffer, numSamples);  			} +			samples += len;  		} else {  			len = MIN(numSamples - samples, (int) (_bufferEnd - _pos));  			memcpy(buffer, _pos, len * 2); +			buffer += len; +			_pos += len; +			samples += len; +			if (_pos >= _bufferEnd) +				refill();  		} -		buffer += len; -		_pos += len; -		samples += len; -		if (_pos >= _bufferEnd) -			refill();  	}  	return samples;  }  | 
