From 28c461e2f93819ab3a524023d5453ad5f32943e9 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 30 Jun 2017 22:59:29 -0400 Subject: TITANIC: Don't set movie framerate until after movie has started --- engines/titanic/game/service_elevator_window.cpp | 6 ++++-- engines/titanic/support/avi_surface.cpp | 8 +++++++- 2 files changed, 11 insertions(+), 3 deletions(-) (limited to 'engines') diff --git a/engines/titanic/game/service_elevator_window.cpp b/engines/titanic/game/service_elevator_window.cpp index d548bbf37e..887fd3d086 100644 --- a/engines/titanic/game/service_elevator_window.cpp +++ b/engines/titanic/game/service_elevator_window.cpp @@ -68,17 +68,19 @@ bool CServiceElevatorWindow::ServiceElevatorFloorChangeMsg(CServiceElevatorFloor return true; int count = clip->_endFrame - clip->_startFrame; - setMovieFrameRate(1.0 * count / fps); - int startFrame = clip->_startFrame + count * FACTORS[msg->_startFloor] / 100; int endFrame = clip->_startFrame + count * FACTORS[msg->_endFloor] / 100; + double rate = (startFrame < endFrame ? 1.0 : -1.0) * count / fps; if (_notifyFlag) { // Service elevator indicator playMovie(startFrame, endFrame, MOVIE_NOTIFY_OBJECT); + setMovieFrameRate(rate); } else { // Background outside elevator playMovie(startFrame, endFrame, 0); + setMovieFrameRate(rate); + if (_intoSpace) playClip("Into Space"); } diff --git a/engines/titanic/support/avi_surface.cpp b/engines/titanic/support/avi_surface.cpp index 0308465bc6..97cc68fc1a 100644 --- a/engines/titanic/support/avi_surface.cpp +++ b/engines/titanic/support/avi_surface.cpp @@ -147,8 +147,10 @@ bool AVISurface::startAtFrame(int frameNumber) { seekToFrame(frameNumber); // If we're in reverse playback, set the decoder to play in reverse - if (_isReversed) + if (_isReversed) { + _decoder->setReverse(true); _decoder->setRate(Common::Rational(-1)); + } renderFrame(); @@ -436,6 +438,10 @@ bool AVISurface::addEvent(int *frameNumber, CGameObject *obj) { } void AVISurface::setFrameRate(double rate) { + // Assert that the decoder is already playing, since otherwise setting + // the decoder rate would prematurely start playback + assert(_decoder->isPlaying()); + // Convert rate from fps to relative to 1.0 (normal speed) const int PRECISION = 10000; double playRate = rate / 15.0; // Standard 15 FPS -- cgit v1.2.3