diff options
author | Paul Gilbert | 2010-06-14 05:27:54 +0000 |
---|---|---|
committer | Paul Gilbert | 2010-06-14 05:27:54 +0000 |
commit | 6fb462e6b05c5ead3fefe97e18d31f4835d5e321 (patch) | |
tree | 5f0c9833b33af9cef0a837998f5d1ce41bf7045b /engines | |
parent | 466a151744618f89d6a0b53d23189af048d88831 (diff) | |
download | scummvm-rg350-6fb462e6b05c5ead3fefe97e18d31f4835d5e321.tar.gz scummvm-rg350-6fb462e6b05c5ead3fefe97e18d31f4835d5e321.tar.bz2 scummvm-rg350-6fb462e6b05c5ead3fefe97e18d31f4835d5e321.zip |
Further memory leak fixes reported by Valgrind
svn-id: r49644
Diffstat (limited to 'engines')
-rw-r--r-- | engines/m4/animation.cpp | 1 | ||||
-rw-r--r-- | engines/m4/events.cpp | 4 | ||||
-rw-r--r-- | engines/m4/events.h | 1 | ||||
-rw-r--r-- | engines/m4/globals.cpp | 26 | ||||
-rw-r--r-- | engines/m4/globals.h | 2 | ||||
-rw-r--r-- | engines/m4/m4.cpp | 11 | ||||
-rw-r--r-- | engines/m4/m4.h | 10 | ||||
-rw-r--r-- | engines/m4/mads_menus.cpp | 7 | ||||
-rw-r--r-- | engines/m4/scene.cpp | 1 | ||||
-rw-r--r-- | engines/m4/sound.cpp | 38 | ||||
-rw-r--r-- | engines/m4/sound.h | 2 |
11 files changed, 58 insertions, 45 deletions
diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 1d9b1161c2..a9d52a54c1 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -328,7 +328,6 @@ void MadsAnimation::update() { // Handle starting any sound for this frame AnimMiscEntry &misc = _miscEntries[_currentFrame]; -printf("frame %d delay %d\n", _currentFrame, misc.numTicks); if (misc.soundNum) _vm->_sound->playSound(misc.soundNum); diff --git a/engines/m4/events.cpp b/engines/m4/events.cpp index c0ca412f11..65378c5d6a 100644 --- a/engines/m4/events.cpp +++ b/engines/m4/events.cpp @@ -57,6 +57,10 @@ Events::Events(MadsM4Engine *vm) : _vm(vm) { _console = new MadsConsole(_madsVm); } +Events::~Events() { + delete _console; +} + M4EventType Events::handleEvents() { static int oldX = -1, oldY = -1; static uint32 dclickTime = 0; diff --git a/engines/m4/events.h b/engines/m4/events.h index 43b61c8f0d..1c1418d5f8 100644 --- a/engines/m4/events.h +++ b/engines/m4/events.h @@ -78,6 +78,7 @@ private: public: bool quitFlag; Events(MadsM4Engine *vm); + virtual ~Events(); Common::Event &event() { return _event; } Common::EventType type() { return _event.type; } diff --git a/engines/m4/globals.cpp b/engines/m4/globals.cpp index 1768c71787..e63504ad73 100644 --- a/engines/m4/globals.cpp +++ b/engines/m4/globals.cpp @@ -351,16 +351,16 @@ void MadsGlobals::loadMadsMessagesInfo() { //printf("%i messages\n", count); for (int i = 0; i < count; i++) { - MessageItem *curMessage = new MessageItem(); - curMessage->id = messageS->readUint32LE(); - curMessage->offset = messageS->readUint32LE(); - curMessage->uncompSize = messageS->readUint16LE(); + MessageItem curMessage; + curMessage.id = messageS->readUint32LE(); + curMessage.offset = messageS->readUint32LE(); + curMessage.uncompSize = messageS->readUint16LE(); if (i > 0) - _madsMessages[i - 1]->compSize = curMessage->offset - _madsMessages[i - 1]->offset; + _madsMessages[i - 1].compSize = curMessage.offset - _madsMessages[i - 1].offset; if (i == count - 1) - curMessage->compSize = messageS->size() - curMessage->offset; + curMessage.compSize = messageS->size() - curMessage.offset; //printf("id: %i, offset: %i, uncomp size: %i\n", curMessage->id, curMessage->offset, curMessage->uncompSize); _madsMessages.push_back(curMessage); @@ -382,7 +382,7 @@ void MadsGlobals::loadMadsObjects() { int MadsGlobals::messageIndexOf(uint32 messageId) { for (uint i = 0; i < _madsMessages.size(); ++i) { - if (_madsMessages[i]->id == messageId) + if (_madsMessages[i].id == messageId) return i; } return -1; @@ -395,15 +395,15 @@ const char *MadsGlobals::loadMessage(uint index) { } FabDecompressor fab; - byte *compData = new byte[_madsMessages[index]->compSize]; - byte *buffer = new byte[_madsMessages[index]->uncompSize]; + byte *compData = new byte[_madsMessages[index].compSize]; + byte *buffer = new byte[_madsMessages[index].uncompSize]; Common::SeekableReadStream *messageS = _vm->res()->get("messages.dat"); - messageS->seek(_madsMessages[index]->offset, SEEK_SET); - messageS->read(compData, _madsMessages[index]->compSize); - fab.decompress(compData, _madsMessages[index]->compSize, buffer, _madsMessages[index]->uncompSize); + messageS->seek(_madsMessages[index].offset, SEEK_SET); + messageS->read(compData, _madsMessages[index].compSize); + fab.decompress(compData, _madsMessages[index].compSize, buffer, _madsMessages[index].uncompSize); - for (int i = 0; i < _madsMessages[index]->uncompSize - 1; i++) + for (int i = 0; i < _madsMessages[index].uncompSize - 1; i++) if (buffer[i] == '\0') buffer[i] = '\n'; _vm->res()->toss("messages.dat"); diff --git a/engines/m4/globals.h b/engines/m4/globals.h index de6e716ece..1714d223ce 100644 --- a/engines/m4/globals.h +++ b/engines/m4/globals.h @@ -235,7 +235,7 @@ private: MadsEngine *_vm; Common::Array<char* > _madsVocab; Common::Array<char* > _madsQuotes; - Common::Array<MessageItem* > _madsMessages; + Common::Array<MessageItem> _madsMessages; MadsObjectArray _madsObjects; Common::List<int> _visitedScenes; public: diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index c30e946653..446f2bf974 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -148,6 +148,7 @@ MadsM4Engine::~MadsM4Engine() { delete _palette; delete _globals; delete _sound; + delete _driver; delete _resourceManager; } @@ -158,11 +159,11 @@ Common::Error MadsM4Engine::run() { MidiDriverType midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); bool native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); - MidiDriver *driver = MidiDriver::createMidi(midiDriver); + _driver = MidiDriver::createMidi(midiDriver); if (native_mt32) - driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); + _driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); - _midi = new MidiPlayer(this, driver); + _midi = new MidiPlayer(this, _driver); _midi->setGM(true); _midi->setNativeMT32(native_mt32); @@ -513,7 +514,6 @@ Common::Error MadsEngine::run() { // Set up needed common functionality MadsM4Engine::run(); - _scene = new MadsScene(this); _palette->setMadsSystemPalette(); _mouse->init("cursor.ss", NULL); @@ -538,9 +538,12 @@ Common::Error MadsEngine::run() { //printf("%s\n----------\n", _globals->loadMessage(i)); if ((getGameType() == GType_RexNebular) || (getGameType() == GType_DragonSphere)) { + _scene = NULL; loadMenu(MAIN_MENU); } else { + _scene = new MadsScene(this); + if (getGameType() == GType_DragonSphere) { _scene->loadScene(FIRST_SCENE); } else if (getGameType() == GType_Phantom) { diff --git a/engines/m4/m4.h b/engines/m4/m4.h index 9937107668..f5ddcc28be 100644 --- a/engines/m4/m4.h +++ b/engines/m4/m4.h @@ -29,6 +29,7 @@ #include "common/scummsys.h" #include "common/util.h" #include "common/random.h" +#include "sound/mididrv.h" #include "engines/engine.h" @@ -123,7 +124,7 @@ enum { struct M4GameDescription; -#define GAME_FRAME_DELAY 50 +#define GAME_FRAME_DELAY 20 #define VALIDATE_MADS assert(!_vm->isM4()) @@ -144,6 +145,7 @@ protected: void shutdown(); + MidiDriver *_driver; MidiPlayer *_midi; public: @@ -219,6 +221,12 @@ public: MadsGlobals *globals() { return (MadsGlobals *)_globals; } MadsScene *scene() { return (MadsScene *)_scene; } + void startScene(int sceneNum) { + if (!_scene) + _scene = new MadsScene(this); + _scene->show(); + _scene->loadScene(101); + } }; class M4Engine : public MadsM4Engine { diff --git a/engines/m4/mads_menus.cpp b/engines/m4/mads_menus.cpp index 94894e78be..43b9031692 100644 --- a/engines/m4/mads_menus.cpp +++ b/engines/m4/mads_menus.cpp @@ -293,7 +293,7 @@ int RexMainMenuView::getHighlightedItem(int x, int y) { } void RexMainMenuView::handleAction(MadsGameAction action) { - MadsM4Engine *vm = _vm; + MadsEngine *vm = (MadsEngine *)_vm; vm->_mouse->cursorOff(); vm->_viewManager->deleteView(this); @@ -303,8 +303,7 @@ void RexMainMenuView::handleAction(MadsGameAction action) { // Load a sample starting scene - note that, currently, calling loadScene automatically // removes this menu screen from being displayed vm->_mouse->cursorOn(); - vm->_scene->show(); - vm->_scene->loadScene(101); + vm->startScene(101); return; case SHOW_INTRO: @@ -325,7 +324,7 @@ void RexMainMenuView::handleAction(MadsGameAction action) { // Activate the scene display with the specified scene bool altAdvert = vm->_random->getRandomNumber(1000) >= 500; - vm->_scene->loadScene(altAdvert ? 995 : 996); + vm->startScene(altAdvert ? 995 : 996); vm->_viewManager->addView(vm->_scene); vm->_viewManager->refreshAll(); diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp index 15c68f276c..e78d7f865e 100644 --- a/engines/m4/scene.cpp +++ b/engines/m4/scene.cpp @@ -55,6 +55,7 @@ Scene::Scene(MadsM4Engine *vm, SceneResources *res): View(vm, Common::Rect(0, 0, Scene::~Scene() { leaveScene(); + _vm->_scene = NULL; } void Scene::loadScene(int sceneNumber) { diff --git a/engines/m4/sound.cpp b/engines/m4/sound.cpp index 69ab8c0516..e0fbd2f7a9 100644 --- a/engines/m4/sound.cpp +++ b/engines/m4/sound.cpp @@ -197,20 +197,20 @@ void Sound::loadDSRFile(const char *fileName) { //printf("DSR has %i entries\n", _dsrFile.entryCount); for (int i = 0; i < _dsrFile.entryCount; i++) { - DSREntry* newEntry = new DSREntry(); - newEntry->frequency = fileStream->readUint16LE(); - newEntry->channels = fileStream->readUint32LE(); - newEntry->compSize = fileStream->readUint32LE(); - newEntry->uncompSize = fileStream->readUint32LE(); - newEntry->offset = fileStream->readUint32LE(); + DSREntry newEntry; + newEntry.frequency = fileStream->readUint16LE(); + newEntry.channels = fileStream->readUint32LE(); + newEntry.compSize = fileStream->readUint32LE(); + newEntry.uncompSize = fileStream->readUint32LE(); + newEntry.offset = fileStream->readUint32LE(); _dsrFile.dsrEntries.push_back(newEntry); /* printf("%i: ", i); printf("frequency: %i ", newEntry->frequency); printf("channels: %i ", newEntry->channels); - printf("comp: %i ", newEntry->compSize); - printf("uncomp: %i ", newEntry->uncompSize); + printf("comp: %i ", newEntry.compSize); + printf("uncomp: %i ", newEntry.uncompSize); printf("offset: %i ", newEntry->offset); printf("\n"); */ @@ -225,9 +225,7 @@ void Sound::unloadDSRFile() { if (!_dsrFileLoaded) return; - for (int i = 0; i < _dsrFile.entryCount; i++) { - _dsrFile.dsrEntries.remove_at(0); - } + _dsrFile.dsrEntries.clear(); _dsrFile.entryCount = 0; strcpy(_dsrFile.fileName, ""); @@ -251,28 +249,28 @@ void Sound::playDSRSound(int soundIndex, int volume, bool loop) { // Get sound data FabDecompressor fab; - byte *compData = new byte[_dsrFile.dsrEntries[soundIndex]->compSize]; - byte *buffer = new byte[_dsrFile.dsrEntries[soundIndex]->uncompSize]; + byte *compData = new byte[_dsrFile.dsrEntries[soundIndex].compSize]; + byte *buffer = new byte[_dsrFile.dsrEntries[soundIndex].uncompSize]; Common::SeekableReadStream *fileStream = _vm->res()->get(_dsrFile.fileName); - fileStream->seek(_dsrFile.dsrEntries[soundIndex]->offset, SEEK_SET); - fileStream->read(compData, _dsrFile.dsrEntries[soundIndex]->compSize); + fileStream->seek(_dsrFile.dsrEntries[soundIndex].offset, SEEK_SET); + fileStream->read(compData, _dsrFile.dsrEntries[soundIndex].compSize); _vm->res()->toss(_dsrFile.fileName); - fab.decompress(compData, _dsrFile.dsrEntries[soundIndex]->compSize, - buffer, _dsrFile.dsrEntries[soundIndex]->uncompSize); + fab.decompress(compData, _dsrFile.dsrEntries[soundIndex].compSize, + buffer, _dsrFile.dsrEntries[soundIndex].uncompSize); // Play sound Audio::AudioStream *stream = Audio::makeLoopingAudioStream( Audio::makeRawStream(buffer, - _dsrFile.dsrEntries[soundIndex]->uncompSize, - _dsrFile.dsrEntries[soundIndex]->frequency, Audio::FLAG_UNSIGNED), + _dsrFile.dsrEntries[soundIndex].uncompSize, + _dsrFile.dsrEntries[soundIndex].frequency, Audio::FLAG_UNSIGNED), loop ? 0 : 1); _mixer->playStream(Audio::Mixer::kSFXSoundType, &handle->handle, stream, -1, volume); /* // Dump the sound file FILE *destFile = fopen("sound.raw", "wb"); - fwrite(_dsrFile.dsrEntries[soundIndex]->data, _dsrFile.dsrEntries[soundIndex]->uncompSize, 1, destFile); + fwrite(_dsrFile.dsrEntries[soundIndex]->data, _dsrFile.dsrEntries[soundIndex].uncompSize, 1, destFile); fclose(destFile); */ } diff --git a/engines/m4/sound.h b/engines/m4/sound.h index 7d442a73cc..5587810506 100644 --- a/engines/m4/sound.h +++ b/engines/m4/sound.h @@ -65,7 +65,7 @@ struct DSREntry { struct DSRFile { char fileName[20]; int entryCount; - Common::Array<DSREntry *> dsrEntries; + Common::Array<DSREntry> dsrEntries; }; class MadsM4Engine; |