diff options
author | Max Horn | 2005-06-25 15:17:14 +0000 |
---|---|---|
committer | Max Horn | 2005-06-25 15:17:14 +0000 |
commit | 139ee21041193d2307434a8d3d35e06350353bd5 (patch) | |
tree | 8e2b58034bd3b3cba6c73d8251d4abd6bf001771 | |
parent | 6636cf102b7dcffdded5128fc724dae61a9d0279 (diff) | |
download | scummvm-rg350-139ee21041193d2307434a8d3d35e06350353bd5.tar.gz scummvm-rg350-139ee21041193d2307434a8d3d35e06350353bd5.tar.bz2 scummvm-rg350-139ee21041193d2307434a8d3d35e06350353bd5.zip |
Move file handling in SMUSH code to a single thread (unless I overlooked some cases)
svn-id: r18461
-rw-r--r-- | scumm/smush/smush_player.cpp | 109 | ||||
-rw-r--r-- | scumm/smush/smush_player.h | 4 |
2 files changed, 58 insertions, 55 deletions
diff --git a/scumm/smush/smush_player.cpp b/scumm/smush/smush_player.cpp index 96fa18ed36..a856d9572e 100644 --- a/scumm/smush/smush_player.cpp +++ b/scumm/smush/smush_player.cpp @@ -238,6 +238,8 @@ SmushPlayer::SmushPlayer(ScummEngine_v6 *scumm, int speed) { _base = NULL; _frameBuffer = NULL; _specialBuffer = NULL; + + _seekPos = -1; _skipNext = false; _subtitles = ConfMan.getBool("subtitles"); @@ -368,9 +370,7 @@ void SmushPlayer::handleSoundBuffer(int32 track_id, int32 index, int32 max_frame _smixer->addChannel(c); } - if ((_middleAudio) && (index != 0)) { - c->setParameters(max_frames, flags, vol, pan, index); - } else if (index == 0) { + if (_middleAudio || (index == 0)) { c->setParameters(max_frames, flags, vol, pan, index); } else { c->checkParameters(index, max_frames, flags, vol, pan); @@ -982,15 +982,9 @@ void SmushPlayer::handleAnimHeader(Chunk &b) { } void SmushPlayer::setupAnim(const char *file) { - Chunk *sub; int i; char file_font[11]; - _base = new FileChunk(file); - sub = _base->subBlock(); - checkBlock(*sub, TYPE_AHDR); - handleAnimHeader(*sub); - if (_insanity) { if (!((_vm->_features & GF_DEMO) && (_vm->_platform == Common::kPlatformPC))) readString("mineroad.trs"); @@ -1027,22 +1021,59 @@ void SmushPlayer::setupAnim(const char *file) { } else { error("SmushPlayer::setupAnim() Unknown font setup for game"); } - - delete sub; } void SmushPlayer::parseNextFrame() { Common::StackLock lock(_mutex); + + Chunk *sub; if (_vm->_smushPaused) return; + + if (_seekPos >= 0) { + if (_smixer) + _smixer->stop(); + + if (_seekFile.size() > 0) { + if (_base) { + delete _base; + } + _base = new FileChunk(_seekFile); + + if (_seekPos > 0) { + assert(_seekPos > 8); + // In this case we need to get palette and number of frames + sub = _base->subBlock(); + checkBlock(*sub, TYPE_AHDR); + handleAnimHeader(*sub); + delete sub; + + _middleAudio = true; + _seekPos -= 8; + } else { + // We need this in Full Throttle when entering/leaving + // the old mine road. + tryCmpFile(_seekFile.c_str()); + } + _skipPalette = false; + } else { + _skipPalette = true; + } + + _base->seek(_seekPos, FileChunk::seek_start); + _frame = _seekFrame; + + _seekPos = -1; + } + assert(_base); if (_base->eof()) { _vm->_smushVideoShouldFinish = true; return; } - Chunk *sub = _base->subBlock(); + sub = _base->subBlock(); switch (sub->getType()) { case TYPE_AHDR: // FT INSANE may seek file to the beginning @@ -1153,39 +1184,9 @@ void SmushPlayer::insanity(bool flag) { void SmushPlayer::seekSan(const char *file, int32 pos, int32 contFrame) { Common::StackLock lock(_mutex); - if (_smixer) - _smixer->stop(); - - if (file) { - if (_base) { - _base->seek(0, FileChunk::seek_end); - delete _base; - } - - _base = new FileChunk(file); - if (pos) { - assert(pos != 8); - // In this case we need to get palette and number of frames - Chunk *sub = _base->subBlock(); - checkBlock(*sub, TYPE_AHDR); - handleAnimHeader(*sub); - delete sub; - - _middleAudio = true; - pos -= 8; - } else { - // We need this in Full Throttle when entering/leaving - // the old mine road. - tryCmpFile(file); - } - _skipPalette = false; - } else { - _skipPalette = true; - } - - _base->seek(pos, FileChunk::seek_start); - - _frame = contFrame; + _seekFile = file ? file : ""; + _seekPos = pos; + _seekFrame = contFrame; } void SmushPlayer::tryCmpFile(const char *filename) { @@ -1198,8 +1199,10 @@ void SmushPlayer::tryCmpFile(const char *filename) { if (i == NULL) { error("invalid filename : %s", filename); } -#ifdef USE_MAD +#if defined(USE_MAD) || defined(USE_VORBIS) char fname[260]; +#endif +#ifdef USE_MAD memcpy(fname, filename, i - filename); strcpy(fname + (i - filename), ".mp3"); _compressedFile.open(fname); @@ -1234,8 +1237,6 @@ void SmushPlayer::play(const char *filename, int32 offset, int32 startFrame) { } f.close(); - tryCmpFile(filename); - _updateNeeded = false; _warpNeeded = false; _palDirtyMin = 256; @@ -1245,15 +1246,14 @@ void SmushPlayer::play(const char *filename, int32 offset, int32 startFrame) { bool oldMouseState = _vm->_system->showMouse(false); // Load the video + _seekFile = filename; + _seekPos = offset; + _seekFrame = startFrame; + _base = 0; + setupAnim(filename); init(); - if (offset) { - _base->seek(offset - 8, FileChunk::seek_start); - _frame = startFrame; - _middleAudio = true; - } - for (;;) { if (_warpNeeded) { _vm->_system->warpMouse(_warpX, _warpY); @@ -1280,7 +1280,6 @@ void SmushPlayer::play(const char *filename, int32 offset, int32 startFrame) { _palDirtyMin = 256; } if (_updateNeeded) { - uint32 end_time, start_time; start_time = _vm->_system->getMillis(); diff --git a/scumm/smush/smush_player.h b/scumm/smush/smush_player.h index 3fd9862ca5..a138962b7e 100644 --- a/scumm/smush/smush_player.h +++ b/scumm/smush/smush_player.h @@ -51,6 +51,10 @@ private: byte *_frameBuffer; byte *_specialBuffer; + Common::String _seekFile; + int32 _seekPos; + int32 _seekFrame; + bool _skipNext; bool _subtitles; bool _skips[37]; |