Chris@545: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@545: Chris@545: /* Chris@545: Sonic Visualiser Chris@545: An audio file viewer and annotation editor. Chris@545: Centre for Digital Music, Queen Mary, University of London. Chris@545: This file copyright 2009 QMUL. Chris@545: Chris@545: This program is free software; you can redistribute it and/or Chris@545: modify it under the terms of the GNU General Public License as Chris@545: published by the Free Software Foundation; either version 2 of the Chris@545: License, or (at your option) any later version. See the file Chris@545: COPYING included with this distribution for more information. Chris@545: */ Chris@545: Chris@1191: #ifndef DENSE_3D_MODEL_PEAK_CACHE_H Chris@1191: #define DENSE_3D_MODEL_PEAK_CACHE_H Chris@545: Chris@545: #include "DenseThreeDimensionalModel.h" Chris@545: #include "EditableDenseThreeDimensionalModel.h" Chris@545: Chris@1778: /** Chris@1778: * A DenseThreeDimensionalModel that represents a reduction in the Chris@1778: * time dimension of another DenseThreeDimensionalModel. Each column Chris@1778: * contains the peak values from a number of consecutive columns in Chris@1778: * the source. Each column is populated from the source model when Chris@1778: * first requested, and is returned from cache on subsequent requests. Chris@1778: * Chris@1778: * Dense3DModelPeakCache is not thread-safe. Chris@1778: */ Chris@545: class Dense3DModelPeakCache : public DenseThreeDimensionalModel Chris@545: { Chris@546: Q_OBJECT Chris@546: Chris@545: public: Chris@1739: Dense3DModelPeakCache(ModelId source, // a DenseThreeDimensionalModel Chris@929: int columnsPerPeak); Chris@545: ~Dense3DModelPeakCache(); Chris@545: Chris@1580: bool isOK() const override { Chris@1739: auto source = ModelById::get(m_source); Chris@1739: return source && source->isOK(); Chris@546: } Chris@546: Chris@1580: sv_samplerate_t getSampleRate() const override { Chris@1739: auto source = ModelById::get(m_source); Chris@1739: return source ? source->getSampleRate() : 0; Chris@546: } Chris@546: Chris@1580: sv_frame_t getStartFrame() const override { Chris@1739: auto source = ModelById::get(m_source); Chris@1739: return source ? source->getStartFrame() : 0; Chris@546: } Chris@546: Chris@1725: sv_frame_t getTrueEndFrame() const override { Chris@1739: auto source = ModelById::get(m_source); Chris@1739: return source ? source->getTrueEndFrame() : 0; Chris@546: } Chris@546: Chris@1580: int getResolution() const override { Chris@1739: auto source = ModelById::getAs(m_source); Chris@1739: return source ? source->getResolution() * m_columnsPerPeak : 1; Chris@545: } Chris@545: Chris@1190: virtual int getColumnsPerPeak() const { Chris@1190: return m_columnsPerPeak; Chris@1190: } Chris@1190: Chris@1580: int getWidth() const override { Chris@1739: auto source = ModelById::getAs(m_source); Chris@1739: if (!source) return 0; Chris@1739: int sourceWidth = source->getWidth(); Chris@1192: if ((sourceWidth % m_columnsPerPeak) == 0) { Chris@1192: return sourceWidth / m_columnsPerPeak; Chris@1192: } else { Chris@1192: return sourceWidth / m_columnsPerPeak + 1; Chris@1192: } Chris@545: } Chris@545: Chris@1580: int getHeight() const override { Chris@1739: auto source = ModelById::getAs(m_source); Chris@1739: return source ? source->getHeight() : 0; Chris@545: } Chris@545: Chris@1580: float getMinimumLevel() const override { Chris@1739: auto source = ModelById::getAs(m_source); Chris@1739: return source ? source->getMinimumLevel() : 0.f; Chris@545: } Chris@545: Chris@1580: float getMaximumLevel() const override { Chris@1739: auto source = ModelById::getAs(m_source); Chris@1739: return source ? source->getMaximumLevel() : 1.f; Chris@545: } Chris@545: Chris@1339: /** Chris@1339: * Retrieve the peaks column at peak-cache column number col. This Chris@1339: * will consist of the peak values in the underlying model from Chris@1339: * columns (col * getColumnsPerPeak()) to ((col+1) * Chris@1339: * getColumnsPerPeak() - 1) inclusive. Chris@1339: */ Chris@1580: Column getColumn(int col) const override; Chris@545: Chris@1580: float getValueAt(int col, int n) const override; Chris@545: Chris@1580: QString getBinName(int n) const override { Chris@1739: auto source = ModelById::getAs(m_source); Chris@1739: return source ? source->getBinName(n) : ""; Chris@545: } Chris@545: Chris@1580: bool shouldUseLogValueScale() const override { Chris@1739: auto source = ModelById::getAs(m_source); Chris@1739: return source ? source->shouldUseLogValueScale() : false; Chris@545: } Chris@545: Chris@1580: QString getTypeName() const override { return tr("Dense 3-D Peak Cache"); } Chris@545: Chris@1580: int getCompletion() const override { Chris@1739: auto source = ModelById::get(m_source); Chris@1739: return source ? source->getCompletion() : 100; Chris@545: } Chris@545: Chris@1815: QString getDelimitedDataHeaderLine(QString, DataExportOptions) const override { Chris@1815: return ""; Chris@1815: } Chris@1815: Chris@1679: QString toDelimitedDataString(QString, DataExportOptions, Chris@1679: sv_frame_t, sv_frame_t) const override { Chris@1679: return ""; Chris@1679: } Chris@1679: Chris@545: protected slots: Chris@1752: void sourceModelChanged(ModelId); Chris@545: Chris@545: private: Chris@1739: ModelId m_source; Chris@1190: int m_columnsPerPeak; Chris@545: Chris@1778: mutable std::vector> m_cache; Chris@1778: mutable std::vector m_coverage; // bool for space efficiency Chris@1778: // (vector of bool is a bitmap) Chris@1778: mutable bool m_finalColumnIncomplete; Chris@1778: Chris@929: bool haveColumn(int column) const; Chris@929: void fillColumn(int column) const; Chris@545: }; Chris@545: Chris@545: Chris@545: #endif