aboutsummaryrefslogtreecommitdiff
path: root/sound/softsynth
diff options
context:
space:
mode:
authorFlorian Kagerer2010-10-10 16:44:09 +0000
committerFlorian Kagerer2010-10-10 16:44:09 +0000
commit67c68afa6dd2fe1fdc300b72a7cf1d867ab38f27 (patch)
treeeb1234ce3ef028e0cabd718ea58ba8a6493f63b6 /sound/softsynth
parent1f6bc7e3095bcf8cac4daba79859fa1c23deea52 (diff)
downloadscummvm-rg350-67c68afa6dd2fe1fdc300b72a7cf1d867ab38f27.tar.gz
scummvm-rg350-67c68afa6dd2fe1fdc300b72a7cf1d867ab38f27.tar.bz2
scummvm-rg350-67c68afa6dd2fe1fdc300b72a7cf1d867ab38f27.zip
FM-TOWNS AUDIO: improve thread safety
svn-id: r53126
Diffstat (limited to 'sound/softsynth')
-rw-r--r--sound/softsynth/fmtowns_pc98/towns_audio.cpp2
-rw-r--r--sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp2
-rw-r--r--sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp11
3 files changed, 7 insertions, 8 deletions
diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp
index f9c9529214..9823015a2d 100644
--- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp
+++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp
@@ -227,8 +227,8 @@ TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfac
TownsAudioInterface::~TownsAudioInterface() {
reset();
- deinit();
_ready = false;
+ deinit();
delete[] _fmSaveReg[0];
delete[] _fmSaveReg[1];
diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
index b711eccbe1..4676ed774a 100644
--- a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
+++ b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
@@ -1054,8 +1054,8 @@ TownsPC98_AudioDriver::TownsPC98_AudioDriver(Audio::Mixer *mixer, EmuType type)
TownsPC98_AudioDriver::~TownsPC98_AudioDriver() {
reset();
- deinit();
_ready = false;
+ deinit();
if (_channels) {
for (int i = 0; i < _numChan; i++)
diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp
index dbd8e37cb7..541d582c1c 100644
--- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp
+++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp
@@ -844,8 +844,7 @@ TownsPC98_FmSynth::TownsPC98_FmSynth(Audio::Mixer *mixer, EmuType type) :
memset(&_timers[0], 0, sizeof(ChipTimer));
memset(&_timers[1], 0, sizeof(ChipTimer));
- _timers[0].cb = &TownsPC98_FmSynth::timerCallbackA;
- _timers[1].cb = &TownsPC98_FmSynth::timerCallbackB;
+ _timers[0].cb = _timers[1].cb = &TownsPC98_FmSynth::idleTimerCallback;
_timerbase = (uint32)(_baserate * 1000000.0f);
}
@@ -1125,7 +1124,7 @@ int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) {
memset(tmp, 0, sizeof(int32) * numSamples);
int32 samplesLeft = numSamples >> 1;
- while (samplesLeft) {
+ while (_ready && samplesLeft) {
int32 render = samplesLeft;
for (int i = 0; i < 2; i++) {
@@ -1179,10 +1178,10 @@ int TownsPC98_FmSynth::readBuffer(int16 *buffer, const int numSamples) {
}
void TownsPC98_FmSynth::deinit() {
- _mixer->stopHandle(_soundHandle);
- _timers[0].cb = &TownsPC98_FmSynth::idleTimerCallback;
- _timers[1].cb = &TownsPC98_FmSynth::idleTimerCallback;
_ready = false;
+ _mixer->stopHandle(_soundHandle);
+ Common::StackLock lock(_mutex);
+ _timers[0].cb = _timers[1].cb = &TownsPC98_FmSynth::idleTimerCallback;
}
uint8 TownsPC98_FmSynth::readSSGStatus() {