diff options
| -rw-r--r-- | engines/scumm/smush/smush_player.cpp | 25 | ||||
| -rw-r--r-- | engines/scumm/smush/smush_player.h | 6 | 
2 files changed, 20 insertions, 11 deletions
| diff --git a/engines/scumm/smush/smush_player.cpp b/engines/scumm/smush/smush_player.cpp index bd4261d60c..dbcde31597 100644 --- a/engines/scumm/smush/smush_player.cpp +++ b/engines/scumm/smush/smush_player.cpp @@ -1101,6 +1101,8 @@ void SmushPlayer::parseNextFrame() {  		_base->seek(_seekPos, SEEK_SET);  		_frame = _seekFrame; +		_startFrame = _frame; +		_startTime = _vm->_system->getMillis();  		_seekPos = -1;  	} @@ -1307,18 +1309,24 @@ void SmushPlayer::play(const char *filename, int32 speed, int32 offset, int32 st  	setupAnim(filename);  	init(speed); -	uint32 startTime = _vm->_system->getMillis(); +	_startTime = _vm->_system->getMillis(); +	_startFrame = startFrame; +	_frame = startFrame;  	_pauseTime = 0; -	uint frameNo = 0;  	int skipped = 0;  	for (;;) { -		uint32 elapsed; +		uint32 now, elapsed;  		bool skipFrame = false; -		if (_vm->_mixer->isSoundHandleActive(_compressedFileSoundHandle)) { +		if (_insanity) { +			// Seeking makes a mess of trying to sync the audio to +			// the sound. Synt to time instead. +			now = _vm->_system->getMillis() - _pauseTime; +			elapsed = now - _startTime; +		} else if (_vm->_mixer->isSoundHandleActive(_compressedFileSoundHandle)) {  			// Compressed SMUSH files.  			elapsed = _vm->_mixer->getSoundElapsedTime(_compressedFileSoundHandle);  		} else if (_vm->_mixer->isSoundHandleActive(_IACTchannel)) { @@ -1328,12 +1336,12 @@ void SmushPlayer::play(const char *filename, int32 speed, int32 offset, int32 st  			// For other SMUSH files, we don't necessarily have any  			// one channel to sync against, so we have to use  			// elapsed real time. -			uint32 now = _vm->_system->getMillis() - _pauseTime; -			elapsed = now - startTime; +			now = _vm->_system->getMillis() - _pauseTime; +			elapsed = now - _startTime;  		} -		if (elapsed >= (frameNo * 1000) / _speed) { -			if (elapsed >= ((frameNo + 1) * 1000) / _speed) +		if (elapsed >= ((_frame - _startFrame) * 1000) / _speed) { +			if (elapsed >= ((_frame + 1) * 1000) / _speed)  				skipFrame = true;  			else  				skipFrame = false; @@ -1392,7 +1400,6 @@ void SmushPlayer::play(const char *filename, int32 speed, int32 offset, int32 st  			_inTimer = false;  			_inTimerCount = 0;  #endif -			frameNo++;  		}  		if (_endOfFile)  			break; diff --git a/engines/scumm/smush/smush_player.h b/engines/scumm/smush/smush_player.h index a6e83ef8ed..d951e3d45d 100644 --- a/engines/scumm/smush/smush_player.h +++ b/engines/scumm/smush/smush_player.h @@ -53,11 +53,13 @@ private:  	byte *_specialBuffer;  	Common::String _seekFile; +	uint32 _startFrame; +	uint32 _startTime;  	int32 _seekPos; -	int32 _seekFrame; +	uint32 _seekFrame;  	bool _skipNext; -	int32 _frame; +	uint32 _frame;  	Audio::SoundHandle _IACTchannel;  	Audio::AppendableAudioStream *_IACTstream; | 
