aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/scumm/player_towns.cpp12
-rw-r--r--sound/softsynth/fmtowns_pc98/towns_audio.cpp1
-rw-r--r--sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp1
-rw-r--r--sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp1
4 files changed, 9 insertions, 6 deletions
diff --git a/engines/scumm/player_towns.cpp b/engines/scumm/player_towns.cpp
index fa19cb20fd..ee4caeaec1 100644
--- a/engines/scumm/player_towns.cpp
+++ b/engines/scumm/player_towns.cpp
@@ -164,7 +164,7 @@ int Player_Towns::allocatePcmChannel(int sound, int sfxChanRelIndex, uint32 prio
if (_v2 && priority > 255) {
chan = 8;
- if (_intf->callback(40, 0x47))
+ if (_intf->callback(40, 0x47) && _pcmCurrentSound[chan].index != 0xffff)
_vm->_sound->stopSound(_pcmCurrentSound[chan].index);
} else {
for (int i = 8; i; i--) {
@@ -218,8 +218,8 @@ Player_Towns_v1::Player_Towns_v1(ScummEngine *vm, Audio::Mixer *mixer) : Player_
}
Player_Towns_v1::~Player_Towns_v1() {
- delete[] _soundOverride;
delete _driver;
+ delete[] _soundOverride;
}
bool Player_Towns_v1::init() {
@@ -590,11 +590,13 @@ Player_Towns_v2::Player_Towns_v2(ScummEngine *vm, IMuse *imuse, Audio::Mixer *mi
}
Player_Towns_v2::~Player_Towns_v2() {
- delete[] _sblData;
- delete[] _soundOverride;
delete _intf;
+
if (_imuseDispose)
delete _imuse;
+
+ delete[] _sblData;
+ delete[] _soundOverride;
}
bool Player_Towns_v2::init() {
@@ -725,6 +727,8 @@ void Player_Towns_v2::playPcmTrackSBL(const uint8 *data) {
uint32 len = (READ_LE_UINT32(data) >> 8) - 2;
int chan = allocatePcmChannel(0xffff, 0, 0x1000);
+ if (!chan)
+ return;
delete[] _sblData;
_sblData = new uint8[len + 32];
diff --git a/sound/softsynth/fmtowns_pc98/towns_audio.cpp b/sound/softsynth/fmtowns_pc98/towns_audio.cpp
index 58e09f291b..f9c9529214 100644
--- a/sound/softsynth/fmtowns_pc98/towns_audio.cpp
+++ b/sound/softsynth/fmtowns_pc98/towns_audio.cpp
@@ -226,7 +226,6 @@ TownsAudioInterface::TownsAudioInterface(Audio::Mixer *mixer, TownsAudioInterfac
}
TownsAudioInterface::~TownsAudioInterface() {
- Common::StackLock lock(_mutex);
reset();
deinit();
_ready = false;
diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
index 3cf4caf0d1..b711eccbe1 100644
--- a/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
+++ b/sound/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
@@ -1053,7 +1053,6 @@ TownsPC98_AudioDriver::TownsPC98_AudioDriver(Audio::Mixer *mixer, EmuType type)
}
TownsPC98_AudioDriver::~TownsPC98_AudioDriver() {
- Common::StackLock lock(_mutex);
reset();
deinit();
_ready = false;
diff --git a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp
index 0a4984888d..dbd8e37cb7 100644
--- a/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp
+++ b/sound/softsynth/fmtowns_pc98/towns_pc98_fmsynth.cpp
@@ -907,6 +907,7 @@ bool TownsPC98_FmSynth::init() {
}
void TownsPC98_FmSynth::reset() {
+ Common::StackLock lock(_mutex);
for (int i = 0; i < _numChan; i++) {
for (int ii = 0; ii < 4; ii++)
_chanInternal[i].opr[ii]->reset();