mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-08 02:42:34 +00:00
Move file handling in SMUSH code to a single thread (unless I overlooked some cases)
svn-id: r18461
This commit is contained in:
parent
6636cf102b
commit
139ee21041
@ -238,6 +238,8 @@ SmushPlayer::SmushPlayer(ScummEngine_v6 *scumm, int speed) {
|
|||||||
_base = NULL;
|
_base = NULL;
|
||||||
_frameBuffer = NULL;
|
_frameBuffer = NULL;
|
||||||
_specialBuffer = NULL;
|
_specialBuffer = NULL;
|
||||||
|
|
||||||
|
_seekPos = -1;
|
||||||
|
|
||||||
_skipNext = false;
|
_skipNext = false;
|
||||||
_subtitles = ConfMan.getBool("subtitles");
|
_subtitles = ConfMan.getBool("subtitles");
|
||||||
@ -368,9 +370,7 @@ void SmushPlayer::handleSoundBuffer(int32 track_id, int32 index, int32 max_frame
|
|||||||
_smixer->addChannel(c);
|
_smixer->addChannel(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((_middleAudio) && (index != 0)) {
|
if (_middleAudio || (index == 0)) {
|
||||||
c->setParameters(max_frames, flags, vol, pan, index);
|
|
||||||
} else if (index == 0) {
|
|
||||||
c->setParameters(max_frames, flags, vol, pan, index);
|
c->setParameters(max_frames, flags, vol, pan, index);
|
||||||
} else {
|
} else {
|
||||||
c->checkParameters(index, max_frames, flags, vol, pan);
|
c->checkParameters(index, max_frames, flags, vol, pan);
|
||||||
@ -982,15 +982,9 @@ void SmushPlayer::handleAnimHeader(Chunk &b) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SmushPlayer::setupAnim(const char *file) {
|
void SmushPlayer::setupAnim(const char *file) {
|
||||||
Chunk *sub;
|
|
||||||
int i;
|
int i;
|
||||||
char file_font[11];
|
char file_font[11];
|
||||||
|
|
||||||
_base = new FileChunk(file);
|
|
||||||
sub = _base->subBlock();
|
|
||||||
checkBlock(*sub, TYPE_AHDR);
|
|
||||||
handleAnimHeader(*sub);
|
|
||||||
|
|
||||||
if (_insanity) {
|
if (_insanity) {
|
||||||
if (!((_vm->_features & GF_DEMO) && (_vm->_platform == Common::kPlatformPC)))
|
if (!((_vm->_features & GF_DEMO) && (_vm->_platform == Common::kPlatformPC)))
|
||||||
readString("mineroad.trs");
|
readString("mineroad.trs");
|
||||||
@ -1027,22 +1021,59 @@ void SmushPlayer::setupAnim(const char *file) {
|
|||||||
} else {
|
} else {
|
||||||
error("SmushPlayer::setupAnim() Unknown font setup for game");
|
error("SmushPlayer::setupAnim() Unknown font setup for game");
|
||||||
}
|
}
|
||||||
|
|
||||||
delete sub;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SmushPlayer::parseNextFrame() {
|
void SmushPlayer::parseNextFrame() {
|
||||||
Common::StackLock lock(_mutex);
|
Common::StackLock lock(_mutex);
|
||||||
|
|
||||||
|
Chunk *sub;
|
||||||
|
|
||||||
if (_vm->_smushPaused)
|
if (_vm->_smushPaused)
|
||||||
return;
|
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()) {
|
if (_base->eof()) {
|
||||||
_vm->_smushVideoShouldFinish = true;
|
_vm->_smushVideoShouldFinish = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Chunk *sub = _base->subBlock();
|
sub = _base->subBlock();
|
||||||
|
|
||||||
switch (sub->getType()) {
|
switch (sub->getType()) {
|
||||||
case TYPE_AHDR: // FT INSANE may seek file to the beginning
|
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) {
|
void SmushPlayer::seekSan(const char *file, int32 pos, int32 contFrame) {
|
||||||
Common::StackLock lock(_mutex);
|
Common::StackLock lock(_mutex);
|
||||||
|
|
||||||
if (_smixer)
|
_seekFile = file ? file : "";
|
||||||
_smixer->stop();
|
_seekPos = pos;
|
||||||
|
_seekFrame = contFrame;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SmushPlayer::tryCmpFile(const char *filename) {
|
void SmushPlayer::tryCmpFile(const char *filename) {
|
||||||
@ -1198,8 +1199,10 @@ void SmushPlayer::tryCmpFile(const char *filename) {
|
|||||||
if (i == NULL) {
|
if (i == NULL) {
|
||||||
error("invalid filename : %s", filename);
|
error("invalid filename : %s", filename);
|
||||||
}
|
}
|
||||||
#ifdef USE_MAD
|
#if defined(USE_MAD) || defined(USE_VORBIS)
|
||||||
char fname[260];
|
char fname[260];
|
||||||
|
#endif
|
||||||
|
#ifdef USE_MAD
|
||||||
memcpy(fname, filename, i - filename);
|
memcpy(fname, filename, i - filename);
|
||||||
strcpy(fname + (i - filename), ".mp3");
|
strcpy(fname + (i - filename), ".mp3");
|
||||||
_compressedFile.open(fname);
|
_compressedFile.open(fname);
|
||||||
@ -1234,8 +1237,6 @@ void SmushPlayer::play(const char *filename, int32 offset, int32 startFrame) {
|
|||||||
}
|
}
|
||||||
f.close();
|
f.close();
|
||||||
|
|
||||||
tryCmpFile(filename);
|
|
||||||
|
|
||||||
_updateNeeded = false;
|
_updateNeeded = false;
|
||||||
_warpNeeded = false;
|
_warpNeeded = false;
|
||||||
_palDirtyMin = 256;
|
_palDirtyMin = 256;
|
||||||
@ -1245,15 +1246,14 @@ void SmushPlayer::play(const char *filename, int32 offset, int32 startFrame) {
|
|||||||
bool oldMouseState = _vm->_system->showMouse(false);
|
bool oldMouseState = _vm->_system->showMouse(false);
|
||||||
|
|
||||||
// Load the video
|
// Load the video
|
||||||
|
_seekFile = filename;
|
||||||
|
_seekPos = offset;
|
||||||
|
_seekFrame = startFrame;
|
||||||
|
_base = 0;
|
||||||
|
|
||||||
setupAnim(filename);
|
setupAnim(filename);
|
||||||
init();
|
init();
|
||||||
|
|
||||||
if (offset) {
|
|
||||||
_base->seek(offset - 8, FileChunk::seek_start);
|
|
||||||
_frame = startFrame;
|
|
||||||
_middleAudio = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (_warpNeeded) {
|
if (_warpNeeded) {
|
||||||
_vm->_system->warpMouse(_warpX, _warpY);
|
_vm->_system->warpMouse(_warpX, _warpY);
|
||||||
@ -1280,7 +1280,6 @@ void SmushPlayer::play(const char *filename, int32 offset, int32 startFrame) {
|
|||||||
_palDirtyMin = 256;
|
_palDirtyMin = 256;
|
||||||
}
|
}
|
||||||
if (_updateNeeded) {
|
if (_updateNeeded) {
|
||||||
|
|
||||||
uint32 end_time, start_time;
|
uint32 end_time, start_time;
|
||||||
|
|
||||||
start_time = _vm->_system->getMillis();
|
start_time = _vm->_system->getMillis();
|
||||||
|
@ -51,6 +51,10 @@ private:
|
|||||||
byte *_frameBuffer;
|
byte *_frameBuffer;
|
||||||
byte *_specialBuffer;
|
byte *_specialBuffer;
|
||||||
|
|
||||||
|
Common::String _seekFile;
|
||||||
|
int32 _seekPos;
|
||||||
|
int32 _seekFrame;
|
||||||
|
|
||||||
bool _skipNext;
|
bool _skipNext;
|
||||||
bool _subtitles;
|
bool _subtitles;
|
||||||
bool _skips[37];
|
bool _skips[37];
|
||||||
|
Loading…
Reference in New Issue
Block a user