aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Hesse2011-01-22 19:28:23 +0000
committerSven Hesse2011-01-22 19:28:23 +0000
commit0722df94721e6e356bd126bdb97f51b9a4a0ef1e (patch)
treeb2b83f9fb9e31995d9db2cdea589de161e988b34
parent66a715ea99f0c6afccf3e95bdbd058cdd958c15d (diff)
downloadscummvm-rg350-0722df94721e6e356bd126bdb97f51b9a4a0ef1e.tar.gz
scummvm-rg350-0722df94721e6e356bd126bdb97f51b9a4a0ef1e.tar.bz2
scummvm-rg350-0722df94721e6e356bd126bdb97f51b9a4a0ef1e.zip
GOB: Hacking in multiple live videos
Needed for Bambou. The narrator voice and the "Do you want to quit?" voices are live videos that should continue while the live video buttons are playing. svn-id: r55443
-rw-r--r--engines/gob/inter_v6.cpp18
-rw-r--r--engines/gob/videoplayer.cpp57
-rw-r--r--engines/gob/videoplayer.h9
3 files changed, 64 insertions, 20 deletions
diff --git a/engines/gob/inter_v6.cpp b/engines/gob/inter_v6.cpp
index 560415a760..8e74ed42f1 100644
--- a/engines/gob/inter_v6.cpp
+++ b/engines/gob/inter_v6.cpp
@@ -125,6 +125,11 @@ void Inter_v6::o6_playVmdOrMusic() {
props.x, props.y, props.startFrame, props.lastFrame,
props.palCmd, props.palStart, props.palEnd, props.flags);
+ if (!strcmp(fileName, "RIEN")) {
+ _vm->_vidPlayer->closeAll();
+ return;
+ }
+
close = false;
if (props.lastFrame == -1) {
close = true;
@@ -152,7 +157,10 @@ void Inter_v6::o6_playVmdOrMusic() {
return;
} else if (props.lastFrame <= -10) {
_vm->_vidPlayer->closeVideo();
- props.loop = true;
+
+ if (!(props.flags & VideoPlayer::kFlagNoVideo))
+ props.loop = true;
+
} else if (props.lastFrame < 0) {
warning("Urban/Playtoons Stub: Unknown Video/Music command: %d, %s", props.lastFrame, fileName);
return;
@@ -166,8 +174,14 @@ void Inter_v6::o6_playVmdOrMusic() {
_vm->_vidPlayer->evaluateFlags(props);
+ bool primary = true;
+ if (props.noBlock && (props.flags & VideoPlayer::kFlagNoVideo)) {
+ _vm->_vidPlayer->closeLiveSound();
+ primary = false;
+ }
+
int slot = 0;
- if ((fileName[0] != 0) && ((slot = _vm->_vidPlayer->openVideo(true, fileName, props)) < 0)) {
+ if ((fileName[0] != 0) && ((slot = _vm->_vidPlayer->openVideo(primary, fileName, props)) < 0)) {
WRITE_VAR(11, (uint32) -1);
return;
}
diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp
index 7233b7fe95..f279cb9744 100644
--- a/engines/gob/videoplayer.cpp
+++ b/engines/gob/videoplayer.cpp
@@ -222,6 +222,22 @@ bool VideoPlayer::closeVideo(int slot) {
return true;
}
+void VideoPlayer::closeLiveSound() {
+ for (int i = 1; i < kVideoSlotCount; i++) {
+ Video *video = getVideoBySlot(i);
+ if (!video)
+ continue;
+
+ if (video->live)
+ closeVideo(i);
+ }
+}
+
+void VideoPlayer::closeAll() {
+ for (int i = 0; i < kVideoSlotCount; i++)
+ closeVideo(i);
+}
+
bool VideoPlayer::play(int slot, Properties &properties) {
Video *video = getVideoBySlot(slot);
if (!video)
@@ -253,11 +269,13 @@ bool VideoPlayer::play(int slot, Properties &properties) {
properties.canceled = false;
- if (primary && properties.noBlock) {
- video->live = true;
+ if (properties.noBlock) {
properties.waitEndFrame = false;
- _liveProperties = properties;
- updateLive(true);
+
+ video->live = true;
+ video->properties = properties;
+
+ updateLive(slot, true);
return true;
}
@@ -311,40 +329,47 @@ bool VideoPlayer::isPlayingLive() const {
}
void VideoPlayer::updateLive(bool force) {
- Video *video = getVideoBySlot(0);
+ for (int i = 0; i < kVideoSlotCount; i++)
+ updateLive(i, force);
+}
+
+void VideoPlayer::updateLive(int slot, bool force) {
+ Video *video = getVideoBySlot(slot);
if (!video || !video->live)
return;
- if (_liveProperties.startFrame >= (int32)(video->decoder->getFrameCount() - 1)) {
+ if (video->properties.startFrame >= (int32)(video->decoder->getFrameCount() - 1)) {
// Video ended
- if (!_liveProperties.loop) {
- WRITE_VAR_OFFSET(212, (uint32)-1);
+ if (!video->properties.loop) {
+ if (!(video->properties.flags & kFlagNoVideo))
+ WRITE_VAR_OFFSET(212, (uint32)-1);
_vm->_vidPlayer->closeVideo();
return;
} else {
video->decoder->seek(0, SEEK_SET, true);
- _liveProperties.startFrame = -1;
+ video->properties.startFrame = -1;
}
}
- if (_liveProperties.startFrame == _liveProperties.lastFrame)
+ if (video->properties.startFrame == video->properties.lastFrame)
// Current video sequence ended
return;
if (!force && (video->decoder->getTimeToNextFrame() > 0))
return;
- WRITE_VAR_OFFSET(212, _liveProperties.startFrame + 1);
+ if (!(video->properties.flags & kFlagNoVideo))
+ WRITE_VAR_OFFSET(212, video->properties.startFrame + 1);
- bool backwards = _liveProperties.startFrame > _liveProperties.lastFrame;
- playFrame(0, _liveProperties);
+ bool backwards = video->properties.startFrame > video->properties.lastFrame;
+ playFrame(slot, video->properties);
- _liveProperties.startFrame += backwards ? -1 : 1;
+ video->properties.startFrame += backwards ? -1 : 1;
- if (_liveProperties.fade) {
+ if (video->properties.fade) {
_vm->_palAnim->fade(_vm->_global->_pPaletteDesc, -2, 0);
- _liveProperties.fade = false;
+ video->properties.fade = false;
}
}
diff --git a/engines/gob/videoplayer.h b/engines/gob/videoplayer.h
index 5df48fc6aa..bae1fe3702 100644
--- a/engines/gob/videoplayer.h
+++ b/engines/gob/videoplayer.h
@@ -110,6 +110,9 @@ public:
int openVideo(bool primary, const Common::String &file, Properties &properties);
bool closeVideo(int slot = 0);
+ void closeLiveSound();
+ void closeAll();
+
bool play(int slot, Properties &properties);
void waitEndFrame(int slot, bool onlySound = false);
@@ -149,6 +152,8 @@ private:
SurfacePtr surface;
+ Properties properties;
+
bool live;
Video();
@@ -161,8 +166,6 @@ private:
static const char *_extensions[];
- Properties _liveProperties;
-
GobEngine *_vm;
// _videoSlots[0] is reserved for the "primary" video
@@ -188,6 +191,8 @@ private:
void evalBgShading(Video &video);
void copyPalette(const Video &video, int16 palStart, int16 palEnd);
+
+ void updateLive(int slot, bool force = false);
};
} // End of namespace Gob