Mercurial > hg > svgui
diff layer/SpectrogramLayer.cpp @ 85:d31c4f5230d7
* Start factoring out the spectrogram's FFT cache into a separate set of
classes that will permit a choice of disk or memory cache strategies
author | Chris Cannam |
---|---|
date | Tue, 02 May 2006 12:27:41 +0000 |
parents | 82482231b6b1 |
children | 93a7efc75fb7 |
line wrap: on
line diff
--- a/layer/SpectrogramLayer.cpp Sat Apr 29 19:20:28 2006 +0000 +++ b/layer/SpectrogramLayer.cpp Tue May 02 12:27:41 2006 +0000 @@ -20,6 +20,7 @@ #include "base/AudioLevel.h" #include "base/Window.h" #include "base/Pitch.h" +#include "base/FFTCache.h" #include <QPainter> #include <QImage> @@ -1210,84 +1211,6 @@ return input; } - -SpectrogramLayer::Cache::Cache() : - m_width(0), - m_height(0), - m_magnitude(0), - m_phase(0), - m_factor(0) -{ -} - -SpectrogramLayer::Cache::~Cache() -{ - std::cerr << "SpectrogramLayer::Cache[" << this << "]::~Cache" << std::endl; - - for (size_t i = 0; i < m_width; ++i) { - if (m_magnitude && m_magnitude[i]) free(m_magnitude[i]); - if (m_phase && m_phase[i]) free(m_phase[i]); - } - - if (m_magnitude) free(m_magnitude); - if (m_phase) free(m_phase); - if (m_factor) free(m_factor); -} - -void -SpectrogramLayer::Cache::resize(size_t width, size_t height) -{ - std::cerr << "SpectrogramLayer::Cache[" << this << "]::resize(" << width << "x" << height << " = " << width*height << ")" << std::endl; - - if (m_width == width && m_height == height) return; - - resize(m_magnitude, width, height); - resize(m_phase, width, height); - - m_factor = (float *)realloc(m_factor, width * sizeof(float)); - - m_width = width; - m_height = height; - - std::cerr << "done, width = " << m_width << " height = " << m_height << std::endl; -} - -void -SpectrogramLayer::Cache::resize(uint16_t **&array, size_t width, size_t height) -{ - for (size_t i = width; i < m_width; ++i) { - free(array[i]); - } - - if (width != m_width) { - array = (uint16_t **)realloc(array, width * sizeof(uint16_t *)); - if (!array) throw std::bad_alloc(); - MUNLOCK(array, width * sizeof(uint16_t *)); - } - - for (size_t i = m_width; i < width; ++i) { - array[i] = 0; - } - - for (size_t i = 0; i < width; ++i) { - array[i] = (uint16_t *)realloc(array[i], height * sizeof(uint16_t)); - if (!array[i]) throw std::bad_alloc(); - MUNLOCK(array[i], height * sizeof(uint16_t)); - } -} - -void -SpectrogramLayer::Cache::reset() -{ - for (size_t x = 0; x < m_width; ++x) { - for (size_t y = 0; y < m_height; ++y) { - m_magnitude[x][y] = 0; - m_phase[x][y] = 0; - } - m_factor[x] = 1.0; - } -} - void SpectrogramLayer::CacheFillThread::run() { @@ -1356,7 +1279,7 @@ size_t height = windowSize / 2; if (!m_layer.m_cache) { - m_layer.m_cache = new Cache; + m_layer.m_cache = new FFTMemoryCache; } m_layer.m_cache->resize(width, height);