[Scummvm-cvs-logs] SF.net SVN: scummvm:[47457] scummvm/trunk/engines/agos/sound.cpp
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Sat Jan 23 01:04:01 CET 2010
Revision: 47457
http://scummvm.svn.sourceforge.net/scummvm/?rev=47457&view=rev
Author: fingolfin
Date: 2010-01-23 00:04:01 +0000 (Sat, 23 Jan 2010)
Log Message:
-----------
AGOS: Fix memory leak in Sound::loadSfxTable
Modified Paths:
--------------
scummvm/trunk/engines/agos/sound.cpp
Modified: scummvm/trunk/engines/agos/sound.cpp
===================================================================
--- scummvm/trunk/engines/agos/sound.cpp 2010-01-23 00:02:59 UTC (rev 47456)
+++ scummvm/trunk/engines/agos/sound.cpp 2010-01-23 00:04:01 UTC (rev 47457)
@@ -50,12 +50,12 @@
uint32 *_offsets;
Audio::Mixer *_mixer;
bool _freeOffsets;
+ DisposeAfterUse::Flag _disposeFile;
public:
- BaseSound(Audio::Mixer *mixer, File *file, uint32 base, bool bigEndian);
- BaseSound(Audio::Mixer *mixer, File *file, uint32 *offsets);
+ BaseSound(Audio::Mixer *mixer, File *file, uint32 base, bool bigEndian, DisposeAfterUse::Flag disposeFileAfterUse = DisposeAfterUse::YES);
+ BaseSound(Audio::Mixer *mixer, File *file, uint32 *offsets, DisposeAfterUse::Flag disposeFileAfterUse = DisposeAfterUse::YES);
virtual ~BaseSound();
- void close();
void playSound(uint sound, Audio::Mixer::SoundType type, Audio::SoundHandle *handle, bool loop, int vol = 0) {
playSound(sound, sound, type, handle, loop, vol);
@@ -64,8 +64,8 @@
virtual Audio::AudioStream *makeAudioStream(uint sound) = 0;
};
-BaseSound::BaseSound(Audio::Mixer *mixer, File *file, uint32 base, bool bigEndian)
- : _mixer(mixer), _file(file) {
+BaseSound::BaseSound(Audio::Mixer *mixer, File *file, uint32 base, bool bigEndian, DisposeAfterUse::Flag disposeFileAfterUse)
+ : _mixer(mixer), _file(file), _disposeFile(disposeFileAfterUse) {
uint res = 0;
uint32 size;
@@ -98,23 +98,18 @@
_offsets[res] = _file->size();
}
-BaseSound::BaseSound(Audio::Mixer *mixer, File *file, uint32 *offsets)
- : _mixer(mixer), _file(file) {
+BaseSound::BaseSound(Audio::Mixer *mixer, File *file, uint32 *offsets, DisposeAfterUse::Flag disposeFileAfterUse)
+ : _mixer(mixer), _file(file), _disposeFile(disposeFileAfterUse) {
_offsets = offsets;
_freeOffsets = false;
}
-void BaseSound::close() {
- if (_freeOffsets) {
- free(_offsets);
- }
-}
-
BaseSound::~BaseSound() {
if (_freeOffsets)
free(_offsets);
- delete _file;
+ if (_disposeFile == DisposeAfterUse::YES)
+ delete _file;
}
///////////////////////////////////////////////////////////////////////////////
@@ -230,7 +225,8 @@
class WavSound : public BaseSound {
public:
- WavSound(Audio::Mixer *mixer, File *file, uint32 base = 0) : BaseSound(mixer, file, base, false) {}
+ WavSound(Audio::Mixer *mixer, File *file, uint32 base = 0, DisposeAfterUse::Flag disposeFileAfterUse = DisposeAfterUse::YES)
+ : BaseSound(mixer, file, base, false, disposeFileAfterUse) {}
WavSound(Audio::Mixer *mixer, File *file, uint32 *offsets) : BaseSound(mixer, file, offsets) {}
Audio::AudioStream *makeAudioStream(uint sound);
void playSound(uint sound, uint loopSound, Audio::Mixer::SoundType type, Audio::SoundHandle *handle, bool loop, int vol = 0);
@@ -255,8 +251,8 @@
class VocSound : public BaseSound {
const byte _flags;
public:
- VocSound(Audio::Mixer *mixer, File *file, bool isUnsigned, uint32 base = 0, bool bigEndian = false)
- : BaseSound(mixer, file, base, bigEndian), _flags(isUnsigned ? Audio::FLAG_UNSIGNED : 0) {}
+ VocSound(Audio::Mixer *mixer, File *file, bool isUnsigned, uint32 base = 0, bool bigEndian = false, DisposeAfterUse::Flag disposeFileAfterUse = DisposeAfterUse::YES)
+ : BaseSound(mixer, file, base, bigEndian, disposeFileAfterUse), _flags(isUnsigned ? Audio::FLAG_UNSIGNED : 0) {}
Audio::AudioStream *makeAudioStream(uint sound);
void playSound(uint sound, uint loopSound, Audio::Mixer::SoundType type, Audio::SoundHandle *handle, bool loop, int vol = 0);
};
@@ -590,18 +586,12 @@
void Sound::loadSfxTable(File *gameFile, uint32 base) {
stopAll();
- if (_effects)
- _effects->close();
-
- // FIXME: _effects is leaked here! However, we can't just
- // delete it, because this would delete the gameFile object,
- // held by the current _effects object.
-
+ delete _effects;
const bool dataIsUnsigned = false;
if (_vm->getPlatform() == Common::kPlatformWindows)
- _effects = new WavSound(_mixer, gameFile, base);
+ _effects = new WavSound(_mixer, gameFile, base, DisposeAfterUse::NO);
else
- _effects = new VocSound(_mixer, gameFile, dataIsUnsigned, base);
+ _effects = new VocSound(_mixer, gameFile, dataIsUnsigned, base, DisposeAfterUse::NO);
}
// This method is only used by Simon1 Amiga Talkie
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