aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorEinar Johan Trøan Sømåen2012-06-27 23:32:57 +0200
committerEinar Johan Trøan Sømåen2012-06-27 23:32:57 +0200
commite49b43f7a9bbbe7bda7c4107b0279bf2add1aaaa (patch)
tree9aa69692a5b4886840df7b9f12a85dfb7b169669 /engines
parentae714dc076def8efb6448c1d39058fbabb0e096f (diff)
downloadscummvm-rg350-e49b43f7a9bbbe7bda7c4107b0279bf2add1aaaa.tar.gz
scummvm-rg350-e49b43f7a9bbbe7bda7c4107b0279bf2add1aaaa.tar.bz2
scummvm-rg350-e49b43f7a9bbbe7bda7c4107b0279bf2add1aaaa.zip
WINTERMUTE: Fix almost all of the memory leaks that were left.
Diffstat (limited to 'engines')
-rw-r--r--engines/wintermute/Base/BFileManager.cpp23
-rw-r--r--engines/wintermute/Base/BFileManager.h1
-rw-r--r--engines/wintermute/Base/BPersistMgr.cpp17
-rw-r--r--engines/wintermute/Base/BPersistMgr.h1
-rw-r--r--engines/wintermute/Base/BSoundBuffer.cpp15
-rw-r--r--engines/wintermute/Base/BSoundMgr.cpp4
-rw-r--r--engines/wintermute/Base/BSurfaceSDL.cpp6
-rw-r--r--engines/wintermute/Base/BSurfaceStorage.cpp7
-rw-r--r--engines/wintermute/Base/scriptables/ScScript.cpp2
-rw-r--r--engines/wintermute/Sys/SysClassRegistry.cpp2
-rw-r--r--engines/wintermute/video/VidTheoraPlayer.cpp5
-rw-r--r--engines/wintermute/video/decoders/theora_decoder.cpp2
12 files changed, 57 insertions, 28 deletions
diff --git a/engines/wintermute/Base/BFileManager.cpp b/engines/wintermute/Base/BFileManager.cpp
index 81434dd176..b346646841 100644
--- a/engines/wintermute/Base/BFileManager.cpp
+++ b/engines/wintermute/Base/BFileManager.cpp
@@ -763,6 +763,15 @@ CBFileEntry *CBFileManager::getPackageEntry(const Common::String &Filename) {
return ret;
}
+bool CBFileManager::hasFile(const Common::String &filename) {
+ //TODO: Do this in a much simpler fashion
+ Common::SeekableReadStream *stream = openFile(filename, true, false);
+ if (!stream) {
+ return false;
+ }
+ delete stream;
+ return true;
+}
//////////////////////////////////////////////////////////////////////////
Common::SeekableReadStream *CBFileManager::openFile(const Common::String &filename, bool AbsPathWarning, bool keepTrackOf) {
@@ -801,16 +810,18 @@ HRESULT CBFileManager::closeFile(Common::SeekableReadStream *File) {
Common::SeekableReadStream *CBFileManager::openFileRaw(const Common::String &Filename) {
restoreCurrentDir();
+ Common::SeekableReadStream *ret = NULL;
+
if (scumm_strnicmp(Filename.c_str(), "savegame:", 9) == 0) {
CBSaveThumbFile *SaveThumbFile = new CBSaveThumbFile(Game);
- if (SUCCEEDED(SaveThumbFile->open(Filename))) return SaveThumbFile->getMemStream();
- else {
- delete SaveThumbFile;
- return NULL;
- }
+ if (SUCCEEDED(SaveThumbFile->open(Filename))) {
+ ret = SaveThumbFile->getMemStream();
+ }
+ delete SaveThumbFile;
+ return ret;
}
- Common::SeekableReadStream *ret = NULL;
+
ret = openDiskFile(Filename, this);
if (ret) return ret;
diff --git a/engines/wintermute/Base/BFileManager.h b/engines/wintermute/Base/BFileManager.h
index fdeb9b732d..0ca9090a04 100644
--- a/engines/wintermute/Base/BFileManager.h
+++ b/engines/wintermute/Base/BFileManager.h
@@ -50,6 +50,7 @@ public:
bool getFullPath(const Common::String &filename, char *fullname);
Common::SeekableReadStream *openFileRaw(const Common::String &filename);
HRESULT closeFile(Common::SeekableReadStream *File);
+ bool hasFile(const Common::String &filename);
Common::SeekableReadStream *openFile(const Common::String &filename, bool absPathWarning = true, bool keepTrackOf = true);
CBFileEntry *getPackageEntry(const Common::String &filename);
Common::File *openSingleFile(const Common::String &name);
diff --git a/engines/wintermute/Base/BPersistMgr.cpp b/engines/wintermute/Base/BPersistMgr.cpp
index 8b037db926..74c9fbd422 100644
--- a/engines/wintermute/Base/BPersistMgr.cpp
+++ b/engines/wintermute/Base/BPersistMgr.cpp
@@ -270,7 +270,7 @@ HRESULT CBPersistMgr::readHeader(const Common::String &filename) {
if (Magic == SAVE_MAGIC_2) {
_savedVerBuild = (byte)getDWORD();
- _savedName = getString();
+ _savedName = getStringObj();
// load thumbnail
_thumbnailDataSize = getDWORD();
@@ -393,6 +393,21 @@ void CBPersistMgr::putString(const Common::String &val) {
}
}
+Common::String CBPersistMgr::getStringObj() {
+ uint32 len = _loadStream->readUint32LE();
+ char *ret = new char[len + 1];
+ _loadStream->read(ret, len);
+ ret[len] = '\0';
+ delete[] ret;
+
+ Common::String retString = ret;
+
+ if (ret == "(null)") {
+ retString = "";
+ }
+
+ return retString;
+}
//////////////////////////////////////////////////////////////////////////
char *CBPersistMgr::getString() {
diff --git a/engines/wintermute/Base/BPersistMgr.h b/engines/wintermute/Base/BPersistMgr.h
index 79ec12214a..90dcb12c75 100644
--- a/engines/wintermute/Base/BPersistMgr.h
+++ b/engines/wintermute/Base/BPersistMgr.h
@@ -55,6 +55,7 @@ public:
uint32 getDWORD();
void putDWORD(uint32 val);
char *getString();
+ Common::String getStringObj();
void putString(const Common::String &val);
float getFloat();
void putFloat(float val);
diff --git a/engines/wintermute/Base/BSoundBuffer.cpp b/engines/wintermute/Base/BSoundBuffer.cpp
index a60b78ee33..80753c5f50 100644
--- a/engines/wintermute/Base/BSoundBuffer.cpp
+++ b/engines/wintermute/Base/BSoundBuffer.cpp
@@ -101,19 +101,18 @@ HRESULT CBSoundBuffer::loadFromFile(const char *Filename, bool ForceReload) {
_stream = NULL;
}
#endif
- delete _stream;
- _stream = NULL;
-
- if (_file) Game->_fileManager->closeFile(_file);
+ // If we already had a file, delete it.
+ delete _file;
- _file = Game->_fileManager->openFile(Filename);
+ // Load a file, but avoid having the File-manager handle the disposal of it.
+ _file = Game->_fileManager->openFile(Filename, true, false);
if (!_file) {
Game->LOG(0, "Error opening sound file '%s'", Filename);
return E_FAIL;
}
Common::String strFilename(Filename);
if (strFilename.hasSuffix(".ogg")) {
- _stream = Audio::makeVorbisStream(_file, DisposeAfterUse::NO);
+ _stream = Audio::makeVorbisStream(_file, DisposeAfterUse::YES);
} else if (strFilename.hasSuffix(".wav")) {
warning("BSoundBuffer::LoadFromFile - WAVE not supported yet for %s", Filename);
//_stream = Audio::makeWAVStream(_file, DisposeAfterUse::NO);
@@ -193,10 +192,10 @@ HRESULT CBSoundBuffer::play(bool looping, uint32 startSample) {
}
if (_stream) {
if (looping) {
- Audio::AudioStream *loopStream = new Audio::LoopingAudioStream(_stream, 0, DisposeAfterUse::NO);
+ Audio::AudioStream *loopStream = new Audio::LoopingAudioStream(_stream, 0, DisposeAfterUse::YES);
g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, _handle, loopStream, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::YES);
} else {
- g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, _handle, _stream, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
+ g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, _handle, _stream, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::YES);
}
}
return S_OK;
diff --git a/engines/wintermute/Base/BSoundMgr.cpp b/engines/wintermute/Base/BSoundMgr.cpp
index 1702bfb8d1..ff5858c91e 100644
--- a/engines/wintermute/Base/BSoundMgr.cpp
+++ b/engines/wintermute/Base/BSoundMgr.cpp
@@ -138,10 +138,8 @@ CBSoundBuffer *CBSoundMgr::addSound(const char *Filename, TSoundType Type, bool
AnsiString name = PathUtil::GetFileNameWithoutExtension(Filename);
AnsiString newFile = PathUtil::Combine(path, name + "ogg");
- Common::SeekableReadStream *file = Game->_fileManager->openFile(newFile.c_str());
- if (file) {
+ if (Game->_fileManager->hasFile(newFile)) {
Filename = newFile.c_str();
- Game->_fileManager->closeFile(file);
}
}
diff --git a/engines/wintermute/Base/BSurfaceSDL.cpp b/engines/wintermute/Base/BSurfaceSDL.cpp
index 1a86bf8a90..b3757a2fb5 100644
--- a/engines/wintermute/Base/BSurfaceSDL.cpp
+++ b/engines/wintermute/Base/BSurfaceSDL.cpp
@@ -70,11 +70,10 @@ CBSurfaceSDL::~CBSurfaceSDL() {
delete _scaledSurface;
_scaledSurface = NULL;
}
-#if 0
- if (_texture) SDL_DestroyTexture(_texture);
+
delete[] _alphaMask;
_alphaMask = NULL;
-#endif
+
Game->AddMem(-_width * _height * 4);
}
@@ -151,6 +150,7 @@ HRESULT CBSurfaceSDL::create(const char *filename, bool default_ck, byte ck_red,
// convert 32-bit BMPs to 24-bit or they appear totally transparent (does any app actually write alpha in BMP properly?)
// Well, actually, we don't convert via 24-bit as the color-key application overwrites the Alpha-channel anyhow.
+ delete _surface;
if (strFileName.hasSuffix(".bmp") && image->getSurface()->format.bytesPerPixel == 4) {
_surface = image->getSurface()->convertTo(g_system->getScreenFormat(), image->getPalette());
TransparentSurface trans(*_surface);
diff --git a/engines/wintermute/Base/BSurfaceStorage.cpp b/engines/wintermute/Base/BSurfaceStorage.cpp
index 8d30b01d19..53fd036d49 100644
--- a/engines/wintermute/Base/BSurfaceStorage.cpp
+++ b/engines/wintermute/Base/BSurfaceStorage.cpp
@@ -105,20 +105,17 @@ CBSurface *CBSurfaceStorage::addSurface(const char *Filename, bool default_ck, b
}
}
- Common::SeekableReadStream *File = Game->_fileManager->openFile(Filename);
- if (!File) {
+ if (!Game->_fileManager->hasFile(Filename)) {
if (Filename) Game->LOG(0, "Missing image: '%s'", Filename);
if (Game->_dEBUG_DebugMode)
return addSurface("invalid_debug.bmp", default_ck, ck_red, ck_green, ck_blue, LifeTime, KeepLoaded);
else
return addSurface("invalid.bmp", default_ck, ck_red, ck_green, ck_blue, LifeTime, KeepLoaded);
- } else Game->_fileManager->closeFile(File);
-
+ }
CBSurface *surface;
surface = new CBSurfaceSDL(Game);
-
if (!surface) return NULL;
if (FAILED(surface->create(Filename, default_ck, ck_red, ck_green, ck_blue, LifeTime, KeepLoaded))) {
diff --git a/engines/wintermute/Base/scriptables/ScScript.cpp b/engines/wintermute/Base/scriptables/ScScript.cpp
index 4060ad8472..01827b378e 100644
--- a/engines/wintermute/Base/scriptables/ScScript.cpp
+++ b/engines/wintermute/Base/scriptables/ScScript.cpp
@@ -424,6 +424,8 @@ void CScScript::cleanup() {
_waitScript = NULL;
_parentScript = NULL; // ref only
+
+ delete _scriptStream;
}
diff --git a/engines/wintermute/Sys/SysClassRegistry.cpp b/engines/wintermute/Sys/SysClassRegistry.cpp
index 5ac5cb2ccf..540008571f 100644
--- a/engines/wintermute/Sys/SysClassRegistry.cpp
+++ b/engines/wintermute/Sys/SysClassRegistry.cpp
@@ -214,7 +214,7 @@ HRESULT CSysClassRegistry::loadTable(CBGame *Game, CBPersistMgr *persistMgr) {
Game->DisplayContentSimple();
Game->_renderer->flip();
- char *className = persistMgr->getString();
+ Common::String className = persistMgr->getStringObj();
NameMap::iterator mapIt = _nameMap.find(className);
if (mapIt != _nameMap.end())(*mapIt)._value->loadTable(Game, persistMgr);
}
diff --git a/engines/wintermute/video/VidTheoraPlayer.cpp b/engines/wintermute/video/VidTheoraPlayer.cpp
index aa0ace09c8..219cc295d9 100644
--- a/engines/wintermute/video/VidTheoraPlayer.cpp
+++ b/engines/wintermute/video/VidTheoraPlayer.cpp
@@ -108,6 +108,11 @@ CVidTheoraPlayer::~CVidTheoraPlayer(void) {
//////////////////////////////////////////////////////////////////////////
void CVidTheoraPlayer::cleanup() {
+ if (_file) {
+ Game->_fileManager->closeFile(_file);
+ _file = NULL;
+ }
+
_surface.free();
delete _theoraDecoder;
_theoraDecoder = NULL;
diff --git a/engines/wintermute/video/decoders/theora_decoder.cpp b/engines/wintermute/video/decoders/theora_decoder.cpp
index 647d9aff08..a8e403c97c 100644
--- a/engines/wintermute/video/decoders/theora_decoder.cpp
+++ b/engines/wintermute/video/decoders/theora_decoder.cpp
@@ -456,7 +456,7 @@ bool TheoraDecoder::queueAudio() {
#ifdef SCUMM_LITTLE_ENDIAN
flags |= Audio::FLAG_LITTLE_ENDIAN;
#endif
- _audStream->queueBuffer((byte *)_audiobuf, AUDIOFD_FRAGSIZE, DisposeAfterUse::NO, flags);
+ _audStream->queueBuffer((byte *)_audiobuf, AUDIOFD_FRAGSIZE, DisposeAfterUse::YES, flags);
// The audio mixer is now responsible for the old audio buffer.
// We need to create a new one.