diff options
| author | Torbjörn Andersson | 2006-08-26 12:29:00 +0000 |
|---|---|---|
| committer | Torbjörn Andersson | 2006-08-26 12:29:00 +0000 |
| commit | cc3b4cdf9937f3d89bb058f9af652c1b371f7222 (patch) | |
| tree | 7886990150583d75f427e6e44c16024ec16152c2 | |
| parent | 96ec0d08ac6498f8d05996e048ae587b4bcb0c50 (diff) | |
| download | scummvm-rg350-cc3b4cdf9937f3d89bb058f9af652c1b371f7222.tar.gz scummvm-rg350-cc3b4cdf9937f3d89bb058f9af652c1b371f7222.tar.bz2 scummvm-rg350-cc3b4cdf9937f3d89bb058f9af652c1b371f7222.zip | |
Now that the cutscene handling in both BS1 and BS2 has been extended to play
DXA movies (the MPEG movies still work, of course), there is no longer any need
for the MPEG decoder to handle sound and frame syncing. That is now the
responsibility of the player, not the decoder.
The obvious next step, then, would be to put that in a new player class, and
have both BS1 and BS2 use that. Maybe FF as well.
svn-id: r23757
| -rw-r--r-- | engines/sword1/animation.cpp | 15 | ||||
| -rw-r--r-- | engines/sword1/animation.h | 3 | ||||
| -rw-r--r-- | engines/sword2/animation.cpp | 13 | ||||
| -rw-r--r-- | engines/sword2/animation.h | 3 | ||||
| -rw-r--r-- | graphics/animation.cpp | 60 | ||||
| -rw-r--r-- | graphics/animation.h | 19 |
6 files changed, 23 insertions, 90 deletions
diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp index 9c02c431c3..f33277f21e 100644 --- a/engines/sword1/animation.cpp +++ b/engines/sword1/animation.cpp @@ -186,6 +186,7 @@ void MoviePlayer::play(void) { _scr->clearScreen(); _framesSkipped = 0; _ticks = _sys->getMillis(); + _bgSoundStream = Audio::AudioStream::openStreamFile(sequenceList[_id]); if (_bgSoundStream) { _snd->playInputStream(Audio::Mixer::kSFXSoundType, &_bgSoundHandle, _bgSoundStream); } @@ -318,9 +319,6 @@ bool MoviePlayerDXA::load(uint32 id) { _frameHeight = getHeight(); _frameX = (640 - _frameWidth) / 2; _frameY = (480 - _frameHeight) / 2; - if (!_bgSoundStream) { - _bgSoundStream = Audio::AudioStream::openStreamFile(sequenceList[id]); - } return true; } return false; @@ -395,8 +393,8 @@ void MoviePlayerMPEG::insertOverlay(OverlayColor *buf, uint8 *ovl, OverlayColor bool MoviePlayerMPEG::load(uint32 id) { if (MoviePlayer::load(id)) { - _anim = new AnimationState(this, _scr, _snd, _sys); - return _anim->init(sequenceList[id], _bgSoundStream); + _anim = new AnimationState(this, _scr, _sys); + return _anim->init(sequenceList[id]); } return false; } @@ -450,11 +448,8 @@ void MoviePlayerMPEG::processFrame(void) { #endif } -void MoviePlayerMPEG::syncFrame(void) { -} - -AnimationState::AnimationState(MoviePlayer *player, Screen *scr, Audio::Mixer *snd, OSystem *sys) - : BaseAnimationState(snd, sys, 640, 400), _player(player), _scr(scr) { +AnimationState::AnimationState(MoviePlayer *player, Screen *scr, OSystem *sys) + : BaseAnimationState(sys, 640, 400), _player(player), _scr(scr) { } AnimationState::~AnimationState(void) { diff --git a/engines/sword1/animation.h b/engines/sword1/animation.h index 1b484e9583..07aa5241f0 100644 --- a/engines/sword1/animation.h +++ b/engines/sword1/animation.h @@ -120,7 +120,7 @@ private: Screen *_scr; public: - AnimationState(MoviePlayer *player, Screen *scr, Audio::Mixer *snd, OSystem *sys); + AnimationState(MoviePlayer *player, Screen *scr, OSystem *sys); ~AnimationState(void); OverlayColor *giveRgbBuffer(void); @@ -149,7 +149,6 @@ protected: bool initOverlays(uint32 id); bool decodeFrame(void); void processFrame(void); - void syncFrame(void); void updateScreen(void); void handleScreenChanged(void); }; diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp index 9f134621ec..bf60623f92 100644 --- a/engines/sword2/animation.cpp +++ b/engines/sword2/animation.cpp @@ -75,6 +75,7 @@ MoviePlayer::MoviePlayer(Sword2Engine *vm) { _vm = vm; _mixer = _vm->_mixer; _system = _vm->_system; + _name = NULL; _textSurface = NULL; _bgSoundStream = NULL; _ticks = 0; @@ -96,6 +97,7 @@ MoviePlayer::MoviePlayer(Sword2Engine *vm) { } MoviePlayer::~MoviePlayer() { + free(_name); } void MoviePlayer::updatePalette(byte *pal, bool packed) { @@ -278,6 +280,8 @@ bool MoviePlayer::load(const char *name, MovieTextObject *text[]) { _currentText = 0; _currentFrame = 0; + _name = strdup(name); + for (int i = 0; i < ARRAYSIZE(_movies); i++) { if (scumm_stricmp(name, _movies[i].name) == 0) { _seamless = _movies[i].seamless; @@ -335,8 +339,8 @@ void MoviePlayer::play(int32 leadIn, int32 leadOut) { #endif _framesSkipped = 0; - _ticks = _system->getMillis(); + _bgSoundStream = Audio::AudioStream::openStreamFile(_name); if (_bgSoundStream) { _mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_bgSoundHandle, _bgSoundStream); @@ -504,8 +508,6 @@ bool MoviePlayerDXA::load(const char *name, MovieTextObject *text[]) { _frameX = (_vm->_screen->getScreenWide() - _frameWidth) / 2; _frameY = (_vm->_screen->getScreenDeep() - _frameHeight) / 2; - _bgSoundStream = Audio::AudioStream::openStreamFile(name); - return true; } @@ -566,11 +568,8 @@ bool MoviePlayerMPEG::decodeFrame() { return result; } -void MoviePlayerMPEG::syncFrame() { -} - AnimationState::AnimationState(Sword2Engine *vm, MoviePlayer *player) - : BaseAnimationState(vm->_mixer, vm->_system, 640, 480) { + : BaseAnimationState(vm->_system, 640, 480) { _vm = vm; _player = player; } diff --git a/engines/sword2/animation.h b/engines/sword2/animation.h index 337ee2b630..99c4231585 100644 --- a/engines/sword2/animation.h +++ b/engines/sword2/animation.h @@ -57,6 +57,8 @@ protected: Audio::Mixer *_mixer; OSystem *_system; + char *_name; + byte _originalPalette[4 * 256]; byte *_textSurface; @@ -156,7 +158,6 @@ protected: AnimationState *_anim; virtual bool decodeFrame(); - virtual void syncFrame(); #ifndef BACKEND_8BIT void handleScreenChanged(); diff --git a/graphics/animation.cpp b/graphics/animation.cpp index a49d33e4a0..7951e7f2d6 100644 --- a/graphics/animation.cpp +++ b/graphics/animation.cpp @@ -22,7 +22,6 @@ #include "common/stdafx.h" #include "graphics/animation.h" -#include "sound/audiostream.h" #include "common/config-manager.h" #include "common/file.h" #include "common/system.h" @@ -31,8 +30,8 @@ namespace Graphics { -BaseAnimationState::BaseAnimationState(Audio::Mixer *snd, OSystem *sys, int width, int height) - : _movieWidth(width), _movieHeight(height), _frameWidth(width), _frameHeight(height), _snd(snd), _sys(sys) { +BaseAnimationState::BaseAnimationState(OSystem *sys, int width, int height) + : _movieWidth(width), _movieHeight(height), _frameWidth(width), _frameHeight(height), _sys(sys) { #ifndef BACKEND_8BIT const int screenW = _sys->getOverlayWidth(); const int screenH = _sys->getOverlayHeight(); @@ -51,7 +50,6 @@ BaseAnimationState::BaseAnimationState(Audio::Mixer *snd, OSystem *sys, int widt BaseAnimationState::~BaseAnimationState() { #ifdef USE_MPEG2 - _snd->stopHandle(_bgSound); if (_mpegDecoder) mpeg2_close(_mpegDecoder); delete _mpegFile; @@ -61,18 +59,16 @@ BaseAnimationState::~BaseAnimationState() { free(_colorTab); free(_rgbToPix); #endif - delete _bgSoundStream; #endif } -bool BaseAnimationState::init(const char *name, void *audioArg) { +bool BaseAnimationState::init(const char *name) { #ifdef USE_MPEG2 char tempFile[512]; _mpegDecoder = NULL; _mpegFile = NULL; - _bgSoundStream = NULL; #ifdef BACKEND_8BIT @@ -146,17 +142,6 @@ bool BaseAnimationState::init(const char *name, void *audioArg) { _mpegInfo = mpeg2_info(_mpegDecoder); _frameNum = 0; - _frameSkipped = 0; - _ticks = _sys->getMillis(); - - // Play audio - _bgSoundStream = createAudioStream(name, audioArg); - - if (_bgSoundStream != NULL) { - _snd->playInputStream(Audio::Mixer::kSFXSoundType, &_bgSound, _bgSoundStream, -1, 255, 0, false); - } else { - warning("Cutscene: Could not open Audio Track for %s", name); - } return true; #else /* USE_MPEG2 */ @@ -164,10 +149,6 @@ bool BaseAnimationState::init(const char *name, void *audioArg) { #endif } -Audio::AudioStream *BaseAnimationState::createAudioStream(const char *name, void *arg) { - return Audio::AudioStream::openStreamFile(name); -} - bool BaseAnimationState::decodeFrame() { #ifdef USE_MPEG2 mpeg2_state_t state; @@ -188,39 +169,8 @@ bool BaseAnimationState::decodeFrame() { case STATE_SLICE: case STATE_END: if (_mpegInfo->display_fbuf) { - /* simple audio video sync code: - * we calculate the actual frame by taking the elapsed audio time and try - * to stay inside +- 1 frame of this calculated frame number by dropping - * frames if we run behind and delaying if we are too fast - */ - - if (checkPaletteSwitch() || (_bgSoundStream == NULL) || - ((_snd->getSoundElapsedTime(_bgSound) * 12) / 1000 < _frameNum + 1) || - _frameSkipped > 10) { - if (_frameSkipped > 10) { - warning("force frame %i redraw", _frameNum); - _frameSkipped = 0; - } - drawYUV(sequence_i->width, sequence_i->height, _mpegInfo->display_fbuf->buf); - - if (_bgSoundStream && _snd->isSoundHandleActive(_bgSound)) { - while (_snd->isSoundHandleActive(_bgSound) && (_snd->getSoundElapsedTime(_bgSound) * 12) / 1000 < _frameNum) { - _sys->delayMillis(10); - } - // In case the background sound ends prematurely, update - // _ticks so that we can still fall back on the no-sound - // sync case for the subsequent frames. - _ticks = _sys->getMillis(); - } else { - _ticks += 83; - while (_sys->getMillis() < _ticks) - _sys->delayMillis(10); - } - } else { - warning("dropped frame %i", _frameNum); - _frameSkipped++; - } - + checkPaletteSwitch(); + drawYUV(sequence_i->width, sequence_i->height, _mpegInfo->display_fbuf->buf); #ifdef BACKEND_8BIT buildLookup(_palNum + 1, _lutCalcNum); #endif diff --git a/graphics/animation.h b/graphics/animation.h index 1881f0149c..aff644d2d3 100644 --- a/graphics/animation.h +++ b/graphics/animation.h @@ -25,12 +25,6 @@ #include "common/scummsys.h" -#include "sound/mixer.h" - -namespace Audio { - class AudioStream; -} - // Uncomment this if you are using libmpeg2 0.3.1. // #define USE_MPEG2_0_3_1 @@ -72,6 +66,8 @@ namespace Common { class File; } +class OSystem; + namespace Graphics { class BaseAnimationState { @@ -86,12 +82,9 @@ protected: int _movieScale; #endif - Audio::Mixer *_snd; OSystem *_sys; uint _frameNum; - uint _frameSkipped; - uint32 _ticks; #ifdef USE_MPEG2 mpeg2dec_t *_mpegDecoder; @@ -100,9 +93,6 @@ protected: Common::File *_mpegFile; - Audio::SoundHandle _bgSound; - Audio::AudioStream *_bgSoundStream; - #ifdef BACKEND_8BIT int _palNum; int _maxPalNum; @@ -129,10 +119,10 @@ protected: #endif public: - BaseAnimationState(Audio::Mixer *snd, OSystem *sys, int width, int height); + BaseAnimationState(OSystem *sys, int width, int height); virtual ~BaseAnimationState(); - bool init(const char *name, void *audioArg = NULL); + bool init(const char *name); bool decodeFrame(); void handleScreenChanged(); void updateScreen(); @@ -147,7 +137,6 @@ public: protected: bool checkPaletteSwitch(); virtual void drawYUV(int width, int height, byte *const *dat) = 0; - virtual Audio::AudioStream *createAudioStream(const char *name, void *arg); #ifdef BACKEND_8BIT void buildLookup(int p, int lines); |
