[Scummvm-git-logs] scummvm branch-2-6 -> c59d08855fe539892fa7010370dbf78360c489dd
AndywinXp
noreply at scummvm.org
Thu Oct 6 17:35:11 UTC 2022
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
c59d08855f SCUMM: DiMUSE: Solve very rare deadlocks caused by two different mutex objects
Commit: c59d08855fe539892fa7010370dbf78360c489dd
https://github.com/scummvm/scummvm/commit/c59d08855fe539892fa7010370dbf78360c489dd
Author: Andrea Boscarino (andywinxp at gmail.com)
Date: 2022-10-06T19:27:03+02:00
Commit Message:
SCUMM: DiMUSE: Solve very rare deadlocks caused by two different mutex objects
Changed paths:
engines/scumm/imuse_digi/dimuse_dispatch.cpp
engines/scumm/imuse_digi/dimuse_engine.cpp
engines/scumm/imuse_digi/dimuse_engine.h
engines/scumm/imuse_digi/dimuse_streamer.cpp
engines/scumm/imuse_digi/dimuse_tracks.cpp
engines/scumm/imuse_digi/dimuse_wave.cpp
engines/scumm/imuse_digi/dimuse_waveout.cpp
engines/scumm/scumm.cpp
diff --git a/engines/scumm/imuse_digi/dimuse_dispatch.cpp b/engines/scumm/imuse_digi/dimuse_dispatch.cpp
index 97a31fdff4f..c7a82a091bf 100644
--- a/engines/scumm/imuse_digi/dimuse_dispatch.cpp
+++ b/engines/scumm/imuse_digi/dimuse_dispatch.cpp
@@ -812,7 +812,7 @@ void IMuseDigital::dispatchProcessDispatches(IMuseDigiTrack *trackPtr, int feedS
}
void IMuseDigital::dispatchPredictFirstStream() {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
for (int i = 0; i < _trackCount; i++) {
if (_dispatches[i].trackPtr->soundId && _dispatches[i].streamPtr && _dispatches[i].streamZoneList)
diff --git a/engines/scumm/imuse_digi/dimuse_engine.cpp b/engines/scumm/imuse_digi/dimuse_engine.cpp
index d59dad6264e..ef8fe01873a 100644
--- a/engines/scumm/imuse_digi/dimuse_engine.cpp
+++ b/engines/scumm/imuse_digi/dimuse_engine.cpp
@@ -41,8 +41,8 @@ void IMuseDigital::timer_handler(void *refCon) {
diMUSE->callback();
}
-IMuseDigital::IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer)
- : _vm(scumm), _mixer(mixer) {
+IMuseDigital::IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer, Common::Mutex *mutex)
+ : _vm(scumm), _mixer(mixer), _mutex(mutex) {
assert(_vm);
assert(mixer);
@@ -269,7 +269,7 @@ static void skipLegacyTrackEntry(Common::Serializer &s) {
}
void IMuseDigital::saveLoadEarly(Common::Serializer &s) {
- Common::StackLock lock(_mutex, "IMuseDigital::saveLoadEarly()");
+ Common::StackLock lock(*_mutex, "IMuseDigital::saveLoadEarly()");
if (s.isLoading()) {
diMUSEStopAllSounds();
diff --git a/engines/scumm/imuse_digi/dimuse_engine.h b/engines/scumm/imuse_digi/dimuse_engine.h
index 2e2f44a607a..8157b3b52c6 100644
--- a/engines/scumm/imuse_digi/dimuse_engine.h
+++ b/engines/scumm/imuse_digi/dimuse_engine.h
@@ -67,7 +67,7 @@ struct IMuseDigiStreamZone;
class IMuseDigital : public MusicEngine {
private:
- Common::Mutex _mutex;
+ Common::Mutex *_mutex;
ScummEngine_v7 *_vm;
Audio::Mixer *_mixer;
SmushPlayer *_splayer;
@@ -300,7 +300,7 @@ private:
byte waveOutGetStreamFlags();
public:
- IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer);
+ IMuseDigital(ScummEngine_v7 *scumm, Audio::Mixer *mixer, Common::Mutex *mutex);
~IMuseDigital() override;
// Wrapper functions used by the main engine
diff --git a/engines/scumm/imuse_digi/dimuse_streamer.cpp b/engines/scumm/imuse_digi/dimuse_streamer.cpp
index 6c5d9bc7ec3..69bcf80628a 100644
--- a/engines/scumm/imuse_digi/dimuse_streamer.cpp
+++ b/engines/scumm/imuse_digi/dimuse_streamer.cpp
@@ -335,9 +335,9 @@ int IMuseDigital::streamerFetchData(IMuseDigiStream *streamPtr) {
_streamerBailFlag = 0;
- Common::StackLock lock(_mutex);
+ _mutex->lock();
actualAmount = _filesHandler->read(streamPtr->soundId, &streamPtr->buf[streamPtr->loadIndex], requestedAmount, streamPtr->bufId);
- Common::StackLock unlock(_mutex);
+ _mutex->unlock();
// FT has no bailFlag
if (!_isEarlyDiMUSE && _streamerBailFlag)
diff --git a/engines/scumm/imuse_digi/dimuse_tracks.cpp b/engines/scumm/imuse_digi/dimuse_tracks.cpp
index 407cccfc5ba..388b6ec83a0 100644
--- a/engines/scumm/imuse_digi/dimuse_tracks.cpp
+++ b/engines/scumm/imuse_digi/dimuse_tracks.cpp
@@ -71,7 +71,7 @@ void IMuseDigital::tracksResume() {
}
void IMuseDigital::tracksSaveLoad(Common::Serializer &ser) {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
dispatchSaveLoad(ser);
for (int l = 0; l < _trackCount; l++) {
@@ -150,8 +150,6 @@ void IMuseDigital::tracksCallback() {
_tracksPauseTimer = 3;
}
- Common::StackLock lock(_mutex);
-
// If we leave the number of queued streams unbounded, we fill the queue with streams faster than
// we can play them: this leads to a very noticeable audio latency and desync with the graphics.
if ((int)_internalMixer->_stream->numQueuedStreams() < _maxQueuedStreams) {
@@ -228,9 +226,9 @@ int IMuseDigital::tracksStartSound(int soundId, int tryPriority, int group) {
return -1;
}
- Common::StackLock lock(_mutex);
+ _mutex->lock();
addTrackToList(&_trackList, allocatedTrack);
- Common::StackLock unlock(_mutex);
+ _mutex->unlock();
return 0;
}
@@ -254,7 +252,7 @@ int IMuseDigital::tracksStopSound(int soundId) {
}
int IMuseDigital::tracksStopAllSounds() {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
IMuseDigiTrack *nextTrack = _trackList;
IMuseDigiTrack *curTrack;
diff --git a/engines/scumm/imuse_digi/dimuse_wave.cpp b/engines/scumm/imuse_digi/dimuse_wave.cpp
index c8574259846..ce8ea6e73dd 100644
--- a/engines/scumm/imuse_digi/dimuse_wave.cpp
+++ b/engines/scumm/imuse_digi/dimuse_wave.cpp
@@ -34,39 +34,39 @@ int IMuseDigital::waveTerminate() {
}
int IMuseDigital::wavePause() {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
tracksPause();
return 0;
}
int IMuseDigital::waveResume() {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
tracksResume();
return 0;
}
void IMuseDigital::waveSaveLoad(Common::Serializer &ser) {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
tracksSaveLoad(ser);
}
void IMuseDigital::waveUpdateGroupVolumes() {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
tracksSetGroupVol();
}
int IMuseDigital::waveStartSound(int soundId, int priority) {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
return tracksStartSound(soundId, priority, 0);
}
int IMuseDigital::waveStopSound(int soundId) {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
return tracksStopSound(soundId);
}
int IMuseDigital::waveStopAllSounds() {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
return tracksStopAllSounds();
}
@@ -75,12 +75,12 @@ int IMuseDigital::waveGetNextSound(int soundId) {
}
int IMuseDigital::waveSetParam(int soundId, int opcode, int value) {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
return tracksSetParam(soundId, opcode, value);
}
int IMuseDigital::waveGetParam(int soundId, int opcode) {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
return tracksGetParam(soundId, opcode);
}
@@ -96,32 +96,32 @@ int IMuseDigital::waveStartStream(int soundId, int priority, int bufferId) {
if (soundId == 0)
return -1;
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
return tracksStartSound(soundId, priority, bufferId);
}
int IMuseDigital::waveSwitchStream(int oldSoundId, int newSoundId, int fadeLengthMs, int fadeSyncFlag2, int fadeSyncFlag1) {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
return dispatchSwitchStream(oldSoundId, newSoundId, fadeLengthMs, fadeSyncFlag2, fadeSyncFlag1);
}
int IMuseDigital::waveSwitchStream(int oldSoundId, int newSoundId, uint8 *crossfadeBuffer, int crossfadeBufferSize, int vocLoopFlag) {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
return dispatchSwitchStream(oldSoundId, newSoundId, crossfadeBuffer, crossfadeBufferSize, vocLoopFlag);
}
int IMuseDigital::waveProcessStreams() {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
return streamerProcessStreams();
}
void IMuseDigital::waveQueryStream(int soundId, int32 &bufSize, int32 &criticalSize, int32 &freeSpace, int &paused) {
- Common::StackLock lock(_mutex);
tracksQueryStream(soundId, bufSize, criticalSize, freeSpace, paused);
+ Common::StackLock lock(*_mutex);
}
int IMuseDigital::waveFeedStream(int soundId, uint8 *srcBuf, int32 sizeToFeed, int paused) {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
return tracksFeedStream(soundId, srcBuf, sizeToFeed, paused);
}
diff --git a/engines/scumm/imuse_digi/dimuse_waveout.cpp b/engines/scumm/imuse_digi/dimuse_waveout.cpp
index 7311ad9b8f9..d3433c31996 100644
--- a/engines/scumm/imuse_digi/dimuse_waveout.cpp
+++ b/engines/scumm/imuse_digi/dimuse_waveout.cpp
@@ -87,7 +87,7 @@ int IMuseDigital::waveOutDeinit() {
}
void IMuseDigital::waveOutCallback() {
- Common::StackLock lock(_mutex);
+ Common::StackLock lock(*_mutex);
tracksCallback();
}
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index f8eacf3a54e..2fffe43f6e6 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -1366,7 +1366,7 @@ void ScummEngine_v7::setupScumm(const Common::String &macResourceFile) {
filesAreCompressed |= _sound->isSfxFileCompressed();
}
- _musicEngine = _imuseDigital = new IMuseDigital(this, _mixer);
+ _musicEngine = _imuseDigital = new IMuseDigital(this, _mixer, &_resourceAccessMutex);
if (filesAreCompressed) {
GUI::MessageDialog dialog(_(
More information about the Scummvm-git-logs
mailing list