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@545: class Dense3DModelPeakCache : public DenseThreeDimensionalModel
Chris@545: {
Chris@546:     Q_OBJECT
Chris@546: 
Chris@545: public:
Chris@1191:     Dense3DModelPeakCache(const DenseThreeDimensionalModel *source,
Chris@929:                           int columnsPerPeak);
Chris@545:     ~Dense3DModelPeakCache();
Chris@545: 
Chris@1580:     bool isOK() const override {
Chris@546:         return m_source && m_source->isOK(); 
Chris@546:     }
Chris@546: 
Chris@1580:     sv_samplerate_t getSampleRate() const override {
Chris@546:         return m_source->getSampleRate();
Chris@546:     }
Chris@546: 
Chris@1580:     sv_frame_t getStartFrame() const override {
Chris@546:         return m_source->getStartFrame();
Chris@546:     }
Chris@546: 
Chris@1580:     sv_frame_t getEndFrame() const override {
Chris@546:         return m_source->getEndFrame();
Chris@546:     }
Chris@546: 
Chris@1580:     int getResolution() const override {
Chris@1190:         return m_source->getResolution() * m_columnsPerPeak;
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@1192:         int sourceWidth = m_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@545:         return m_source->getHeight();
Chris@545:     }
Chris@545: 
Chris@1580:     float getMinimumLevel() const override {
Chris@545:         return m_source->getMinimumLevel();
Chris@545:     }
Chris@545: 
Chris@1580:     float getMaximumLevel() const override {
Chris@545:         return m_source->getMaximumLevel();
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@545:         return m_source->getBinName(n);
Chris@545:     }
Chris@545: 
Chris@1580:     bool shouldUseLogValueScale() const override {
Chris@545:         return m_source->shouldUseLogValueScale();
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@545:         return m_source->getCompletion();
Chris@545:     }
Chris@545: 
Chris@545: protected slots:
Chris@545:     void sourceModelChanged();
Chris@545:     void sourceModelAboutToBeDeleted();
Chris@545: 
Chris@545: private:
Chris@1191:     const DenseThreeDimensionalModel *m_source;
Chris@545:     mutable EditableDenseThreeDimensionalModel *m_cache;
Chris@1153:     mutable std::vector<bool> m_coverage; // must be bool, for space efficiency
Chris@1153:                                           // (vector of bool uses 1-bit elements)
Chris@1190:     int m_columnsPerPeak;
Chris@545: 
Chris@929:     bool haveColumn(int column) const;
Chris@929:     void fillColumn(int column) const;
Chris@545: };
Chris@545: 
Chris@545: 
Chris@545: #endif