aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/scumm/insane/insane.cpp2
-rw-r--r--engines/scumm/insane/insane_scenes.cpp4
-rw-r--r--engines/scumm/intern.h2
-rw-r--r--engines/scumm/script_v6.cpp7
-rw-r--r--engines/scumm/script_v8.cpp4
-rw-r--r--engines/scumm/scumm.cpp8
-rw-r--r--engines/scumm/smush/smush_player.cpp29
-rw-r--r--engines/scumm/smush/smush_player.h9
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);