[Scummvm-cvs-logs] SF.net SVN: scummvm:[54223] scummvm/trunk/engines/toon
sylvaintv at users.sourceforge.net
sylvaintv at users.sourceforge.net
Sat Nov 13 03:44:35 CET 2010
Revision: 54223
http://scummvm.svn.sourceforge.net/scummvm/?rev=54223&view=rev
Author: sylvaintv
Date: 2010-11-13 02:44:34 +0000 (Sat, 13 Nov 2010)
Log Message:
-----------
TOON: Fix more memory leaks
Mainly leaks in audio and animations
Modified Paths:
--------------
scummvm/trunk/engines/toon/anim.h
scummvm/trunk/engines/toon/audio.cpp
scummvm/trunk/engines/toon/audio.h
scummvm/trunk/engines/toon/script_func.cpp
scummvm/trunk/engines/toon/toon.cpp
Modified: scummvm/trunk/engines/toon/anim.h
===================================================================
--- scummvm/trunk/engines/toon/anim.h 2010-11-13 01:37:37 UTC (rev 54222)
+++ scummvm/trunk/engines/toon/anim.h 2010-11-13 02:44:34 UTC (rev 54223)
@@ -172,6 +172,7 @@
class SceneAnimation {
public:
+ AnimationInstance *_originalAnimInstance;
AnimationInstance *_animInstance;
Animation *_animation;
int32 _id;
Modified: scummvm/trunk/engines/toon/audio.cpp
===================================================================
--- scummvm/trunk/engines/toon/audio.cpp 2010-11-13 01:37:37 UTC (rev 54222)
+++ scummvm/trunk/engines/toon/audio.cpp 2010-11-13 02:44:34 UTC (rev 54223)
@@ -132,7 +132,7 @@
}
// no need to delete instance here it will automatically deleted by the mixer is done with it
- _channels[_currentMusicChannel] = new AudioStreamInstance(this, _mixer, srs, true);
+ _channels[_currentMusicChannel] = new AudioStreamInstance(this, _mixer, srs, true, true);
_channels[_currentMusicChannel]->setVolume(_musicMuted ? 0 : 255);
_channels[_currentMusicChannel]->play(true, Audio::Mixer::kMusicSoundType);
}
@@ -159,7 +159,7 @@
stream = _audioPacks[1]->getStream(id);
// no need to delete channel 2, it will be deleted by the mixer when the stream is finished
- _channels[2] = new AudioStreamInstance(this, _mixer, stream);
+ _channels[2] = new AudioStreamInstance(this, _mixer, stream, false, true);
_channels[2]->play(false, Audio::Mixer::kSpeechSoundType);
_channels[2]->setVolume(_voiceMuted ? 0 : 255);
@@ -181,7 +181,7 @@
for (int32 i = 3; i < 16; i++) {
if (!_channels[i]) {
- _channels[i] = new AudioStreamInstance(this, _mixer, stream);
+ _channels[i] = new AudioStreamInstance(this, _mixer, stream, false, true);
_channels[i]->play(false, Audio::Mixer::kSFXSoundType);
_channels[i]->setVolume(_sfxMuted ? 0 : volume);
return i;
@@ -238,7 +238,7 @@
_channels[1]->stop(true);
}
-AudioStreamInstance::AudioStreamInstance(AudioManager *man, Audio::Mixer *mixer, Common::SeekableReadStream *stream , bool looping) {
+AudioStreamInstance::AudioStreamInstance(AudioManager *man, Audio::Mixer *mixer, Common::SeekableReadStream *stream , bool looping, bool deleteFileStreamAtEnd) {
_compBufferSize = 0;
_buffer = NULL;
_bufferMaxSize = 0;
@@ -258,6 +258,7 @@
_man = man;
_looping = looping;
_musicAttenuation = 1000;
+ _deleteFileStream = deleteFileStreamAtEnd;
// preload one packet
if (_totalSize > 0) {
@@ -274,6 +275,10 @@
if (_man)
_man->removeInstance(this);
+
+ if (_deleteFileStream) {
+ delete _file;
+ }
}
int AudioStreamInstance::readBuffer(int16 *buffer, const int numSamples) {
Modified: scummvm/trunk/engines/toon/audio.h
===================================================================
--- scummvm/trunk/engines/toon/audio.h 2010-11-13 01:37:37 UTC (rev 54222)
+++ scummvm/trunk/engines/toon/audio.h 2010-11-13 02:44:34 UTC (rev 54223)
@@ -37,7 +37,7 @@
class AudioStreamInstance : public Audio::AudioStream {
public:
- AudioStreamInstance(AudioManager *man, Audio::Mixer *mixer, Common::SeekableReadStream *stream, bool looping = false);
+ AudioStreamInstance(AudioManager *man, Audio::Mixer *mixer, Common::SeekableReadStream *stream, bool looping = false, bool deleteFileStreamAtEnd = false);
~AudioStreamInstance();
void play(bool fade = false, Audio::Mixer::SoundType soundType = Audio::Mixer::kMusicSoundType);
void stop(bool fade = false);
@@ -92,6 +92,7 @@
bool _looping;
int32 _volume;
int32 _musicAttenuation;
+ bool _deleteFileStream;
};
class AudioStreamPackage {
Modified: scummvm/trunk/engines/toon/script_func.cpp
===================================================================
--- scummvm/trunk/engines/toon/script_func.cpp 2010-11-13 01:37:37 UTC (rev 54222)
+++ scummvm/trunk/engines/toon/script_func.cpp 2010-11-13 02:44:34 UTC (rev 54223)
@@ -916,9 +916,13 @@
if (sceneAnim->_active)
return 0;
+ delete sceneAnim->_animation;
+ delete sceneAnim->_animInstance;
+
sceneAnim->_animation = new Animation(_vm);
sceneAnim->_animation->loadAnimation(GetText(12, state));
sceneAnim->_animInstance = _vm->getAnimationManager()->createNewInstance(kAnimationScene);
+ sceneAnim->_originalAnimInstance = sceneAnim->_animInstance;
sceneAnim->_animInstance->setAnimation(sceneAnim->_animation);
sceneAnim->_animInstance->setVisible((flags & 1) != 0);
sceneAnim->_animInstance->setAnimationRange(stackPos(11), stackPos(11));
@@ -1155,8 +1159,18 @@
SceneAnimation *sceneAnim = _vm->getSceneAnimation(sceneId);
sceneAnim->_active = false;
_vm->getAnimationManager()->removeInstance(sceneAnim->_animInstance);
- sceneAnim->_animation = 0;
- sceneAnim->_animInstance = 0;
+ delete sceneAnim->_animation;
+ sceneAnim->_animation = NULL;
+
+ // see if one character shares this instance
+ for (int32 c = 0; c < 32; c++) {
+ if (_vm->getCharacter(c) && _vm->getCharacter(c)->getAnimationInstance() == sceneAnim->_originalAnimInstance) {
+ _vm->getCharacter(c)->setAnimationInstance(NULL);
+ }
+ }
+ delete sceneAnim->_originalAnimInstance;
+ sceneAnim->_originalAnimInstance = NULL;
+ sceneAnim->_animInstance = NULL;
return 0;
}
Modified: scummvm/trunk/engines/toon/toon.cpp
===================================================================
--- scummvm/trunk/engines/toon/toon.cpp 2010-11-13 01:37:37 UTC (rev 54222)
+++ scummvm/trunk/engines/toon/toon.cpp 2010-11-13 02:44:34 UTC (rev 54223)
@@ -829,8 +829,12 @@
delete _resources;
delete _animationManager;
delete _moviePlayer;
- delete _mainSurface;
+ if(_mainSurface) {
+ _mainSurface->free();
+ delete _mainSurface;
+ }
+
delete[] _finalPalette;
delete[] _backupPalette;
delete[] _additionalPalette1;
@@ -859,6 +863,20 @@
delete _pathFinding;
+
+ for (int32 i = 0; i < 64; i++) {
+ if (_sceneAnimations[i]._active) {
+ // see if one character shares this instance
+ for (int32 c = 0; c < 32; c++) {
+ if (_characters[c] && _characters[c]->getAnimationInstance() == _sceneAnimations[i]._animInstance) {
+ _characters[c]->setAnimationInstance(0);
+ }
+ }
+ delete _sceneAnimations[i]._originalAnimInstance;
+ delete _sceneAnimations[i]._animation;
+ }
+ }
+
for (int32 i = 0; i < 32; i++)
delete _characters[i];
@@ -869,6 +887,7 @@
delete _inventoryIconSlots;
//delete _genericTexts;
delete _audioManager;
+ delete _gameState;
unloadToonDat();
@@ -1642,8 +1661,18 @@
delete _sceneAnimations[i]._animation;
_sceneAnimations[i]._active = false;
_animationManager->removeInstance(_sceneAnimations[i]._animInstance);
- _sceneAnimations[i]._animInstance = 0;
- _sceneAnimations[i]._animation = 0;
+
+ // see if one character shares this instance
+ for (int32 c = 0; c < 32; c++) {
+ if (_characters[c] && _characters[c]->getAnimationInstance() == _sceneAnimations[i]._animInstance) {
+ _characters[c]->setAnimationInstance(NULL);
+ }
+ }
+
+ delete _sceneAnimations[i]._originalAnimInstance;
+ _sceneAnimations[i]._animInstance = NULL;
+ _sceneAnimations[i]._animation = NULL;
+ _sceneAnimations[i]._originalAnimInstance = NULL;
}
}
for (int32 i = 0; i < 64; i++) {
@@ -4557,6 +4586,8 @@
res[0] += DATAALIGNMENT;
} else {
in.read(pos, entryLen);
+ free(pos);
+ continue;
}
pos += DATAALIGNMENT;
@@ -4637,6 +4668,7 @@
_animInstance = vm->getAnimationManager()->createNewInstance(kAnimationScene);
_animInstance->load(stream);
vm->getAnimationManager()->addInstance(_animInstance);
+ _originalAnimInstance = _animInstance;
}
// load animation if any
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list