[Scummvm-git-logs] scummvm master -> d83532f82f167adb227214268b0624b67e79e856
AndywinXp
noreply at scummvm.org
Sun Jun 15 10:32:33 UTC 2025
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
d83532f82f SCUMM: DiMUSE: Prevent more data races
Commit: d83532f82f167adb227214268b0624b67e79e856
https://github.com/scummvm/scummvm/commit/d83532f82f167adb227214268b0624b67e79e856
Author: AndywinXp (andywinxp at gmail.com)
Date: 2025-06-15T12:32:25+02:00
Commit Message:
SCUMM: DiMUSE: Prevent more data races
Changed paths:
engines/scumm/imuse_digi/dimuse_engine.cpp
engines/scumm/imuse_digi/dimuse_fades.cpp
engines/scumm/imuse_digi/dimuse_fades.h
engines/scumm/imuse_digi/dimuse_groups.cpp
engines/scumm/imuse_digi/dimuse_groups.h
engines/scumm/imuse_digi/dimuse_triggers.cpp
engines/scumm/imuse_digi/dimuse_triggers.h
diff --git a/engines/scumm/imuse_digi/dimuse_engine.cpp b/engines/scumm/imuse_digi/dimuse_engine.cpp
index 92266d58fcc..44ecde76563 100644
--- a/engines/scumm/imuse_digi/dimuse_engine.cpp
+++ b/engines/scumm/imuse_digi/dimuse_engine.cpp
@@ -94,9 +94,9 @@ IMuseDigital::IMuseDigital(ScummEngine_v7 *scumm, int sampleRate, Audio::Mixer *
_emptyMarker[0] = '\0';
_internalMixer = new IMuseDigiInternalMixer(mixer, _internalSampleRate, _isEarlyDiMUSE, _lowLatencyMode);
- _groupsHandler = new IMuseDigiGroupsHandler(this);
- _fadesHandler = new IMuseDigiFadesHandler(this);
- _triggersHandler = new IMuseDigiTriggersHandler(this);
+ _groupsHandler = new IMuseDigiGroupsHandler(this, mutex);
+ _fadesHandler = new IMuseDigiFadesHandler(this, mutex);
+ _triggersHandler = new IMuseDigiTriggersHandler(this, mutex);
_filesHandler = new IMuseDigiFilesHandler(this, scumm);
diMUSEInitialize();
@@ -902,7 +902,6 @@ int IMuseDigital::diMUSEGetParam(int soundId, int paramId) {
}
int IMuseDigital::diMUSEFadeParam(int soundId, int opcode, int destValue, int fadeLength) {
- Common::StackLock lock(*_mutex);
return cmdsHandleCmd(DIMUSE_C_FADE_PARAM, nullptr, soundId, opcode, destValue, fadeLength);
}
diff --git a/engines/scumm/imuse_digi/dimuse_fades.cpp b/engines/scumm/imuse_digi/dimuse_fades.cpp
index 44c8abbfc1a..baeba714f4b 100644
--- a/engines/scumm/imuse_digi/dimuse_fades.cpp
+++ b/engines/scumm/imuse_digi/dimuse_fades.cpp
@@ -24,8 +24,9 @@
namespace Scumm {
-IMuseDigiFadesHandler::IMuseDigiFadesHandler(IMuseDigital *engine) {
+IMuseDigiFadesHandler::IMuseDigiFadesHandler(IMuseDigital *engine, Common::Mutex *mutex) {
_engine = engine;
+ _mutex = mutex;
}
IMuseDigiFadesHandler::~IMuseDigiFadesHandler() {}
@@ -36,8 +37,11 @@ int IMuseDigiFadesHandler::init() {
}
int IMuseDigiFadesHandler::fadeParam(int soundId, int opcode, int destinationValue, int fadeLength) {
+ Common::StackLock lock(*_mutex);
+
if (!soundId || fadeLength < 0)
return -5;
+
if (opcode != DIMUSE_P_PRIORITY && opcode != DIMUSE_P_VOLUME && opcode != DIMUSE_P_PAN && opcode != DIMUSE_P_DETUNE && opcode != DIMUSE_P_UNKNOWN && opcode != 17)
return -5;
@@ -95,6 +99,7 @@ void IMuseDigiFadesHandler::clearFadeStatus(int soundId, int opcode) {
void IMuseDigiFadesHandler::loop() {
if (!_fadesOn)
return;
+
_fadesOn = 0;
for (int l = 0; l < DIMUSE_MAX_FADES; l++) {
@@ -152,6 +157,8 @@ void IMuseDigiFadesHandler::saveLoad(Common::Serializer &ser) {
}
void IMuseDigiFadesHandler::clearAllFades() {
+ Common::StackLock lock(*_mutex);
+
for (int l = 0; l < DIMUSE_MAX_FADES; l++) {
_fades[l].status = 0;
_fades[l].sound = 0;
@@ -164,6 +171,7 @@ void IMuseDigiFadesHandler::clearAllFades() {
_fades[l].modOvfloCounter = 0;
_fades[l].nudge = 0;
}
+
_fadesOn = 0;
}
diff --git a/engines/scumm/imuse_digi/dimuse_fades.h b/engines/scumm/imuse_digi/dimuse_fades.h
index ee7457e2133..4f0d37056a0 100644
--- a/engines/scumm/imuse_digi/dimuse_fades.h
+++ b/engines/scumm/imuse_digi/dimuse_fades.h
@@ -32,12 +32,13 @@ class IMuseDigiFadesHandler {
private:
IMuseDigital *_engine;
+ Common::Mutex *_mutex;
IMuseDigiFade _fades[DIMUSE_MAX_FADES] = {};
int _fadesOn = 0;
void clearAllFades();
public:
- IMuseDigiFadesHandler(IMuseDigital *engine);
+ IMuseDigiFadesHandler(IMuseDigital *engine, Common::Mutex *mutex);
~IMuseDigiFadesHandler();
int init();
diff --git a/engines/scumm/imuse_digi/dimuse_groups.cpp b/engines/scumm/imuse_digi/dimuse_groups.cpp
index bcd2c3e50ac..b6361a6f728 100644
--- a/engines/scumm/imuse_digi/dimuse_groups.cpp
+++ b/engines/scumm/imuse_digi/dimuse_groups.cpp
@@ -24,8 +24,9 @@
namespace Scumm {
-IMuseDigiGroupsHandler::IMuseDigiGroupsHandler(IMuseDigital *engine) {
+IMuseDigiGroupsHandler::IMuseDigiGroupsHandler(IMuseDigital *engine, Common::Mutex *mutex) {
_engine = engine;
+ _mutex = mutex;
}
IMuseDigiGroupsHandler::~IMuseDigiGroupsHandler() {}
@@ -39,6 +40,8 @@ int IMuseDigiGroupsHandler::init() {
}
int IMuseDigiGroupsHandler::setGroupVol(int id, int volume) {
+ Common::StackLock lock(*_mutex);
+
int l;
if (id >= DIMUSE_MAX_GROUPS) {
@@ -69,6 +72,8 @@ int IMuseDigiGroupsHandler::setGroupVol(int id, int volume) {
}
int IMuseDigiGroupsHandler::getGroupVol(int id) {
+ Common::StackLock lock(*_mutex);
+
if (id >= DIMUSE_MAX_GROUPS) {
return -5;
}
diff --git a/engines/scumm/imuse_digi/dimuse_groups.h b/engines/scumm/imuse_digi/dimuse_groups.h
index c3933903d6b..bb46da46810 100644
--- a/engines/scumm/imuse_digi/dimuse_groups.h
+++ b/engines/scumm/imuse_digi/dimuse_groups.h
@@ -35,10 +35,11 @@ class IMuseDigiGroupsHandler {
private:
IMuseDigital *_engine;
+ Common::Mutex *_mutex;
int _effVols[DIMUSE_MAX_GROUPS] = {};
int _vols[DIMUSE_MAX_GROUPS] = {};
public:
- IMuseDigiGroupsHandler(IMuseDigital *engine);
+ IMuseDigiGroupsHandler(IMuseDigital *engine, Common::Mutex *mutex);
~IMuseDigiGroupsHandler();
int init();
int setGroupVol(int id, int volume);
diff --git a/engines/scumm/imuse_digi/dimuse_triggers.cpp b/engines/scumm/imuse_digi/dimuse_triggers.cpp
index 9936cfa4e85..4247e0dc2fd 100644
--- a/engines/scumm/imuse_digi/dimuse_triggers.cpp
+++ b/engines/scumm/imuse_digi/dimuse_triggers.cpp
@@ -24,8 +24,9 @@
namespace Scumm {
-IMuseDigiTriggersHandler::IMuseDigiTriggersHandler(IMuseDigital *engine) {
+IMuseDigiTriggersHandler::IMuseDigiTriggersHandler(IMuseDigital *engine, Common::Mutex *mutex) {
_engine = engine;
+ _mutex = mutex;
_emptyMarker[0] = '\0';
}
@@ -40,6 +41,8 @@ int IMuseDigiTriggersHandler::deinit() {
}
int IMuseDigiTriggersHandler::clearAllTriggers() {
+ Common::StackLock lock(*_mutex);
+
for (int l = 0; l < DIMUSE_MAX_TRIGGERS; l++) {
_trigs[l].sound = 0;
memset(_trigs[l].text, 0, sizeof(_trigs[l].text));
@@ -71,6 +74,7 @@ int IMuseDigiTriggersHandler::clearAllTriggers() {
_defers[l].i = 0;
_defers[l].j = 0;
}
+
_defersOn = 0;
_midProcessing = 0;
return 0;
@@ -114,6 +118,8 @@ void IMuseDigiTriggersHandler::saveLoad(Common::Serializer &ser) {
}
int IMuseDigiTriggersHandler::setTrigger(int soundId, char *marker, int opcode, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, int n) {
+ Common::StackLock lock(*_mutex);
+
if (soundId == 0) {
return -5;
}
@@ -148,11 +154,14 @@ int IMuseDigiTriggersHandler::setTrigger(int soundId, char *marker, int opcode,
return 0;
}
}
+
debug(5, "IMuseDigiTriggersHandler::setTrigger(): ERROR: unable to allocate trigger \"%s\" for sound %d, every slot is full", marker, soundId);
return -6;
}
int IMuseDigiTriggersHandler::checkTrigger(int soundId, char *marker, int opcode) {
+ Common::StackLock lock(*_mutex);
+
int r = 0;
for (int l = 0; l < DIMUSE_MAX_TRIGGERS; l++) {
if (_trigs[l].sound != 0) {
@@ -169,6 +178,8 @@ int IMuseDigiTriggersHandler::checkTrigger(int soundId, char *marker, int opcode
}
int IMuseDigiTriggersHandler::clearTrigger(int soundId, char *marker, int opcode) {
+ Common::StackLock lock(*_mutex);
+
for (int l = 0; l < DIMUSE_MAX_TRIGGERS; l++) {
if ((_trigs[l].sound != 0) && (soundId == -1 || _trigs[l].sound == soundId) &&
(!strcmp(marker, _emptyMarker) || !strcmp(marker, _trigs[l].text)) &&
@@ -187,6 +198,7 @@ int IMuseDigiTriggersHandler::clearTrigger(int soundId, char *marker, int opcode
void IMuseDigiTriggersHandler::processTriggers(int soundId, char *marker) {
char textBuffer[256];
int r;
+
if (strlen(marker) >= 256) {
debug(5, "IMuseDigiTriggersHandler::processTriggers(): ERROR: the input marker string is oversized");
return;
@@ -247,9 +259,12 @@ void IMuseDigiTriggersHandler::processTriggers(int soundId, char *marker) {
}
int IMuseDigiTriggersHandler::deferCommand(int count, int opcode, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, int n) {
+ Common::StackLock lock(*_mutex);
+
if (!count) {
return -5;
}
+
for (int index = 0; index < DIMUSE_MAX_DEFERS; index++) {
if (!_defers[index].counter) {
_defers[index].counter = count;
@@ -302,6 +317,8 @@ void IMuseDigiTriggersHandler::loop() {
}
int IMuseDigiTriggersHandler::countPendingSounds(int soundId) {
+ Common::StackLock lock(*_mutex);
+
int r = 0;
for (int l = 0; l < DIMUSE_MAX_TRIGGERS; l++) {
if (!_trigs[l].sound)
diff --git a/engines/scumm/imuse_digi/dimuse_triggers.h b/engines/scumm/imuse_digi/dimuse_triggers.h
index bbe4a878570..c736fa5fd64 100644
--- a/engines/scumm/imuse_digi/dimuse_triggers.h
+++ b/engines/scumm/imuse_digi/dimuse_triggers.h
@@ -33,6 +33,7 @@ class IMuseDigiTriggersHandler {
private:
IMuseDigital *_engine;
+ Common::Mutex *_mutex;
IMuseDigiTrigger _trigs[DIMUSE_MAX_TRIGGERS] = {};
IMuseDigiDefer _defers[DIMUSE_MAX_DEFERS] = {};
@@ -42,7 +43,7 @@ private:
char _emptyMarker[1] = {};
public:
- IMuseDigiTriggersHandler(IMuseDigital *engine);
+ IMuseDigiTriggersHandler(IMuseDigital *engine, Common::Mutex *mutex);
~IMuseDigiTriggersHandler();
int init();
More information about the Scummvm-git-logs
mailing list