changeset 349:369a197737c7

* Various fixes to object lifetime management, particularly in the spectrum layer and for notification of main model deletion. The main purpose of this is to improve the behaviour of the spectrum, but I think it may also help with #1840922 Various crashes in Layer Summary window.
author Chris Cannam
date Wed, 23 Jan 2008 15:43:27 +0000
parents 0093f351641c
children 3a55cd576334
files layer/LayerFactory.cpp layer/SpectrumLayer.cpp layer/SpectrumLayer.h
diffstat 3 files changed, 47 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/layer/LayerFactory.cpp	Wed Jan 23 11:38:34 2008 +0000
+++ b/layer/LayerFactory.cpp	Wed Jan 23 15:43:27 2008 +0000
@@ -350,6 +350,10 @@
 	dynamic_cast<SpectrogramLayer *>(layer)->setChannel(channel);
 	return;
     }
+    if (dynamic_cast<SpectrumLayer *>(layer)) {
+	dynamic_cast<SpectrumLayer *>(layer)->setChannel(channel);
+	return;
+    }
 }
 
 Layer *
--- a/layer/SpectrumLayer.cpp	Wed Jan 23 11:38:34 2008 +0000
+++ b/layer/SpectrumLayer.cpp	Wed Jan 23 15:43:27 2008 +0000
@@ -47,8 +47,11 @@
 
 SpectrumLayer::~SpectrumLayer()
 {
-    //!!! delete parent's model
-//    for (size_t i = 0; i < m_fft.size(); ++i) delete m_fft[i];
+    Model *m = const_cast<Model *>
+        (static_cast<const Model *>(m_sliceableModel));
+    m->aboutToDelete();
+    m_sliceableModel = 0;
+    delete m;
 }
 
 void
@@ -57,27 +60,43 @@
     std::cerr << "SpectrumLayer::setModel(" << model << ") from " << m_originModel << std::endl;
     
     if (m_originModel == model) return;
+
     m_originModel = model;
 
-    if (m_sliceableModel) {
-        const Model *oldModel = m_sliceableModel;
-        setSliceableModel(0);
-        // surprised I'm allowed to delete a const pointer -- may be a
-        // source of future compiler rejection?
-        delete oldModel;
-    }
-//!!!    setupFFT();
+    m_newFFTNeeded = true;
+
+    emit layerParametersChanged();
+}
+
+void
+SpectrumLayer::setChannel(int channel)
+{
+    std::cerr << "SpectrumLayer::setChannel(" << channel << ") from " << m_channel << std::endl;
+    
+    m_channelSet = true;
+    
+    if (m_channel == channel) return;
+
+    m_channel = channel;
+
+    m_newFFTNeeded = true;
+
+    emit layerParametersChanged();
 }
 
 void
 SpectrumLayer::setupFFT()
 {
-    FFTModel *oldFFT = dynamic_cast<FFTModel *>
-        (const_cast<DenseThreeDimensionalModel *>(m_sliceableModel));
-    
-    if (oldFFT) {
+    if (m_sliceableModel) {
+        Model *m = const_cast<Model *>
+            (static_cast<const Model *>(m_sliceableModel));
+        m->aboutToDelete();
         setSliceableModel(0);
-        delete oldFFT;
+        delete m;
+    }
+
+    if (!m_originModel) {
+        return;
     }
 
     FFTModel *newFFT = new FFTModel(m_originModel,
@@ -99,24 +118,8 @@
     }
 
     newFFT->resume();
-}
 
-void
-SpectrumLayer::setChannel(int channel)
-{
-    m_channelSet = true;
-
-    FFTModel *fft = dynamic_cast<FFTModel *>
-        (const_cast<DenseThreeDimensionalModel *>(m_sliceableModel));
-
-    if (m_channel == channel) {
-        if (fft) fft->resume();
-        return;
-    }
-
-    m_channel = channel;
-
-    emit layerParametersChanged();
+    m_newFFTNeeded = false;
 }
 
 Layer::PropertyList
@@ -642,11 +645,14 @@
 SpectrumLayer::paint(View *v, QPainter &paint, QRect rect) const
 {
     if (!m_originModel || !m_originModel->isOK() ||
-        !m_originModel->isReady()) return;
+        !m_originModel->isReady()) {
+        std::cerr << "SpectrumLayer::paint: no origin model" << std::endl;
+        return;
+    }
 
     if (m_newFFTNeeded) {
+        std::cerr << "SpectrumLayer::paint: new FFT needed, calling setupFFT" << std::endl;
         const_cast<SpectrumLayer *>(this)->setupFFT(); //ugh
-        m_newFFTNeeded = false;
     }
 
     FFTModel *fft = dynamic_cast<FFTModel *>
--- a/layer/SpectrumLayer.h	Wed Jan 23 11:38:34 2008 +0000
+++ b/layer/SpectrumLayer.h	Wed Jan 23 15:43:27 2008 +0000
@@ -24,6 +24,7 @@
 #include "data/model/DenseTimeValueModel.h"
 
 #include <QColor>
+#include <QMutex>
 
 class FFTModel;
 
@@ -113,6 +114,8 @@
     bool                    m_showPeaks;
     mutable bool            m_newFFTNeeded;
 
+    mutable QMutex m_fftMutex;
+
     void setupFFT();
 
     virtual void getBiasCurve(BiasCurve &) const;