diff options
-rw-r--r-- | engines/scumm/insane/insane.cpp | 2 | ||||
-rw-r--r-- | engines/scumm/insane/insane_scenes.cpp | 4 | ||||
-rw-r--r-- | engines/scumm/intern.h | 2 | ||||
-rw-r--r-- | engines/scumm/script_v6.cpp | 7 | ||||
-rw-r--r-- | engines/scumm/script_v8.cpp | 4 | ||||
-rw-r--r-- | engines/scumm/scumm.cpp | 8 | ||||
-rw-r--r-- | engines/scumm/smush/smush_player.cpp | 29 | ||||
-rw-r--r-- | engines/scumm/smush/smush_player.h | 9 |
8 files changed, 36 insertions, 29 deletions
diff --git a/engines/scumm/insane/insane.cpp b/engines/scumm/insane/insane.cpp index 86deddeda1..919baa143b 100644 --- a/engines/scumm/insane/insane.cpp +++ b/engines/scumm/insane/insane.cpp @@ -620,7 +620,7 @@ void Insane::startVideo(const char *filename, int num, int argC, int frameRate, smush_setupSanFromStart(filename, 0, -1, -1, 0); } - _player->play(filename, offset, startFrame); + _player->play(filename, _speed, offset, startFrame); } void Insane::smush_warpMouse(int x, int y, int buttons) { diff --git a/engines/scumm/insane/insane_scenes.cpp b/engines/scumm/insane/insane_scenes.cpp index 5beca36999..dcc78a840b 100644 --- a/engines/scumm/insane/insane_scenes.cpp +++ b/engines/scumm/insane/insane_scenes.cpp @@ -36,7 +36,7 @@ namespace Scumm { void Insane::runScene(int arraynum) { _insaneIsRunning = true; - _player = new SmushPlayer(_vm, _speed); + _player = _vm->_splayer; _player->insanity(true); _numberArray = arraynum; @@ -170,8 +170,6 @@ void Insane::runScene(int arraynum) { } // insane_unlock(); // FIXME _vm->_sound->stopAllSounds(); // IMUSE_StopAllSounds(); - - delete _player; } int Insane::initScene(int sceneId) { diff --git a/engines/scumm/intern.h b/engines/scumm/intern.h index 721931f08d..413446fca2 100644 --- a/engines/scumm/intern.h +++ b/engines/scumm/intern.h @@ -30,6 +30,7 @@ namespace Scumm { class Insane; class SmushMixer; +class SmushPlayer; // This is to help devices with small memory (PDA, smartphones, ...) // to save abit of memory used by opcode names in the Scumm engine. @@ -598,6 +599,7 @@ public: bool _insaneRunning; // Used by IMuseDigital::flushTracks() SmushMixer *_smixer; + SmushPlayer *_splayer; public: ScummEngine_v6(OSystem *syst, const DetectorResult &dr); diff --git a/engines/scumm/script_v6.cpp b/engines/scumm/script_v6.cpp index 87660c6db3..0b507979bd 100644 --- a/engines/scumm/script_v6.cpp +++ b/engines/scumm/script_v6.cpp @@ -2526,15 +2526,12 @@ void ScummEngine_v6::o6_kernelSetFunctions() { if (strcmp((char *)getStringAddressVar(VAR_VIDEONAME), "sq3.san") == 0) _smushFrameRate = 14; - SmushPlayer *sp = new SmushPlayer((ScummEngine_v7 *)this, _smushFrameRate); - // Correct incorrect smush filename in Macintosh FT demo if ((_game.id == GID_FT) && (_game.features & GF_DEMO) && (_game.platform == Common::kPlatformMacintosh) && (strcmp((char *)getStringAddressVar(VAR_VIDEONAME), "jumpgorge.san") == 0)) - sp->play("jumpgorg.san"); + _splayer->play("jumpgorg.san", _smushFrameRate); else - sp->play((char *)getStringAddressVar(VAR_VIDEONAME)); - delete sp; + _splayer->play((char *)getStringAddressVar(VAR_VIDEONAME), _smushFrameRate); if (_game.id == GID_DIG) { _disableFadeInEffect = true; diff --git a/engines/scumm/script_v8.cpp b/engines/scumm/script_v8.cpp index dc45095570..a6e8587a50 100644 --- a/engines/scumm/script_v8.cpp +++ b/engines/scumm/script_v8.cpp @@ -1176,9 +1176,7 @@ void ScummEngine_v8::o8_systemOps() { void ScummEngine_v8::o8_startVideo() { int len = resStrLen(_scriptPointer); - SmushPlayer *sp = new SmushPlayer(this, 12); - sp->play((const char*)_scriptPointer); - delete sp; + _splayer->play((const char*)_scriptPointer, 12); _scriptPointer += len + 1; } diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 9ccf8b3838..fc47b5cbc4 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -42,6 +42,7 @@ #include "scumm/imuse/imuse.h" #include "scumm/imuse_digi/dimuse.h" #include "scumm/smush/smush_mixer.h" +#include "scumm/smush/smush_player.h" #include "scumm/insane/insane.h" #include "scumm/intern.h" #include "scumm/he/animation_he.h" @@ -779,6 +780,7 @@ ScummEngine_v7::ScummEngine_v7(OSystem *syst, const DetectorResult &dr) _smushActive = false; _insaneRunning = false; _smixer = NULL; + _splayer = NULL; _existLanguageFile = false; _languageBuffer = NULL; @@ -791,6 +793,10 @@ ScummEngine_v7::~ScummEngine_v7() { _smixer->stop(); delete _smixer; } + if (_splayer) { + _splayer->release(); + delete _splayer; + } free(_languageBuffer); free(_languageIndex); @@ -1107,6 +1113,8 @@ void ScummEngine_v7::setupScumm() { _insane = 0; _smixer = new SmushMixer(_mixer); + + _splayer = new SmushPlayer(this); } #endif diff --git a/engines/scumm/smush/smush_player.cpp b/engines/scumm/smush/smush_player.cpp index 7eade65a97..4f47994cec 100644 --- a/engines/scumm/smush/smush_player.cpp +++ b/engines/scumm/smush/smush_player.cpp @@ -235,11 +235,11 @@ void SmushPlayer::timerCallback(void *refCon) { #endif } -SmushPlayer::SmushPlayer(ScummEngine_v7 *scumm, int speed) { +SmushPlayer::SmushPlayer(ScummEngine_v7 *scumm) { _vm = scumm; _version = -1; _nbframes = 0; - _smixer = 0; + _smixer = NULL; _strings = NULL; _sf[0] = NULL; _sf[1] = NULL; @@ -261,7 +261,7 @@ SmushPlayer::SmushPlayer(ScummEngine_v7 *scumm, int speed) { _IACTpos = 0; _soundFrequency = 22050; _initDone = false; - _speed = speed; + _speed = -1; _insanity = false; _middleAudio = false; _skipPalette = false; @@ -278,12 +278,13 @@ SmushPlayer::SmushPlayer(ScummEngine_v7 *scumm, int speed) { } SmushPlayer::~SmushPlayer() { - release(); } -void SmushPlayer::init() { +void SmushPlayer::init(int32 speed) { _frame = 0; + _speed = speed; _alreadyInit = false; + _endOfFile = false; _vm->_smushVideoShouldFinish = false; _vm->_smushActive = true; @@ -302,6 +303,8 @@ void SmushPlayer::init() { _vm->virtscr[0].pitch = _vm->virtscr[0].w; _vm->_gdi->_numStrips = _vm->virtscr[0].w / 8; + _vm->_mixer->stopHandle(_compressedFileSoundHandle); + _vm->_mixer->stopHandle(_IACTchannel); _vm->_smixer->stop(); Common::g_timer->installTimerProc(&timerCallback, 1000000 / _speed, this); @@ -340,9 +343,6 @@ void SmushPlayer::release() { free(_frameBuffer); _frameBuffer = NULL; - _vm->_mixer->stopHandle(_compressedFileSoundHandle); - - _vm->_mixer->stopHandle(_IACTchannel); _IACTstream = NULL; _vm->_smushActive = false; @@ -1115,6 +1115,7 @@ void SmushPlayer::parseNextFrame() { assert(_base); if (_base->eof()) { _vm->_smushVideoShouldFinish = true; + _endOfFile = true; return; } @@ -1273,7 +1274,7 @@ void SmushPlayer::tryCmpFile(const char *filename) { #endif } -void SmushPlayer::play(const char *filename, int32 offset, int32 startFrame) { +void SmushPlayer::play(const char *filename, int32 speed, int32 offset, int32 startFrame) { // Verify the specified file exists ScummFile f; @@ -1299,7 +1300,7 @@ void SmushPlayer::play(const char *filename, int32 offset, int32 startFrame) { _base = 0; setupAnim(filename); - init(); + init(speed); for (;;) { if (_warpNeeded) { @@ -1345,12 +1346,14 @@ void SmushPlayer::play(const char *filename, int32 offset, int32 startFrame) { _inTimerCount = 0; #endif } - if (_vm->_quit || _vm->_saveLoadFlag) { + if (_endOfFile) + break; + if (_vm->_quit || _vm->_saveLoadFlag || _vm->_smushVideoShouldFinish) { _smixer->stop(); + _vm->_mixer->stopHandle(_compressedFileSoundHandle); + _vm->_mixer->stopHandle(_IACTchannel); break; } - if (_vm->_smushVideoShouldFinish || _vm->_quit || _vm->_saveLoadFlag) - break; _vm->_system->delayMillis(10); } diff --git a/engines/scumm/smush/smush_player.h b/engines/scumm/smush/smush_player.h index 455f1414b9..34728b9e4f 100644 --- a/engines/scumm/smush/smush_player.h +++ b/engines/scumm/smush/smush_player.h @@ -73,6 +73,7 @@ private: bool _initDone; int _speed; bool _outputSound; + bool _endOfFile; byte *_dst; bool _updateNeeded; @@ -94,10 +95,11 @@ private: Common::Mutex _mutex; public: - SmushPlayer(ScummEngine_v7 *scumm, int speed); + SmushPlayer(ScummEngine_v7 *scumm); ~SmushPlayer(); - void play(const char *filename, int32 offset = 0, int32 startFrame = 0); + void play(const char *filename, int32 speed, int32 offset = 0, int32 startFrame = 0); + void release(); void warpMouse(int x, int y, int buttons); protected: @@ -115,8 +117,7 @@ protected: private: void parseNextFrame(); - void init(); - void release(); + void init(int32 spped); void setupAnim(const char *file); void updateScreen(); void tryCmpFile(const char *filename); |