int VQAPlayer::update(bool forceDraw, bool advanceFrame, bool useTime, Graphics::Surface *customSurface) { uint32 now = 60 * _vm->_system->getMillis(); int result = -1; if (_frameNext < 0) { _frameNext = _frameBegin; } if ((_repeatsCount > 0 || _repeatsCount == -1) && (_frameNext > _frameEnd)) { int loopEndQueued = _frameEndQueued; if (_frameEndQueued != -1) { _frameEnd = _frameEndQueued; _frameEndQueued = -1; } if (_frameNext != _frameBegin) { _frameNext = _frameBegin; } if (loopEndQueued == -1) { if (_repeatsCount != -1) { _repeatsCount--; } //callback for repeat, it is not used in the blade runner } else { _repeatsCount = _repeatsCountQueued; _repeatsCountQueued = -1; if (_callbackLoopEnded != nullptr) { _callbackLoopEnded(_callbackData, 0, _loop); } } result = -1; } else if (_frameNext > _frameEnd) { result = -3; } else if (useTime && (now < _frameNextTime)) { result = -1; } else if (advanceFrame) { _frame = _frameNext; _decoder.readFrame(_frameNext, kVQAReadVideo); _decoder.decodeVideoFrame(customSurface != nullptr ? customSurface : _surface, _frameNext); int audioPreloadFrames = 14; if (_hasAudio) { if (!_audioStarted) { for (int i = 0; i < audioPreloadFrames; i++) { if (_frameNext + i < _frameEnd) { _decoder.readFrame(_frameNext + i, kVQAReadAudio); queueAudioFrame(_decoder.decodeAudioFrame()); } } _vm->_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, _audioStream); _audioStarted = true; } if (_frameNext + audioPreloadFrames < _frameEnd) { _decoder.readFrame(_frameNext + audioPreloadFrames, kVQAReadAudio); queueAudioFrame(_decoder.decodeAudioFrame()); } } if (useTime) { if (_frameNextTime == 0) { _frameNextTime = now + 60000 / 15; } else { _frameNextTime += 60000 / 15; } } _frameNext++; result = _frame; } if (result < 0 && forceDraw && _frame != -1) { _decoder.decodeVideoFrame(customSurface != nullptr ? customSurface : _surface, _frame, true); result = _frame; } return result; }
int VQAPlayer::update() { uint32 now = 60 * _vm->_system->getMillis(); if (_frameNext < 0) { _frameNext = _frameBegin; } if ((_repeatsCount > 0 || _repeatsCount == -1) && (_frameNext > _frameEnd)) { int loopEndQueued = _frameEndQueued; if (_frameEndQueued != -1) { _frameEnd = _frameEndQueued; _frameEndQueued = -1; } if (_frameNext != _frameBegin) { _frameNext = _frameBegin; } if (loopEndQueued == -1) { if (_repeatsCount != -1) { _repeatsCount--; } //callback for repeat, it is not used in the blade runner } else { _repeatsCount = _repeatsCountQueued; _repeatsCountQueued = -1; if (_callbackLoopEnded != nullptr) { _callbackLoopEnded(_callbackData, 0, _loop); } } _surface = nullptr; return -1; } if (_frameNext > _frameEnd) { return -3; } // TODO: preload audio in better way int audioPreloadFrames = 3; if (now >= _frameNextTime) { int frame = _frameNext; _decoder.readFrame(_frameNext, 0x2); _surface = _decoder.decodeVideoFrame(); if (_hasAudio) { if (!_audioStarted) { for (int i = 0; i < audioPreloadFrames; i++) { if (_frameNext + i < _frameEnd) { _decoder.readFrame(_frameNext + i, 0x1); queueAudioFrame(_decoder.decodeAudioFrame()); } } _vm->_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, _audioStream); _audioStarted = true; } if (_frameNext + audioPreloadFrames < _frameEnd) { _decoder.readFrame(_frameNext + audioPreloadFrames, 0x1); queueAudioFrame(_decoder.decodeAudioFrame()); } } if (_frameNextTime == 0) { _frameNextTime = now + 60000 / 15; } else { _frameNextTime += 60000 / 15; } _frameNext++; return frame; } _surface = nullptr; return -1; }