aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
authorFilippos Karapetis2010-01-04 14:43:14 +0000
committerFilippos Karapetis2010-01-04 14:43:14 +0000
commitd437b25c5774261f727a2e91f8e1b6a200ca5d4a (patch)
tree608e6aee9b61c620063a7c547d141f2e9cd3bcb4 /engines/sci
parent60ece55fb97eb9cd18a4803df174f2a28de55a86 (diff)
downloadscummvm-rg350-d437b25c5774261f727a2e91f8e1b6a200ca5d4a.tar.gz
scummvm-rg350-d437b25c5774261f727a2e91f8e1b6a200ca5d4a.tar.bz2
scummvm-rg350-d437b25c5774261f727a2e91f8e1b6a200ca5d4a.zip
SCI/new music: Resolved another possible deadlock when pausing all sounds
svn-id: r46971
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/sfx/soundcmd.cpp15
1 files changed, 11 insertions, 4 deletions
diff --git a/engines/sci/sfx/soundcmd.cpp b/engines/sci/sfx/soundcmd.cpp
index e22d24fa18..18c6ca5da2 100644
--- a/engines/sci/sfx/soundcmd.cpp
+++ b/engines/sci/sfx/soundcmd.cpp
@@ -529,20 +529,24 @@ void SoundCommandParser::cmdPauseSound(reg_t obj, int16 value) {
changeSoundStatus(obj, value ? SOUND_STATUS_SUSPENDED : SOUND_STATUS_PLAYING);
#else
- Common::StackLock lock(_music->_mutex);
-
MusicEntry *musicSlot = NULL;
MusicList::iterator slotLoop = NULL;
+ MusicList::iterator listEnd = NULL;
if (!obj.segment) {
// Pausing/Resuming the whole playlist was introduced
// in the SCI1 late sound scheme
if (_soundVersion <= SCI_VERSION_1_EARLY)
return;
+ _music->_mutex.lock();
slotLoop = _music->getPlayListStart();
+ listEnd = _music->getPlayListEnd();
musicSlot = *slotLoop;
+ _music->_mutex.unlock();
} else {
+ _music->_mutex.lock();
musicSlot = _music->getSlot(obj);
+ _music->_mutex.unlock();
if (!musicSlot) {
warning("cmdPauseSound: Slot not found (%04x:%04x)", PRINT_REG(obj));
return;
@@ -561,10 +565,13 @@ void SoundCommandParser::cmdPauseSound(reg_t obj, int16 value) {
}
if (slotLoop) {
- if (slotLoop == _music->getPlayListEnd())
+ if (slotLoop == listEnd) {
break;
- else
+ } else {
+ _music->_mutex.lock();
musicSlot = *(slotLoop++);
+ _music->_mutex.unlock();
+ }
}
} while (slotLoop);