diff options
author | Colin Snover | 2016-11-02 14:30:23 -0500 |
---|---|---|
committer | Colin Snover | 2016-11-02 15:43:07 -0500 |
commit | aa0836816d04812838654f563f7c29cb8efb7041 (patch) | |
tree | bb9c037efd64cb8723c3c15f749de2c8a7d73d5f /engines/sci | |
parent | ee4b172d54ee3a428438d8e48da77044e9822935 (diff) | |
download | scummvm-rg350-aa0836816d04812838654f563f7c29cb8efb7041.tar.gz scummvm-rg350-aa0836816d04812838654f563f7c29cb8efb7041.tar.bz2 scummvm-rg350-aa0836816d04812838654f563f7c29cb8efb7041.zip |
SCI32: Fix missing digital audio playback on save game restore
Fixes Trac#9581.
Diffstat (limited to 'engines/sci')
-rw-r--r-- | engines/sci/engine/savegame.cpp | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 2e4da46b70..720f6783ee 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -643,20 +643,33 @@ void SoundCommandParser::reconstructPlayList() { _music->_mutex.unlock(); for (MusicList::iterator i = songs.begin(); i != songs.end(); ++i) { - initSoundResource(*i); + MusicEntry *entry = *i; + initSoundResource(entry); - if ((*i)->status == kSoundPlaying) { +#ifdef ENABLE_SCI32 + if (_soundVersion >= SCI_VERSION_2_1_EARLY && entry->isSample) { + const reg_t &soundObj = entry->soundObj; + + if ((int)readSelectorValue(_segMan, soundObj, SELECTOR(loop)) != -1 && + readSelector(_segMan, soundObj, SELECTOR(handle)) != NULL_REG) { + + writeSelector(_segMan, soundObj, SELECTOR(handle), NULL_REG); + processPlaySound(soundObj, entry->playBed); + } + } else +#endif + if (entry->status == kSoundPlaying) { // WORKAROUND: PQ3 (German?) scripts can set volume negative in the // sound object directly without going through DoSound. // Since we re-read this selector when re-playing the sound after loading, // this will lead to unexpected behaviour. As a workaround we // sync the sound object's selectors here. (See bug #5501) - writeSelectorValue(_segMan, (*i)->soundObj, SELECTOR(loop), (*i)->loop); - writeSelectorValue(_segMan, (*i)->soundObj, SELECTOR(priority), (*i)->priority); + writeSelectorValue(_segMan, entry->soundObj, SELECTOR(loop), entry->loop); + writeSelectorValue(_segMan, entry->soundObj, SELECTOR(priority), entry->priority); if (_soundVersion >= SCI_VERSION_1_EARLY) - writeSelectorValue(_segMan, (*i)->soundObj, SELECTOR(vol), (*i)->volume); + writeSelectorValue(_segMan, entry->soundObj, SELECTOR(vol), entry->volume); - processPlaySound((*i)->soundObj, (*i)->playBed); + processPlaySound(entry->soundObj, entry->playBed); } } } |