[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