diff options
author | Colin Snover | 2017-11-11 21:22:48 -0600 |
---|---|---|
committer | Colin Snover | 2017-11-12 23:15:05 -0600 |
commit | 0eda63bed1b2d7fe0dba1360cad880b826248eaa (patch) | |
tree | 6c4a8742a0d0066c283a45e0469f4ebd5e2ecfb8 /engines/scumm/players | |
parent | 63b90d13e420ab499aa8a56c34fbfb839131c17c (diff) | |
download | scummvm-rg350-0eda63bed1b2d7fe0dba1360cad880b826248eaa.tar.gz scummvm-rg350-0eda63bed1b2d7fe0dba1360cad880b826248eaa.tar.bz2 scummvm-rg350-0eda63bed1b2d7fe0dba1360cad880b826248eaa.zip |
SCUMM: Fix race condition in MOD player
Fixes Trac#6272.
Diffstat (limited to 'engines/scumm/players')
-rw-r--r-- | engines/scumm/players/player_mod.cpp | 11 | ||||
-rw-r--r-- | engines/scumm/players/player_mod.h | 3 |
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; |