aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Snover2017-11-11 21:22:48 -0600
committerColin Snover2017-11-12 23:15:05 -0600
commit0eda63bed1b2d7fe0dba1360cad880b826248eaa (patch)
tree6c4a8742a0d0066c283a45e0469f4ebd5e2ecfb8
parent63b90d13e420ab499aa8a56c34fbfb839131c17c (diff)
downloadscummvm-rg350-0eda63bed1b2d7fe0dba1360cad880b826248eaa.tar.gz
scummvm-rg350-0eda63bed1b2d7fe0dba1360cad880b826248eaa.tar.bz2
scummvm-rg350-0eda63bed1b2d7fe0dba1360cad880b826248eaa.zip
SCUMM: Fix race condition in MOD player
Fixes Trac#6272.
-rw-r--r--engines/scumm/players/player_mod.cpp11
-rw-r--r--engines/scumm/players/player_mod.h3
2 files changed, 14 insertions, 0 deletions
diff --git a/engines/scumm/players/player_mod.cpp b/engines/scumm/players/player_mod.cpp
index ced30ff193..d780df94a5 100644
--- a/engines/scumm/players/player_mod.cpp
+++ b/engines/scumm/players/player_mod.cpp
@@ -63,11 +63,13 @@ void Player_MOD::setMusicVolume(int vol) {
}
void Player_MOD::setUpdateProc(ModUpdateProc *proc, void *param, int freq) {
+ Common::StackLock lock(_mutex);
_playproc = proc;
_playparam = param;
_mixamt = _sampleRate / freq;
}
void Player_MOD::clearUpdateProc() {
+ Common::StackLock lock(_mutex);
_playproc = NULL;
_playparam = NULL;
_mixamt = 0;
@@ -78,6 +80,7 @@ void Player_MOD::startChannel(int id, void *data, int size, int rate, uint8 vol,
if (id == 0)
error("player_mod - attempted to start channel id 0");
+ Common::StackLock lock(_mutex);
for (i = 0; i < MOD_MAXCHANS; i++) {
if (!_channels[i].id)
break;
@@ -106,6 +109,8 @@ void Player_MOD::startChannel(int id, void *data, int size, int rate, uint8 vol,
void Player_MOD::stopChannel(int id) {
if (id == 0)
error("player_mod - attempted to stop channel id 0");
+
+ Common::StackLock lock(_mutex);
for (int i = 0; i < MOD_MAXCHANS; i++) {
if (_channels[i].id == id) {
delete _channels[i].input;
@@ -121,6 +126,8 @@ void Player_MOD::stopChannel(int id) {
void Player_MOD::setChannelVol(int id, uint8 vol) {
if (id == 0)
error("player_mod - attempted to set volume for channel id 0");
+
+ Common::StackLock lock(_mutex);
for (int i = 0; i < MOD_MAXCHANS; i++) {
if (_channels[i].id == id) {
_channels[i].vol = vol;
@@ -132,6 +139,8 @@ void Player_MOD::setChannelVol(int id, uint8 vol) {
void Player_MOD::setChannelPan(int id, int8 pan) {
if (id == 0)
error("player_mod - attempted to set pan for channel id 0");
+
+ Common::StackLock lock(_mutex);
for (int i = 0; i < MOD_MAXCHANS; i++) {
if (_channels[i].id == id) {
_channels[i].pan = pan;
@@ -143,6 +152,8 @@ void Player_MOD::setChannelPan(int id, int8 pan) {
void Player_MOD::setChannelFreq(int id, int freq) {
if (id == 0)
error("player_mod - attempted to set frequency for channel id 0");
+
+ Common::StackLock lock(_mutex);
for (int i = 0; i < MOD_MAXCHANS; i++) {
if (_channels[i].id == id) {
if (freq > 31400) // this is about as high as WinUAE goes
diff --git a/engines/scumm/players/player_mod.h b/engines/scumm/players/player_mod.h
index bb0c422090..a157f34bcc 100644
--- a/engines/scumm/players/player_mod.h
+++ b/engines/scumm/players/player_mod.h
@@ -26,6 +26,7 @@
#include "scumm/scumm.h"
#include "audio/audiostream.h"
#include "audio/mixer.h"
+#include "common/mutex.h"
namespace Audio {
class RateConverter;
@@ -55,6 +56,7 @@ public:
// AudioStream API
int readBuffer(int16 *buffer, const int numSamples) {
+ Common::StackLock lock(_mutex);
do_mix(buffer, numSamples / 2);
return numSamples;
}
@@ -80,6 +82,7 @@ private:
Audio::Mixer *_mixer;
Audio::SoundHandle _soundHandle;
+ Common::Mutex _mutex;
uint32 _mixamt;
uint32 _mixpos;