# HG changeset patch # User Chris Cannam # Date 1483614657 0 # Node ID 7a19738b9762f2cbe5a4b39888f33e9afef462ff # Parent efc7586de49944669927148e9b61a7548dc6b334 Recreate FFT model when something changes, not the next time it's requested (avoids extra work when only retrieving the model) diff -r efc7586de499 -r 7a19738b9762 layer/SpectrogramLayer.cpp --- a/layer/SpectrogramLayer.cpp Wed Jan 04 16:03:12 2017 +0000 +++ b/layer/SpectrogramLayer.cpp Thu Jan 05 11:10:57 2017 +0000 @@ -129,7 +129,9 @@ SpectrogramLayer::~SpectrogramLayer() { invalidateRenderers(); - invalidateFFTModel(); + + delete m_fftModel; + delete m_peakCache; } pair @@ -193,7 +195,8 @@ if (model == m_model) return; m_model = model; - invalidateFFTModel(); + + recreateFFTModel(); if (!m_model || !m_model->isOK()) return; @@ -673,7 +676,7 @@ invalidateRenderers(); m_channel = ch; - invalidateFFTModel(); + recreateFFTModel(); emit layerParametersChanged(); } @@ -717,7 +720,7 @@ m_windowSize = ws; - invalidateFFTModel(); + recreateFFTModel(); emit layerParametersChanged(); } @@ -737,7 +740,7 @@ m_windowHopLevel = v; - invalidateFFTModel(); + recreateFFTModel(); emit layerParametersChanged(); @@ -759,7 +762,7 @@ m_windowType = w; - invalidateFFTModel(); + recreateFFTModel(); emit layerParametersChanged(); } @@ -1325,34 +1328,34 @@ return rv; } -FFTModel * -SpectrogramLayer::getFFTModel() const +void +SpectrogramLayer::recreateFFTModel() { - if (!m_model) return 0; - - int fftSize = getFFTSize(); - - //!!! it is now surely slower to do this on every getFFTModel() - //!!! request than it would be to recreate the model immediately - //!!! when something changes instead of just invalidating it - - if (m_fftModel && - m_fftModel->getHeight() == fftSize / 2 + 1 && - m_fftModel->getWindowIncrement() == getWindowIncrement()) { - return m_fftModel; +#ifdef DEBUG_SPECTROGRAM + cerr << "SpectrogramLayer::recreateFFTModel called" << endl; +#endif + + if (!m_model || !m_model->isOK()) { + emit sliceableModelReplaced(m_fftModel, 0); + delete m_fftModel; + delete m_peakCache; + m_fftModel = 0; + m_peakCache = 0; + return; } - - delete m_peakCache; - m_peakCache = 0; - - delete m_fftModel; + + FFTModel *oldModel = m_fftModel; + m_fftModel = new FFTModel(m_model, m_channel, m_windowType, m_windowSize, getWindowIncrement(), - fftSize); - + getFFTSize()); + + delete m_peakCache; + m_peakCache = 0; + if (!m_fftModel->isOK()) { QMessageBox::critical (0, tr("FFT cache failed"), @@ -1360,25 +1363,14 @@ "There may be insufficient memory or disc space to continue.")); delete m_fftModel; m_fftModel = 0; - return 0; + return; } - - ((SpectrogramLayer *)this)->sliceableModelReplaced(0, m_fftModel); - - return m_fftModel; -} - -Dense3DModelPeakCache * -SpectrogramLayer::getPeakCache() const -{ - //!!! see comment in getFFTModel - if (!m_peakCache) { - FFTModel *f = getFFTModel(); - if (!f) return 0; - m_peakCache = new Dense3DModelPeakCache(f, m_peakCacheDivisor); - } - return m_peakCache; + m_peakCache = new Dense3DModelPeakCache(m_fftModel, m_peakCacheDivisor); + + emit sliceableModelReplaced(oldModel, m_fftModel); + + delete oldModel; } const Model * @@ -1388,22 +1380,6 @@ } void -SpectrogramLayer::invalidateFFTModel() -{ -#ifdef DEBUG_SPECTROGRAM - cerr << "SpectrogramLayer::invalidateFFTModel called" << endl; -#endif - - emit sliceableModelReplaced(m_fftModel, 0); - - delete m_fftModel; - delete m_peakCache; - - m_fftModel = 0; - m_peakCache = 0; -} - -void SpectrogramLayer::invalidateMagnitudes() { #ifdef DEBUG_SPECTROGRAM diff -r efc7586de499 -r 7a19738b9762 layer/SpectrogramLayer.h --- a/layer/SpectrogramLayer.h Wed Jan 04 16:03:12 2017 +0000 +++ b/layer/SpectrogramLayer.h Thu Jan 05 11:10:57 2017 +0000 @@ -302,9 +302,12 @@ int getFFTOversampling() const; int getFFTSize() const; // m_windowSize * getFFTOversampling() - mutable FFTModel *m_fftModel; //!!! should not be mutable, see getFFTModel()? - mutable Dense3DModelPeakCache *m_peakCache; + FFTModel *m_fftModel; + FFTModel *getFFTModel() const { return m_fftModel; } + Dense3DModelPeakCache *m_peakCache; + Dense3DModelPeakCache *getPeakCache() const { return m_peakCache; } const int m_peakCacheDivisor; + void recreateFFTModel(); typedef std::map ViewMagMap; // key is view id mutable ViewMagMap m_viewMags; @@ -316,10 +319,6 @@ Colour3DPlotRenderer *getRenderer(LayerGeometryProvider *) const; void invalidateRenderers(); - FFTModel *getFFTModel() const; - Dense3DModelPeakCache *getPeakCache() const; - void invalidateFFTModel(); - void paintWithRenderer(LayerGeometryProvider *v, QPainter &paint, QRect rect) const; void paintDetailedScale(LayerGeometryProvider *v,