Mercurial > hg > svgui
comparison layer/SpectrogramLayer.cpp @ 131:eaae73b6bd28
* Suspend/resume fft data server write activity while reading from a server
  to repaint the spectrogram display.  Makes a significant improvement to
  the otherwise dreadful responsiveness of spectrogram display.
| author | Chris Cannam | 
|---|---|
| date | Thu, 03 Aug 2006 12:42:15 +0000 | 
| parents | 10eec0da9efe | 
| children | 5d3a483856ff | 
   comparison
  equal
  deleted
  inserted
  replaced
| 130:10eec0da9efe | 131:eaae73b6bd28 | 
|---|---|
| 542 void | 542 void | 
| 543 SpectrogramLayer::invalidatePixmapCaches(size_t startFrame, size_t endFrame) | 543 SpectrogramLayer::invalidatePixmapCaches(size_t startFrame, size_t endFrame) | 
| 544 { | 544 { | 
| 545 for (ViewPixmapCache::iterator i = m_pixmapCaches.begin(); | 545 for (ViewPixmapCache::iterator i = m_pixmapCaches.begin(); | 
| 546 i != m_pixmapCaches.end(); ++i) { | 546 i != m_pixmapCaches.end(); ++i) { | 
| 547 | |
| 547 //!!! when are views removed from the map? on setLayerDormant? | 548 //!!! when are views removed from the map? on setLayerDormant? | 
| 548 const View *v = i->first; | 549 const View *v = i->first; | 
| 549 | 550 | 
| 550 if (startFrame < v->getEndFrame() && int(endFrame) >= v->getStartFrame()) { | 551 if (startFrame < v->getEndFrame() && int(endFrame) >= v->getStartFrame()) { | 
| 551 i->second.validArea = QRect(); | 552 i->second.validArea = QRect(); | 
| 876 } | 877 } | 
| 877 | 878 | 
| 878 void | 879 void | 
| 879 SpectrogramLayer::setLayerDormant(const View *v, bool dormant) | 880 SpectrogramLayer::setLayerDormant(const View *v, bool dormant) | 
| 880 { | 881 { | 
| 881 if (dormant == m_dormancy[v]) return; | |
| 882 | |
| 883 if (dormant) { | 882 if (dormant) { | 
| 884 | 883 | 
| 885 m_dormancy[v] = true; | 884 if (isLayerDormant(v)) { | 
| 885 return; | |
| 886 } | |
| 887 | |
| 888 Layer::setLayerDormant(v, true); | |
| 886 | 889 | 
| 887 invalidatePixmapCaches(); | 890 invalidatePixmapCaches(); | 
| 888 m_pixmapCaches.erase(v); | 891 m_pixmapCaches.erase(v); | 
| 889 | 892 | 
| 890 if (m_fftModels.find(v) != m_fftModels.end()) { | 893 if (m_fftModels.find(v) != m_fftModels.end()) { | 
| 892 m_fftModels.erase(v); | 895 m_fftModels.erase(v); | 
| 893 } | 896 } | 
| 894 | 897 | 
| 895 } else { | 898 } else { | 
| 896 | 899 | 
| 897 m_dormancy[v] = false; | 900 Layer::setLayerDormant(v, false); | 
| 898 } | 901 } | 
| 899 } | 902 } | 
| 900 | 903 | 
| 901 void | 904 void | 
| 902 SpectrogramLayer::cacheInvalid() | 905 SpectrogramLayer::cacheInvalid() | 
| 1645 v->setLightBackground(true); | 1648 v->setLightBackground(true); | 
| 1646 } else { | 1649 } else { | 
| 1647 v->setLightBackground(false); | 1650 v->setLightBackground(false); | 
| 1648 } | 1651 } | 
| 1649 | 1652 | 
| 1650 // Profiler profiler("SpectrogramLayer::paint", true); | 1653 Profiler profiler("SpectrogramLayer::paint", true); | 
| 1651 #ifdef DEBUG_SPECTROGRAM_REPAINT | 1654 #ifdef DEBUG_SPECTROGRAM_REPAINT | 
| 1652 std::cerr << "SpectrogramLayer::paint(): m_model is " << m_model << ", zoom level is " << v->getZoomLevel() << ", m_updateTimer " << m_updateTimer << std::endl; | 1655 std::cerr << "SpectrogramLayer::paint(): m_model is " << m_model << ", zoom level is " << v->getZoomLevel() << ", m_updateTimer " << m_updateTimer << std::endl; | 
| 1653 | 1656 | 
| 1654 std::cerr << "rect is " << rect.x() << "," << rect.y() << " " << rect.width() << "x" << rect.height() << std::endl; | 1657 std::cerr << "rect is " << rect.x() << "," << rect.y() << " " << rect.width() << "x" << rect.height() << std::endl; | 
| 1655 #endif | 1658 #endif | 
| 1668 | 1671 | 
| 1669 // Need to do this even if !isLayerDormant, as that could mean v | 1672 // Need to do this even if !isLayerDormant, as that could mean v | 
| 1670 // is not in the dormancy map at all -- we need it to be present | 1673 // is not in the dormancy map at all -- we need it to be present | 
| 1671 // and accountable for when determining whether we need the cache | 1674 // and accountable for when determining whether we need the cache | 
| 1672 // in the cache-fill thread above. | 1675 // in the cache-fill thread above. | 
| 1673 m_dormancy[v] = false; | 1676 //!!! no longer use cache-fill thread | 
| 1677 const_cast<SpectrogramLayer *>(this)->Layer::setLayerDormant(v, false); | |
| 1674 | 1678 | 
| 1675 size_t fftSize = getFFTSize(v); | 1679 size_t fftSize = getFFTSize(v); | 
| 1676 FFTModel *fft = getFFTModel(v); | 1680 FFTModel *fft = getFFTModel(v); | 
| 1677 if (!fft) { | 1681 if (!fft) { | 
| 1678 std::cerr << "ERROR: SpectrogramLayer::paint(): No FFT model, returning" << std::endl; | 1682 std::cerr << "ERROR: SpectrogramLayer::paint(): No FFT model, returning" << std::endl; | 
| 1935 } | 1939 } | 
| 1936 | 1940 | 
| 1937 MagnitudeRange overallMag = m_viewMags[v]; | 1941 MagnitudeRange overallMag = m_viewMags[v]; | 
| 1938 bool overallMagChanged = false; | 1942 bool overallMagChanged = false; | 
| 1939 | 1943 | 
| 1944 fft->suspend(); | |
| 1945 | |
| 1940 for (int x = 0; x < w; ++x) { | 1946 for (int x = 0; x < w; ++x) { | 
| 1941 | 1947 | 
| 1942 for (int y = 0; y < h; ++y) { | 1948 for (int y = 0; y < h; ++y) { | 
| 1943 ymag[y] = 0.0; | 1949 ymag[y] = 0.0; | 
| 1944 ydiv[y] = 0.0; | 1950 ydiv[y] = 0.0; | 
| 2114 illuminateLocalFeatures(v, paint); | 2120 illuminateLocalFeatures(v, paint); | 
| 2115 | 2121 | 
| 2116 #ifdef DEBUG_SPECTROGRAM_REPAINT | 2122 #ifdef DEBUG_SPECTROGRAM_REPAINT | 
| 2117 std::cerr << "SpectrogramLayer::paint() returning" << std::endl; | 2123 std::cerr << "SpectrogramLayer::paint() returning" << std::endl; | 
| 2118 #endif | 2124 #endif | 
| 2125 | |
| 2126 fft->resume(); | |
| 2119 } | 2127 } | 
| 2120 | 2128 | 
| 2121 void | 2129 void | 
| 2122 SpectrogramLayer::illuminateLocalFeatures(View *v, QPainter &paint) const | 2130 SpectrogramLayer::illuminateLocalFeatures(View *v, QPainter &paint) const | 
| 2123 { | 2131 { | 
