diff options
author | Adrian Frühwirth | 2018-01-19 20:47:48 +0100 |
---|---|---|
committer | Eugene Sandulenko | 2018-01-31 16:38:07 +0100 |
commit | 16eac57834b06d15c182ece6eaf15abd103606eb (patch) | |
tree | 55364a795b20e7a8399c85d39dee75839ac5d4a8 /engines | |
parent | 3a60637d77f620b94ae65fe137f99e6881075df2 (diff) | |
download | scummvm-rg350-16eac57834b06d15c182ece6eaf15abd103606eb.tar.gz scummvm-rg350-16eac57834b06d15c182ece6eaf15abd103606eb.tar.bz2 scummvm-rg350-16eac57834b06d15c182ece6eaf15abd103606eb.zip |
SCUMM: implement lipsync for v7 games
Diffstat (limited to 'engines')
-rw-r--r-- | engines/scumm/imuse_digi/dimuse.h | 1 | ||||
-rw-r--r-- | engines/scumm/imuse_digi/dimuse_script.cpp | 13 | ||||
-rw-r--r-- | engines/scumm/sound.cpp | 11 |
3 files changed, 19 insertions, 6 deletions
diff --git a/engines/scumm/imuse_digi/dimuse.h b/engines/scumm/imuse_digi/dimuse.h index 11b1ea678b..02f899df85 100644 --- a/engines/scumm/imuse_digi/dimuse.h +++ b/engines/scumm/imuse_digi/dimuse.h @@ -161,6 +161,7 @@ public: int32 getCurVoiceLipSyncHeight(); int32 getCurMusicLipSyncWidth(int syncId); int32 getCurMusicLipSyncHeight(int syncId); + int32 getSoundElapsedTimeInMs(int soundId); }; } // End of namespace Scumm diff --git a/engines/scumm/imuse_digi/dimuse_script.cpp b/engines/scumm/imuse_digi/dimuse_script.cpp index f181e5b6db..3913a1a1f0 100644 --- a/engines/scumm/imuse_digi/dimuse_script.cpp +++ b/engines/scumm/imuse_digi/dimuse_script.cpp @@ -408,6 +408,19 @@ int32 IMuseDigital::getCurMusicLipSyncHeight(int syncId) { return height; } +int32 IMuseDigital::getSoundElapsedTimeInMs(int soundId) { + Common::StackLock lock(_mutex, "IMuseDigital::getPosInMs()"); + for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) { + Track *track = _track[l]; + if (track->used && !track->toBeRemoved && (track->soundId == soundId)) { + int32 pos = (_mixer->getSoundElapsedTime(track->mixChanHandle)); + return pos; + } + } + + return 0; +} + void IMuseDigital::stopAllSounds() { Common::StackLock lock(_mutex, "IMuseDigital::stopAllSounds()"); debug(5, "IMuseDigital::stopAllSounds"); diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp index 318a0b8180..599871b0e7 100644 --- a/engines/scumm/sound.cpp +++ b/engines/scumm/sound.cpp @@ -444,6 +444,9 @@ void Sound::processSfxQueues() { if (_vm->_imuseDigital) { finished = !isSoundRunning(kTalkSoundID); +#if defined(ENABLE_SCUMM_7_8) + _curSoundPos = _vm->_imuseDigital->getSoundElapsedTimeInMs(kTalkSoundID) * 60 / 1000; +#endif } else if (_vm->_game.heversion >= 60) { finished = !isSoundRunning(1); } else { @@ -451,20 +454,16 @@ void Sound::processSfxQueues() { // calculate speech sound position simulating increment at 60FPS _curSoundPos = (_mixer->getSoundElapsedTime(*_talkChannelHandle) * 60) / 1000; } - if ((uint) act < 0x80 && ((_vm->_game.version == 8) || (_vm->_game.version <= 7 && !_vm->_string[0].no_talk_anim))) { a = _vm->derefActor(act, "processSfxQueues"); if (a->isInCurrentRoom()) { - if (isMouthSyncOff(_curSoundPos) && _mouthSyncMode) { + if (finished || (isMouthSyncOff(_curSoundPos) && _mouthSyncMode)) { a->runActorTalkScript(a->_talkStopFrame); _mouthSyncMode = 0; - } else if (isMouthSyncOff(_curSoundPos) == 0 && !_mouthSyncMode) { + } else if (isMouthSyncOff(_curSoundPos) == 0 && !_mouthSyncMode) { a->runActorTalkScript(a->_talkStartFrame); _mouthSyncMode = 1; } - - if (_vm->_game.version <= 6 && finished) - a->runActorTalkScript(a->_talkStopFrame); } } |