[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