mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-10 21:03:31 +00:00
TSAGE: Tweaks to the destructor sequence to fix crashes
This commit is contained in:
parent
fd4c55850d
commit
815c1537b7
@ -103,6 +103,7 @@ Globals::Globals() :
|
|||||||
Globals::~Globals() {
|
Globals::~Globals() {
|
||||||
delete _inventory;
|
delete _inventory;
|
||||||
delete _game;
|
delete _game;
|
||||||
|
_globals = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Globals::reset() {
|
void Globals::reset() {
|
||||||
|
@ -29,7 +29,12 @@
|
|||||||
|
|
||||||
namespace tSage {
|
namespace tSage {
|
||||||
|
|
||||||
|
static SoundManager *_soundManager = NULL;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
SoundManager::SoundManager() {
|
SoundManager::SoundManager() {
|
||||||
|
_soundManager = this;
|
||||||
__sndmgrReady = false;
|
__sndmgrReady = false;
|
||||||
_minVersion = 0x102;
|
_minVersion = 0x102;
|
||||||
_maxVersion = 0x10A;
|
_maxVersion = 0x10A;
|
||||||
@ -62,6 +67,8 @@ SoundManager::~SoundManager() {
|
|||||||
}
|
}
|
||||||
_sfTerminate();
|
_sfTerminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_soundManager = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundManager::postInit() {
|
void SoundManager::postInit() {
|
||||||
@ -284,9 +291,9 @@ void SoundManager::checkResVersion(const byte *soundData) {
|
|||||||
int maxVersion = READ_LE_UINT16(soundData + 4);
|
int maxVersion = READ_LE_UINT16(soundData + 4);
|
||||||
int minVersion = READ_LE_UINT16(soundData + 6);
|
int minVersion = READ_LE_UINT16(soundData + 6);
|
||||||
|
|
||||||
if (_globals->_soundManager._minVersion < minVersion)
|
if (_soundManager->_minVersion < minVersion)
|
||||||
error("Attempt to play/prime sound resource that is too new");
|
error("Attempt to play/prime sound resource that is too new");
|
||||||
if (_globals->_soundManager._minVersion > maxVersion)
|
if (_soundManager->_minVersion > maxVersion)
|
||||||
error("Attempt to play/prime sound resource that is too old");
|
error("Attempt to play/prime sound resource that is too old");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -393,7 +400,7 @@ void SoundManager::_sfUpdateVoiceStructs() {
|
|||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void SoundManager::saveNotifier(bool postFlag) {
|
void SoundManager::saveNotifier(bool postFlag) {
|
||||||
_globals->_soundManager.saveNotifierProc(postFlag);
|
_soundManager->saveNotifierProc(postFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundManager::saveNotifierProc(bool postFlag) {
|
void SoundManager::saveNotifierProc(bool postFlag) {
|
||||||
@ -401,7 +408,7 @@ void SoundManager::saveNotifierProc(bool postFlag) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SoundManager::loadNotifier(bool postFlag) {
|
void SoundManager::loadNotifier(bool postFlag) {
|
||||||
_globals->_soundManager.loadNotifierProc(postFlag);
|
_soundManager->loadNotifierProc(postFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundManager::loadNotifierProc(bool postFlag) {
|
void SoundManager::loadNotifierProc(bool postFlag) {
|
||||||
@ -416,7 +423,7 @@ void SoundManager::listenerSynchronize(Serializer &s) {
|
|||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
SoundManager &SoundManager::sfManager() {
|
SoundManager &SoundManager::sfManager() {
|
||||||
return _globals->_soundManager;
|
return *_soundManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundManager::_soSetTimeIndex(int timeIndex) {
|
void SoundManager::_soSetTimeIndex(int timeIndex) {
|
||||||
@ -427,7 +434,7 @@ int SoundManager::_sfDetermineGroup(const byte *soundData) {
|
|||||||
const byte *p = soundData + READ_LE_UINT16(soundData + 8);
|
const byte *p = soundData + READ_LE_UINT16(soundData + 8);
|
||||||
uint32 v;
|
uint32 v;
|
||||||
while ((v = READ_LE_UINT32(p)) != 0) {
|
while ((v = READ_LE_UINT32(p)) != 0) {
|
||||||
if ((v & _globals->_soundManager._groupMask) == v)
|
if ((v & _soundManager->_groupMask) == v)
|
||||||
return v;
|
return v;
|
||||||
|
|
||||||
p += 6 + (READ_LE_UINT16(p + 4) * 4);
|
p += 6 + (READ_LE_UINT16(p + 4) * 4);
|
||||||
@ -452,9 +459,9 @@ void SoundManager::_sfRemoveFromPlayList(Sound *sound) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool SoundManager::_sfIsOnPlayList(Sound *sound) {
|
bool SoundManager::_sfIsOnPlayList(Sound *sound) {
|
||||||
++_globals->_soundManager._suspendCtr;
|
++_soundManager->_suspendCtr;
|
||||||
bool result = contains(_globals->_soundManager._playList, sound);
|
bool result = contains(_soundManager->_playList, sound);
|
||||||
--_globals->_soundManager._suspendCtr;
|
--_soundManager->_suspendCtr;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -640,7 +647,7 @@ void SoundManager::_sfDereferenceAll() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SoundManager::_sfUpdatePriority(Sound *sound) {
|
void SoundManager::_sfUpdatePriority(Sound *sound) {
|
||||||
++_globals->_soundManager._suspendCtr;
|
++_soundManager->_suspendCtr;
|
||||||
|
|
||||||
int tempPriority = (sound->_priority2 == 255) ? sound->_soundPriority : sound->_priority;
|
int tempPriority = (sound->_priority2 == 255) ? sound->_soundPriority : sound->_priority;
|
||||||
if (sound->_priority != tempPriority) {
|
if (sound->_priority != tempPriority) {
|
||||||
@ -651,7 +658,7 @@ void SoundManager::_sfUpdatePriority(Sound *sound) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
--_globals->_soundManager._suspendCtr;
|
--_soundManager->_suspendCtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundManager::_sfUpdateLoop(Sound *sound) {
|
void SoundManager::_sfUpdateLoop(Sound *sound) {
|
||||||
@ -665,11 +672,11 @@ void SoundManager::_sfSetMasterVol(int volume) {
|
|||||||
if (volume > 127)
|
if (volume > 127)
|
||||||
volume = 127;
|
volume = 127;
|
||||||
|
|
||||||
if (volume != _globals->_soundManager._volume) {
|
if (volume != _soundManager->_volume) {
|
||||||
_globals->_soundManager._volume = volume;
|
_soundManager->_volume = volume;
|
||||||
|
|
||||||
for (Common::List<SoundDriver *>::iterator i = _globals->_soundManager._installedDrivers.begin();
|
for (Common::List<SoundDriver *>::iterator i = _soundManager->_installedDrivers.begin();
|
||||||
i != _globals->_soundManager._installedDrivers.end(); ++i) {
|
i != _soundManager->_installedDrivers.end(); ++i) {
|
||||||
(*i)->setMasterVolume(volume);
|
(*i)->setMasterVolume(volume);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -709,9 +716,9 @@ void SoundManager::_sfTerminate() {
|
|||||||
void SoundManager::_sfExtractGroupMask() {
|
void SoundManager::_sfExtractGroupMask() {
|
||||||
uint32 mask = 0;
|
uint32 mask = 0;
|
||||||
for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx)
|
for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx)
|
||||||
mask |= _globals->_soundManager._groupList[idx];
|
mask |= _soundManager->_groupList[idx];
|
||||||
|
|
||||||
_globals->_soundManager._groupMask = mask;
|
_soundManager->_groupMask = mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SoundManager::_sfInstallDriver(SoundDriver *driver) {
|
bool SoundManager::_sfInstallDriver(SoundDriver *driver) {
|
||||||
@ -775,7 +782,7 @@ bool SoundManager::_sfDoRemoveFromPlayList(Sound *sound) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SoundManager::_sfDoUpdateVolume(Sound *sound) {
|
void SoundManager::_sfDoUpdateVolume(Sound *sound) {
|
||||||
++_globals->_soundManager._suspendCtr;
|
++_soundManager->_suspendCtr;
|
||||||
|
|
||||||
for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) {
|
for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) {
|
||||||
VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex];
|
VoiceStruct *vs = sfManager()._voiceStructPtrs[voiceIndex];
|
||||||
@ -800,7 +807,7 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
--_globals->_soundManager._suspendCtr;
|
--_soundManager->_suspendCtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
@ -839,11 +846,11 @@ Sound::~Sound() {
|
|||||||
|
|
||||||
void Sound::play(int soundNum) {
|
void Sound::play(int soundNum) {
|
||||||
prime(soundNum);
|
prime(soundNum);
|
||||||
_globals->_soundManager.addToPlayList(this);
|
_soundManager->addToPlayList(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound::stop() {
|
void Sound::stop() {
|
||||||
_globals->_soundManager.removeFromPlayList(this);
|
_soundManager->removeFromPlayList(this);
|
||||||
_unPrime();
|
_unPrime();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -867,11 +874,11 @@ void Sound::_prime(int soundNum, bool queFlag) {
|
|||||||
_isEmpty = false;
|
_isEmpty = false;
|
||||||
_field26E = NULL;
|
_field26E = NULL;
|
||||||
byte *soundData = _resourceManager->getResource(RES_SOUND, soundNum, 0);
|
byte *soundData = _resourceManager->getResource(RES_SOUND, soundNum, 0);
|
||||||
_globals->_soundManager.checkResVersion(soundData);
|
_soundManager->checkResVersion(soundData);
|
||||||
_groupNum = _globals->_soundManager.determineGroup(soundData);
|
_groupNum = _soundManager->determineGroup(soundData);
|
||||||
_soundPriority = _globals->_soundManager.extractPriority(soundData);
|
_soundPriority = _soundManager->extractPriority(soundData);
|
||||||
_loop = _globals->_soundManager.extractLoop(soundData);
|
_loop = _soundManager->extractLoop(soundData);
|
||||||
_globals->_soundManager.extractTrackInfo(&_trackInfo, soundData, _groupNum);
|
_soundManager->extractTrackInfo(&_trackInfo, soundData, _groupNum);
|
||||||
|
|
||||||
for (int idx = 0; idx < _trackInfo._count; ++idx) {
|
for (int idx = 0; idx < _trackInfo._count; ++idx) {
|
||||||
_trackInfo._handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo._rlbList[idx]);
|
_trackInfo._handleList[idx] = _resourceManager->getResource(RES_SOUND, soundNum, _trackInfo._rlbList[idx]);
|
||||||
@ -890,7 +897,7 @@ void Sound::_prime(int soundNum, bool queFlag) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (queFlag)
|
if (queFlag)
|
||||||
_globals->_soundManager.addToSoundList(this);
|
_soundManager->addToSoundList(this);
|
||||||
|
|
||||||
_primed = true;
|
_primed = true;
|
||||||
}
|
}
|
||||||
@ -908,7 +915,7 @@ void Sound::_unPrime() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_trackInfo._count = 0;
|
_trackInfo._count = 0;
|
||||||
_globals->_soundManager.removeFromSoundList(this);
|
_soundManager->removeFromSoundList(this);
|
||||||
|
|
||||||
_primed = false;
|
_primed = false;
|
||||||
_stopFlag = false;
|
_stopFlag = false;
|
||||||
@ -942,11 +949,11 @@ void Sound::go() {
|
|||||||
if (!_primed)
|
if (!_primed)
|
||||||
error("Attempt to execute Sound::go() on an unprimed Sound");
|
error("Attempt to execute Sound::go() on an unprimed Sound");
|
||||||
|
|
||||||
_globals->_soundManager.addToPlayList(this);
|
_soundManager->addToPlayList(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound::halt(void) {
|
void Sound::halt(void) {
|
||||||
_globals->_soundManager.removeFromPlayList(this);
|
_soundManager->removeFromPlayList(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Sound::getSoundNum() const {
|
int Sound::getSoundNum() const {
|
||||||
@ -954,7 +961,7 @@ int Sound::getSoundNum() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Sound::isPlaying() {
|
bool Sound::isPlaying() {
|
||||||
return _globals->_soundManager.isOnPlayList(this);
|
return _soundManager->isOnPlayList(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Sound::isPrimed() const {
|
bool Sound::isPrimed() const {
|
||||||
@ -970,31 +977,31 @@ bool Sound::isMuted() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Sound::pause(bool flag) {
|
void Sound::pause(bool flag) {
|
||||||
_globals->_soundManager.suspendSoundServer();
|
_soundManager->suspendSoundServer();
|
||||||
|
|
||||||
if (flag)
|
if (flag)
|
||||||
++_pauseCtr;
|
++_pauseCtr;
|
||||||
else if (_pauseCtr > 0)
|
else if (_pauseCtr > 0)
|
||||||
--_pauseCtr;
|
--_pauseCtr;
|
||||||
|
|
||||||
_globals->_soundManager.rethinkVoiceTypes();
|
_soundManager->rethinkVoiceTypes();
|
||||||
_globals->_soundManager.restartSoundServer();
|
_soundManager->restartSoundServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound::mute(bool flag) {
|
void Sound::mute(bool flag) {
|
||||||
_globals->_soundManager.suspendSoundServer();
|
_soundManager->suspendSoundServer();
|
||||||
|
|
||||||
if (flag)
|
if (flag)
|
||||||
++_muteCtr;
|
++_muteCtr;
|
||||||
else if (_muteCtr > 0)
|
else if (_muteCtr > 0)
|
||||||
--_muteCtr;
|
--_muteCtr;
|
||||||
|
|
||||||
_globals->_soundManager.rethinkVoiceTypes();
|
_soundManager->rethinkVoiceTypes();
|
||||||
_globals->_soundManager.restartSoundServer();
|
_soundManager->restartSoundServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound::fade(int volume1, int volume2, int volume3, int volume4) {
|
void Sound::fade(int volume1, int volume2, int volume3, int volume4) {
|
||||||
_globals->_soundManager.suspendSoundServer();
|
_soundManager->suspendSoundServer();
|
||||||
|
|
||||||
if (volume1 > 127)
|
if (volume1 > 127)
|
||||||
volume1 = 127;
|
volume1 = 127;
|
||||||
@ -1009,7 +1016,7 @@ void Sound::fade(int volume1, int volume2, int volume3, int volume4) {
|
|||||||
_volume5 = 0;
|
_volume5 = 0;
|
||||||
_volume4 = volume4;
|
_volume4 = volume4;
|
||||||
|
|
||||||
_globals->_soundManager.restartSoundServer();
|
_soundManager->restartSoundServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound::setTimeIndex(uint32 timeIndex) {
|
void Sound::setTimeIndex(uint32 timeIndex) {
|
||||||
@ -1039,7 +1046,7 @@ void Sound::setVol(int volume) {
|
|||||||
if (_volume != volume) {
|
if (_volume != volume) {
|
||||||
_volume = volume;
|
_volume = volume;
|
||||||
if (isPlaying())
|
if (isPlaying())
|
||||||
_globals->_soundManager.updateSoundVol(this);
|
_soundManager->updateSoundVol(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1051,12 +1058,12 @@ void Sound::setPri(int priority) {
|
|||||||
if (priority > 127)
|
if (priority > 127)
|
||||||
priority = 127;
|
priority = 127;
|
||||||
_priority2 = priority;
|
_priority2 = priority;
|
||||||
_globals->_soundManager.updateSoundPri(this);
|
_soundManager->updateSoundPri(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound::setLoop(bool flag) {
|
void Sound::setLoop(bool flag) {
|
||||||
_loopFlag2 = flag;
|
_loopFlag2 = flag;
|
||||||
_globals->_soundManager.updateSoundLoop(this);
|
_soundManager->updateSoundLoop(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Sound::getPri() const {
|
int Sound::getPri() const {
|
||||||
|
@ -90,7 +90,6 @@ void TSageEngine::deinitialise() {
|
|||||||
delete _globals;
|
delete _globals;
|
||||||
delete _resourceManager;
|
delete _resourceManager;
|
||||||
delete _saver;
|
delete _saver;
|
||||||
_globals = NULL;
|
|
||||||
_resourceManager = NULL;
|
_resourceManager = NULL;
|
||||||
_saver = NULL;
|
_saver = NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user