[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