[Scummvm-git-logs] scummvm master -> 5f9e0eb39582502a69e361415f5ea3788aee7df0

waltervn walter at vanniftrik-it.nl
Mon Aug 24 21:18:28 UTC 2020


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:
5f9e0eb395 SCI: Add mutexes to AmigaMac driver


Commit: 5f9e0eb39582502a69e361415f5ea3788aee7df0
    https://github.com/scummvm/scummvm/commit/5f9e0eb39582502a69e361415f5ea3788aee7df0
Author: Walter van Niftrik (walter at scummvm.org)
Date: 2020-08-24T23:14:45+02:00

Commit Message:
SCI: Add mutexes to AmigaMac driver

Changed paths:
    engines/sci/sound/drivers/amigamac0.cpp
    engines/sci/sound/drivers/amigamac1.cpp
    engines/sci/sound/drivers/macmixer.h


diff --git a/engines/sci/sound/drivers/amigamac0.cpp b/engines/sci/sound/drivers/amigamac0.cpp
index 5eaf039f10..92a8f14234 100644
--- a/engines/sci/sound/drivers/amigamac0.cpp
+++ b/engines/sci/sound/drivers/amigamac0.cpp
@@ -37,6 +37,7 @@
 
 #include "common/file.h"
 #include "common/memstream.h"
+#include "common/mutex.h"
 #include "common/system.h"
 #include "common/textconsole.h"
 #include "common/util.h"
@@ -51,7 +52,7 @@ public:
 		kBaseFreq = 60
 	};
 
-	MidiPlayer_AmigaMac0(SciVersion version, Audio::Mixer *mixer);
+	MidiPlayer_AmigaMac0(SciVersion version, Audio::Mixer *mixer, Common::Mutex &mutex);
 	virtual ~MidiPlayer_AmigaMac0();
 
 	// MidiPlayer
@@ -62,9 +63,9 @@ public:
 	byte getPlayId() const override { return 0x40; }
 	int getPolyphony() const override { return kVoices; }
 	bool hasRhythmChannel() const override { return false; }
-	void setVolume(byte volume) override { _masterVolume = CLIP<byte>(volume, 0, 15); }
-	int getVolume() override { return _masterVolume; }
-	void playSwitch(bool play) override { _playSwitch = play; }
+	void setVolume(byte volume) override;
+	int getVolume() override;
+	void playSwitch(bool play) override;
 	void initTrack(SciSpan<const byte> &trackData) override;
 
 protected:
@@ -160,9 +161,12 @@ protected:
 	typedef Common::Array<Voice *>::const_iterator VoiceIt;
 
 	Voice *_channels[MIDI_CHANNELS];
+
+	Common::Mutex &_mixMutex;
+	Common::Mutex _timerMutex;
 };
 
-MidiPlayer_AmigaMac0::MidiPlayer_AmigaMac0(SciVersion version, Audio::Mixer *mixer) :
+MidiPlayer_AmigaMac0::MidiPlayer_AmigaMac0(SciVersion version, Audio::Mixer *mixer, Common::Mutex &mutex) :
 	MidiPlayer(version),
 	_playSwitch(true),
 	_masterVolume(15),
@@ -171,7 +175,8 @@ MidiPlayer_AmigaMac0::MidiPlayer_AmigaMac0(SciVersion version, Audio::Mixer *mix
 	_timerProc(),
 	_timerParam(nullptr),
 	_isOpen(false),
-	_channels() {}
+	_channels(),
+	_mixMutex(mutex) {}
 
 MidiPlayer_AmigaMac0::~MidiPlayer_AmigaMac0() {
 	close();
@@ -195,6 +200,21 @@ void MidiPlayer_AmigaMac0::close() {
 	_isOpen = false;
 }
 
+void MidiPlayer_AmigaMac0::setVolume(byte volume) {
+	Common::StackLock lock(_mixMutex);
+	_masterVolume = CLIP<byte>(volume, 0, 15);
+}
+
+int MidiPlayer_AmigaMac0::getVolume() {
+	Common::StackLock lock(_mixMutex);
+	return _masterVolume;
+}
+
+void MidiPlayer_AmigaMac0::playSwitch(bool play) {
+	Common::StackLock lock(_mixMutex);
+	_playSwitch = play;
+}
+
 void MidiPlayer_AmigaMac0::initTrack(SciSpan<const byte>& header) {
 	if (!_isOpen)
 		return;
@@ -207,6 +227,8 @@ void MidiPlayer_AmigaMac0::initTrack(SciSpan<const byte>& header) {
 	if (caps != 0)
 		return;
 
+	Common::StackLock lock(_mixMutex);
+
 	uint vi = 0;
 
 	for (uint i = 0; i < 15; ++i) {
@@ -238,19 +260,28 @@ void MidiPlayer_AmigaMac0::freeInstruments() {
 }
 
 void MidiPlayer_AmigaMac0::onTimer() {
+	_mixMutex.unlock();
+	_timerMutex.lock();
+
 	if (_timerProc)
 		(*_timerProc)(_timerParam);
 
+	_timerMutex.unlock();
+	_mixMutex.lock();
+
 	for (VoiceIt it = _voices.begin(); it != _voices.end(); ++it)
 		(*it)->processEnvelope();
 }
 
 void MidiPlayer_AmigaMac0::setTimerCallback(void *timerParam, Common::TimerManager::TimerProc timerProc) {
+	Common::StackLock lock(_timerMutex);
 	_timerProc = timerProc;
 	_timerParam = timerParam;
 }
 
 void MidiPlayer_AmigaMac0::send(uint32 b) {
+	Common::StackLock lock(_mixMutex);
+
 	byte command = b & 0xf0;
 	byte channel = b & 0xf;
 	byte op1 = (b >> 8) & 0xff;
@@ -331,7 +362,7 @@ void MidiPlayer_AmigaMac0::Voice::processEnvelope() {
 	--_envCntDown;
 }
 
-class MidiPlayer_Mac0 : public MidiPlayer_AmigaMac0, public Mixer_Mac<MidiPlayer_Mac0> {
+class MidiPlayer_Mac0 : public Mixer_Mac<MidiPlayer_Mac0>, public MidiPlayer_AmigaMac0 {
 public:
 	MidiPlayer_Mac0(SciVersion version, Audio::Mixer *mixer, Mode mode);
 
@@ -387,8 +418,8 @@ private:
 };
 
 MidiPlayer_Mac0::MidiPlayer_Mac0(SciVersion version, Audio::Mixer *mixer, Mixer_Mac<MidiPlayer_Mac0>::Mode mode) :
-	MidiPlayer_AmigaMac0(version, mixer),
-	Mixer_Mac<MidiPlayer_Mac0>(mode) {
+	Mixer_Mac<MidiPlayer_Mac0>(mode),
+	MidiPlayer_AmigaMac0(version, mixer, _mutex) {
 
 	for (uint i = 0; i < kStepTableSize; ++i)
 		_stepTable[i] = round(0x2000 * pow(2.0, i / 12.0));
@@ -600,7 +631,7 @@ bool MidiPlayer_Mac0::loadInstruments(Common::SeekableReadStream &patch) {
 	return true;
 }
 
-class MidiPlayer_Amiga0 : public MidiPlayer_AmigaMac0, public Audio::Paula {
+class MidiPlayer_Amiga0 : public Audio::Paula, public MidiPlayer_AmigaMac0 {
 public:
 	MidiPlayer_Amiga0(SciVersion version, Audio::Mixer *mixer);
 
@@ -654,8 +685,8 @@ private:
 };
 
 MidiPlayer_Amiga0::MidiPlayer_Amiga0(SciVersion version, Audio::Mixer *mixer) :
-	MidiPlayer_AmigaMac0(version, mixer),
 	Audio::Paula(true, mixer->getOutputRate(), mixer->getOutputRate() / kBaseFreq),
+	MidiPlayer_AmigaMac0(version, mixer, _mutex),
 	_defaultInstrument(0),
 	_isEarlyDriver(false) {
 
diff --git a/engines/sci/sound/drivers/amigamac1.cpp b/engines/sci/sound/drivers/amigamac1.cpp
index 7c9dbaea2d..8739afea34 100644
--- a/engines/sci/sound/drivers/amigamac1.cpp
+++ b/engines/sci/sound/drivers/amigamac1.cpp
@@ -30,6 +30,7 @@
 #include "common/debug-channels.h"
 #include "common/hashmap.h"
 #include "common/memstream.h"
+#include "common/mutex.h"
 #include "common/stream.h"
 #include "common/textconsole.h"
 #include "common/util.h"
@@ -51,7 +52,7 @@ public:
 		kEnvStateRelease
 	};
 
-	MidiPlayer_AmigaMac1(SciVersion version, Audio::Mixer *mixer, uint extraSamples, bool wantSignedSamples);
+	MidiPlayer_AmigaMac1(SciVersion version, Audio::Mixer *mixer, uint extraSamples, bool wantSignedSamples, Common::Mutex &mutex);
 	virtual ~MidiPlayer_AmigaMac1();
 
 	// MidiPlayer
@@ -62,9 +63,9 @@ public:
 	byte getPlayId() const override { return 0x06; }
 	int getPolyphony() const override { return kVoices; }
 	bool hasRhythmChannel() const override { return false; }
-	void setVolume(byte volume) override { _masterVolume = volume; }
-	int getVolume() override { return _masterVolume; }
-	void playSwitch(bool play) override { _playSwitch = play; }
+	void setVolume(byte volume) override;
+	int getVolume() override;
+	void playSwitch(bool play) override;
 
 protected:
 	struct Wave {
@@ -236,9 +237,12 @@ protected:
 
 	const uint _extraSamples;
 	const bool _wantSignedSamples;
+
+	Common::Mutex &_mixMutex;
+	Common::Mutex _timerMutex;
 };
 
-MidiPlayer_AmigaMac1::MidiPlayer_AmigaMac1(SciVersion version, Audio::Mixer *mixer, uint extraSamples, bool wantSignedSamples) :
+MidiPlayer_AmigaMac1::MidiPlayer_AmigaMac1(SciVersion version, Audio::Mixer *mixer, uint extraSamples, bool wantSignedSamples, Common::Mutex &mutex) :
 	MidiPlayer(version),
 	_playSwitch(true),
 	_masterVolume(15),
@@ -248,7 +252,8 @@ MidiPlayer_AmigaMac1::MidiPlayer_AmigaMac1(SciVersion version, Audio::Mixer *mix
 	_timerParam(nullptr),
 	_isOpen(false),
 	_extraSamples(extraSamples),
-	_wantSignedSamples(wantSignedSamples) {
+	_wantSignedSamples(wantSignedSamples),
+	_mixMutex(mutex) {
 
 	assert(_extraSamples > 0);
 }
@@ -277,10 +282,26 @@ void MidiPlayer_AmigaMac1::close() {
 }
 
 void MidiPlayer_AmigaMac1::setTimerCallback(void *timer_param, Common::TimerManager::TimerProc timer_proc) {
+	Common::StackLock lock(_timerMutex);
 	_timerProc = timer_proc;
 	_timerParam = timer_param;
 }
 
+void MidiPlayer_AmigaMac1::setVolume(byte volume) {
+	Common::StackLock lock(_mixMutex);
+	_masterVolume = volume;
+}
+
+int MidiPlayer_AmigaMac1::getVolume() {
+	Common::StackLock lock(_mixMutex);
+	return _masterVolume;
+}
+
+void MidiPlayer_AmigaMac1::playSwitch(bool play) {
+	Common::StackLock lock(_mixMutex);
+	_playSwitch = play;
+}
+
 uint32 *MidiPlayer_AmigaMac1::loadFreqTable(Common::SeekableReadStream &stream) {
 	uint32 *freqTable = new ufrac_t[kFreqTableSize];
 
@@ -434,6 +455,15 @@ void MidiPlayer_AmigaMac1::freeInstruments() {
 }
 
 void MidiPlayer_AmigaMac1::onTimer() {
+	_mixMutex.unlock();
+	_timerMutex.lock();
+
+	if (_timerProc)
+		(*_timerProc)(_timerParam);
+
+	_timerMutex.unlock();
+	_mixMutex.lock();
+
 	for (VoiceIt it = _voices.begin(); it != _voices.end(); ++it) {
 		Voice *v = *it;
 		if (v->_note != -1) {
@@ -800,6 +830,8 @@ void MidiPlayer_AmigaMac1::Channel::setPitchWheel(uint16 pitch) {
 }
 
 void MidiPlayer_AmigaMac1::send(uint32 b) {
+	Common::StackLock lock(_mixMutex);
+
 	const byte command = b & 0xf0;
 	Channel *channel = _channels[b & 0xf];
 	const byte op1 = (b >> 8) & 0xff;
@@ -866,7 +898,7 @@ const byte MidiPlayer_AmigaMac1::_velocityMap[64] = {
 	0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x34, 0x35, 0x37, 0x39, 0x3a, 0x3c, 0x3e, 0x40
 };
 
-class MidiPlayer_Mac1 : public MidiPlayer_AmigaMac1, public Mixer_Mac<MidiPlayer_Mac1> {
+class MidiPlayer_Mac1 : public Mixer_Mac<MidiPlayer_Mac1>, public MidiPlayer_AmigaMac1 {
 public:
 	MidiPlayer_Mac1(SciVersion version, Audio::Mixer *mixer, Mixer_Mac<MidiPlayer_Mac1>::Mode mode);
 
@@ -878,7 +910,7 @@ public:
 
 	// Mixer_Mac
 	static int8 applyChannelVolume(byte velocity, byte sample);
-	void interrupt();
+	void interrupt() { onTimer(); }
 	void onChannelFinished(uint channel);
 
 private:
@@ -903,8 +935,8 @@ private:
 };
 
 MidiPlayer_Mac1::MidiPlayer_Mac1(SciVersion version, Audio::Mixer *mixer, Mixer_Mac<MidiPlayer_Mac1>::Mode mode) :
-	MidiPlayer_AmigaMac1(version, mixer, 1480, false),
-	Mixer_Mac<MidiPlayer_Mac1>(mode) {}
+	Mixer_Mac<MidiPlayer_Mac1>(mode),
+	MidiPlayer_AmigaMac1(version, mixer, 1480, false, _mutex) {}
 
 int MidiPlayer_Mac1::open(ResourceManager *resMan) {
 	if (_isOpen)
@@ -941,13 +973,6 @@ void MidiPlayer_Mac1::close() {
 	stopMixer();
 }
 
-void MidiPlayer_Mac1::interrupt() {
-	if (_timerProc)
-		(*_timerProc)(_timerParam);
-
-	onTimer();
-}
-
 void MidiPlayer_Mac1::onChannelFinished(uint channel) {
 	_voices[channel]->noteOff();
 }
@@ -1054,7 +1079,7 @@ int8 MidiPlayer_Mac1::applyChannelVolume(byte volume, byte sample) {
 	return euclDivide((sample - 0x80) * volume, 63);
 }
 
-class MidiPlayer_Amiga1 : public MidiPlayer_AmigaMac1, public Audio::Paula {
+class MidiPlayer_Amiga1 : public Audio::Paula, public MidiPlayer_AmigaMac1 {
 public:
 	MidiPlayer_Amiga1(SciVersion version, Audio::Mixer *mixer);
 
@@ -1091,8 +1116,8 @@ private:
 };
 
 MidiPlayer_Amiga1::MidiPlayer_Amiga1(SciVersion version, Audio::Mixer *mixer) :
-	MidiPlayer_AmigaMac1(version, mixer, 224, true),
 	Paula(true, mixer->getOutputRate(), (mixer->getOutputRate() + kBaseFreq / 2) / kBaseFreq, kFilterModeA500),
+	MidiPlayer_AmigaMac1(version, mixer, 224, true, _mutex),
 	_isSci1Ega(false) {}
 
 int MidiPlayer_Amiga1::open(ResourceManager *resMan) {
@@ -1147,9 +1172,6 @@ void MidiPlayer_Amiga1::interrupt() {
 			_voices[vi]->noteOff();
 	}
 
-	if (_timerProc)
-		(*_timerProc)(_timerParam);
-
 	onTimer();
 }
 
diff --git a/engines/sci/sound/drivers/macmixer.h b/engines/sci/sound/drivers/macmixer.h
index 28784fab19..f6b5df4067 100644
--- a/engines/sci/sound/drivers/macmixer.h
+++ b/engines/sci/sound/drivers/macmixer.h
@@ -23,6 +23,7 @@
 #include "audio/audiostream.h"
 #include "audio/mixer.h"
 #include "common/frac.h"
+#include "common/mutex.h"
 #include "common/system.h"
 
 #ifndef SCI_SOUND_DRIVERS_MACMIXER_H
@@ -67,6 +68,8 @@ public:
 	int readBuffer(int16 *data, const int numSamples) override;
 	bool endOfData() const override { return false; }
 
+	Common::Mutex _mutex;
+
 private:
 	template <Mode mode>
 	void generateSamples(int16 *buf, int len);
@@ -204,6 +207,9 @@ void Mixer_Mac<T>::generateSamples(int16 *data, int len) {
 
 template <typename T>
 int Mixer_Mac<T>::readBuffer(int16 *data, const int numSamples) {
+	// Would probably be better inside generateSamples, but let's follow Audio::Paula
+	Common::StackLock lock(_mutex);
+
 	if (!_isPlaying) {
 		memset(data, 0, numSamples * 2);
 		return numSamples;




More information about the Scummvm-git-logs mailing list