From e7cc0ca7479cd4bca09963a1d843ecbae15898eb Mon Sep 17 00:00:00 2001 From: "Tim E. Real" Date: Sat, 18 Dec 2010 03:01:21 +0000 Subject: Fixed marker view crash. Fixed some memory leaks. --- muse2/ChangeLog | 4 +++ muse2/muse/app.cpp | 54 +++++++++++++++++++++------------------- muse2/muse/driver/jackmidi.cpp | 12 ++++++--- muse2/muse/dssihost.cpp | 23 ++++++++++------- muse2/muse/marker/markerview.cpp | 4 +++ muse2/muse/song.cpp | 23 +++++++++++++---- 6 files changed, 77 insertions(+), 43 deletions(-) (limited to 'muse2') diff --git a/muse2/ChangeLog b/muse2/ChangeLog index 5ed9d7c4..700eeeb3 100644 --- a/muse2/ChangeLog +++ b/muse2/ChangeLog @@ -1,3 +1,7 @@ +17.12.2010: + - Fixed crash with song loaded then File->New. Marker view had non-existent items from cleared marker list. (Tim) + - Some memory leak cleanups. Delete midiInstruments and midiDevices. (Tim) + TODO: Many more leaks to fix. 16.12.2010: - Fixed track list track moving/resizing - added ev->buttons() check to mouseMoveEvent(). (Tim) - Fixed meter drawing (speed) - removed double buffer pixmap. Test OK. (Tim) diff --git a/muse2/muse/app.cpp b/muse2/muse/app.cpp index e1a2f20c..5ea7c00d 100644 --- a/muse2/muse/app.cpp +++ b/muse2/muse/app.cpp @@ -1842,7 +1842,7 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll mixer2->move(config.mixer2.geometry.topLeft()); } - showMarker(config.markerVisible); + //showMarker(config.markerVisible); // Moved below. Tim. resize(config.geometryMain.size()); move(config.geometryMain.topLeft()); @@ -1864,30 +1864,34 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll // p3.3.53 Try this AFTER the song update above which does a mixer update... Tested OK - mixers resize properly now. if (loadAll) { - if(mixer1) - { - if(mixer1->geometry().size() != config.mixer1.geometry.size()) - { - //printf("MusE::loadProjectFile1 resizing mixer1 x:%d y:%d w:%d h:%d\n", config.mixer1.geometry.x(), - // config.mixer1.geometry.y(), - // config.mixer1.geometry.width(), - // config.mixer1.geometry.height() - // ); - mixer1->resize(config.mixer1.geometry.size()); - } - } - if(mixer2) - { - if(mixer2->geometry().size() != config.mixer2.geometry.size()) - { - //printf("MusE::loadProjectFile1 resizing mixer2 x:%d y:%d w:%d h:%d\n", config.mixer2.geometry.x(), - // config.mixer2.geometry.y(), - // config.mixer2.geometry.width(), - // config.mixer2.geometry.height() - // ); - mixer2->resize(config.mixer2.geometry.size()); - } - } + if(mixer1) + { + if(mixer1->geometry().size() != config.mixer1.geometry.size()) + { + //printf("MusE::loadProjectFile1 resizing mixer1 x:%d y:%d w:%d h:%d\n", config.mixer1.geometry.x(), + // config.mixer1.geometry.y(), + // config.mixer1.geometry.width(), + // config.mixer1.geometry.height() + // ); + mixer1->resize(config.mixer1.geometry.size()); + } + } + if(mixer2) + { + if(mixer2->geometry().size() != config.mixer2.geometry.size()) + { + //printf("MusE::loadProjectFile1 resizing mixer2 x:%d y:%d w:%d h:%d\n", config.mixer2.geometry.x(), + // config.mixer2.geometry.y(), + // config.mixer2.geometry.width(), + // config.mixer2.geometry.height() + // ); + mixer2->resize(config.mixer2.geometry.size()); + } + } + + // Moved here from above due to crash with a song loaded and then File->New. + // Marker view list was not updated, had non-existent items from marker list (cleared in ::clear()). + showMarker(config.markerVisible); } } diff --git a/muse2/muse/driver/jackmidi.cpp b/muse2/muse/driver/jackmidi.cpp index 03c75ef4..d401c7e1 100644 --- a/muse2/muse/driver/jackmidi.cpp +++ b/muse2/muse/driver/jackmidi.cpp @@ -167,10 +167,14 @@ MidiJackDevice::~MidiJackDevice() //if(_client_jackport) // audioDevice->unregisterPort(_client_jackport); // p3.3.55 - if(_in_client_jackport) - audioDevice->unregisterPort(_in_client_jackport); - if(_out_client_jackport) - audioDevice->unregisterPort(_out_client_jackport); + + if(audioDevice) + { + if(_in_client_jackport) + audioDevice->unregisterPort(_in_client_jackport); + if(_out_client_jackport) + audioDevice->unregisterPort(_out_client_jackport); + } //close(); } diff --git a/muse2/muse/dssihost.cpp b/muse2/muse/dssihost.cpp index 8c967713..986abea1 100644 --- a/muse2/muse/dssihost.cpp +++ b/muse2/muse/dssihost.cpp @@ -332,9 +332,13 @@ static void scanDSSILib(QFileInfo& fi) // ddskrjo removed const for argument } else { - const DSSI_Descriptor* descr; + //const DSSI_Descriptor* descr; for (int i = 0;; ++i) { + const DSSI_Descriptor* descr; + + // CRAPPY PLUGIN ALERT: + // Out of many plugins, with several, Valgrind says something in here is allocated with new. descr = dssi(i); if (descr == 0) break; @@ -594,14 +598,15 @@ SynthIF* DssiSynth::createSIF(SynthI* synti) handle = 0; return 0; } - for (int i = 0;; ++i) { - dssi = df(i); - if (dssi == 0) - break; - QString label(dssi->LADSPA_Plugin->Label); - if (label == _name) - break; - } + for (int i = 0;; ++i) + { + dssi = df(i); + if (dssi == 0) + break; + QString label(dssi->LADSPA_Plugin->Label); + if (label == _name) + break; + } if(dssi != 0) { diff --git a/muse2/muse/marker/markerview.cpp b/muse2/muse/marker/markerview.cpp index 80643b4d..d22807b6 100644 --- a/muse2/muse/marker/markerview.cpp +++ b/muse2/muse/marker/markerview.cpp @@ -430,7 +430,11 @@ void MarkerView::updateList() selm = m; } + // Block signals added. Triggers itemSelectionChanged() causing crash. Tim. + table->blockSignals(true); table->clear(); + table->blockSignals(false); + //MarkerList* marker = song->marker(); for (iMarker i = marker->begin(); i != marker->end(); ++i) { diff --git a/muse2/muse/song.cpp b/muse2/muse/song.cpp index 3bd024d3..22506d3a 100644 --- a/muse2/muse/song.cpp +++ b/muse2/muse/song.cpp @@ -2175,10 +2175,10 @@ void Song::cleanupForQuit() // Remove the controllers and the values. midiPorts[i].controller()->clearDelete(true); - // Can't do this here. Jack isn't running. - /* + // Can't do this here. Jack isn't running. Fixed. Test OK so far. + #if 1 if(debugMsg) - printf("deleting midi devices\n"); + printf("deleting midi devices except synths\n"); for(iMidiDevice imd = midiDevices.begin(); imd != midiDevices.end(); ++imd) { // Since Syntis are midi devices, there's no need to delete them below. @@ -2187,10 +2187,10 @@ void Song::cleanupForQuit() delete (*imd); } midiDevices.clear(); // midi devices - */ + #endif if(debugMsg) - printf("deleting synths\n"); + printf("deleting global available synths\n"); // Delete all synths. std::vector::iterator is; for(is = synthis.begin(); is != synthis.end(); ++is) @@ -2202,6 +2202,19 @@ void Song::cleanupForQuit() } synthis.clear(); + if(debugMsg) + printf("deleting midi instruments\n"); + for(iMidiInstrument imi = midiInstruments.begin(); imi != midiInstruments.end(); ++imi) + { + // Since Syntis are midi instruments, there's no need to delete them below. + // Tricky, must cast as SynthI*. + SynthI* s = dynamic_cast (*imi); + if(s) + continue; + delete (*imi); + } + midiInstruments.clear(); // midi devices + // Nothing required for ladspa plugin list, and rack instances of them // are handled by ~AudioTrack. -- cgit v1.2.3