aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/scumm/imuse_digi/dimuse.h1
-rw-r--r--engines/scumm/imuse_digi/dimuse_script.cpp13
-rw-r--r--engines/scumm/sound.cpp11
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);
}
}