| Chris@152 | 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */ | 
| Chris@152 | 2 | 
| Chris@152 | 3 /* | 
| Chris@152 | 4     Sonic Visualiser | 
| Chris@152 | 5     An audio file viewer and annotation editor. | 
| Chris@152 | 6     Centre for Digital Music, Queen Mary, University of London. | 
| Chris@202 | 7     This file copyright 2006 Chris Cannam and QMUL. | 
| Chris@152 | 8 | 
| Chris@152 | 9     This program is free software; you can redistribute it and/or | 
| Chris@152 | 10     modify it under the terms of the GNU General Public License as | 
| Chris@152 | 11     published by the Free Software Foundation; either version 2 of the | 
| Chris@152 | 12     License, or (at your option) any later version.  See the file | 
| Chris@152 | 13     COPYING included with this distribution for more information. | 
| Chris@152 | 14 */ | 
| Chris@152 | 15 | 
| Chris@152 | 16 #ifndef _EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H_ | 
| Chris@152 | 17 #define _EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H_ | 
| Chris@152 | 18 | 
| Chris@152 | 19 #include "DenseThreeDimensionalModel.h" | 
| Chris@152 | 20 | 
| Chris@536 | 21 #include <QReadWriteLock> | 
| Chris@536 | 22 | 
| Chris@533 | 23 #include <vector> | 
| Chris@533 | 24 | 
| Chris@152 | 25 class EditableDenseThreeDimensionalModel : public DenseThreeDimensionalModel | 
| Chris@152 | 26 { | 
| Chris@152 | 27     Q_OBJECT | 
| Chris@152 | 28 | 
| Chris@152 | 29 public: | 
| Chris@535 | 30 | 
| Chris@535 | 31     // EditableDenseThreeDimensionalModel supports a basic compression | 
| Chris@535 | 32     // method that reduces the size of multirate data (e.g. wavelet | 
| Chris@535 | 33     // transform outputs) that are stored as plain 3d grids by about | 
| Chris@535 | 34     // 60% or thereabouts.  However, it can only be used for models | 
| Chris@535 | 35     // whose columns are set in order from 0 and never subsequently | 
| Chris@535 | 36     // changed.  If the model is going to be actually edited, it must | 
| Chris@535 | 37     // have NoCompression. | 
| Chris@535 | 38 | 
| Chris@535 | 39     enum CompressionType | 
| Chris@535 | 40     { | 
| Chris@535 | 41         NoCompression, | 
| Chris@535 | 42         BasicMultirateCompression | 
| Chris@535 | 43     }; | 
| Chris@535 | 44 | 
| Chris@152 | 45     EditableDenseThreeDimensionalModel(size_t sampleRate, | 
| Chris@152 | 46 				       size_t resolution, | 
| Chris@152 | 47 				       size_t yBinCount, | 
| Chris@535 | 48                                        CompressionType compression, | 
| Chris@152 | 49 				       bool notifyOnAdd = true); | 
| Chris@152 | 50 | 
| Chris@152 | 51     virtual bool isOK() const; | 
| Chris@152 | 52 | 
| Chris@152 | 53     virtual size_t getSampleRate() const; | 
| Chris@152 | 54     virtual size_t getStartFrame() const; | 
| Chris@152 | 55     virtual size_t getEndFrame() const; | 
| Chris@152 | 56 | 
| Chris@152 | 57     virtual Model *clone() const; | 
| Chris@152 | 58 | 
| Chris@152 | 59 | 
| Chris@152 | 60     /** | 
| Chris@152 | 61      * Return the number of sample frames covered by each set of bins. | 
| Chris@152 | 62      */ | 
| Chris@152 | 63     virtual size_t getResolution() const; | 
| Chris@152 | 64 | 
| Chris@152 | 65     /** | 
| Chris@152 | 66      * Set the number of sample frames covered by each set of bins. | 
| Chris@152 | 67      */ | 
| Chris@152 | 68     virtual void setResolution(size_t sz); | 
| Chris@152 | 69 | 
| Chris@152 | 70     /** | 
| Chris@182 | 71      * Return the number of columns. | 
| Chris@182 | 72      */ | 
| Chris@182 | 73     virtual size_t getWidth() const; | 
| Chris@182 | 74 | 
| Chris@182 | 75     /** | 
| Chris@152 | 76      * Return the number of bins in each set of bins. | 
| Chris@152 | 77      */ | 
| Chris@182 | 78     virtual size_t getHeight() const; | 
| Chris@152 | 79 | 
| Chris@152 | 80     /** | 
| Chris@152 | 81      * Set the number of bins in each set of bins. | 
| Chris@152 | 82      */ | 
| Chris@182 | 83     virtual void setHeight(size_t sz); | 
| Chris@152 | 84 | 
| Chris@152 | 85     /** | 
| Chris@152 | 86      * Return the minimum value of the value in each bin. | 
| Chris@152 | 87      */ | 
| Chris@152 | 88     virtual float getMinimumLevel() const; | 
| Chris@152 | 89 | 
| Chris@152 | 90     /** | 
| Chris@152 | 91      * Set the minimum value of the value in a bin. | 
| Chris@152 | 92      */ | 
| Chris@152 | 93     virtual void setMinimumLevel(float sz); | 
| Chris@152 | 94 | 
| Chris@152 | 95     /** | 
| Chris@152 | 96      * Return the maximum value of the value in each bin. | 
| Chris@152 | 97      */ | 
| Chris@152 | 98     virtual float getMaximumLevel() const; | 
| Chris@152 | 99 | 
| Chris@152 | 100     /** | 
| Chris@152 | 101      * Set the maximum value of the value in a bin. | 
| Chris@152 | 102      */ | 
| Chris@152 | 103     virtual void setMaximumLevel(float sz); | 
| Chris@152 | 104 | 
| Chris@182 | 105     /** | 
| Chris@182 | 106      * Return true if there are data available for the given column. | 
| Chris@182 | 107      */ | 
| Chris@182 | 108     virtual bool isColumnAvailable(size_t x) const { return x < getWidth(); } | 
| Chris@152 | 109 | 
| Chris@152 | 110     /** | 
| Chris@182 | 111      * Get the set of bin values at the given column. | 
| Chris@152 | 112      */ | 
| Chris@533 | 113     virtual Column getColumn(size_t x) const; | 
| Chris@152 | 114 | 
| Chris@152 | 115     /** | 
| Chris@182 | 116      * Get a single value, from the n'th bin of the given column. | 
| Chris@152 | 117      */ | 
| Chris@182 | 118     virtual float getValueAt(size_t x, size_t n) const; | 
| Chris@152 | 119 | 
| Chris@152 | 120     /** | 
| Chris@182 | 121      * Set the entire set of bin values at the given column. | 
| Chris@152 | 122      */ | 
| Chris@182 | 123     virtual void setColumn(size_t x, const Column &values); | 
| Chris@152 | 124 | 
| Chris@152 | 125     virtual QString getBinName(size_t n) const; | 
| Chris@152 | 126     virtual void setBinName(size_t n, QString); | 
| Chris@152 | 127     virtual void setBinNames(std::vector<QString> names); | 
| Chris@152 | 128 | 
| Chris@478 | 129     bool shouldUseLogValueScale() const; | 
| Chris@478 | 130 | 
| Chris@333 | 131     virtual void setCompletion(int completion, bool update = true); | 
| Chris@152 | 132     virtual int getCompletion() const { return m_completion; } | 
| Chris@152 | 133 | 
| Chris@345 | 134     QString getTypeName() const { return tr("Editable Dense 3-D"); } | 
| Chris@345 | 135 | 
| Chris@318 | 136     virtual QString toDelimitedDataString(QString delimiter) const; | 
| Chris@318 | 137 | 
| Chris@152 | 138     virtual void toXml(QTextStream &out, | 
| Chris@152 | 139                        QString indent = "", | 
| Chris@152 | 140                        QString extraAttributes = "") const; | 
| Chris@152 | 141 | 
| Chris@152 | 142 protected: | 
| Chris@533 | 143     typedef QVector<Column> ValueMatrix; | 
| Chris@152 | 144     ValueMatrix m_data; | 
| Chris@152 | 145 | 
| Chris@535 | 146     // m_trunc is used for simple compression.  If at least the top N | 
| Chris@535 | 147     // elements of column x (for N = some proportion of the column | 
| Chris@535 | 148     // height) are equal to those of an earlier column x', then | 
| Chris@535 | 149     // m_trunc[x] will contain x-x' and column x will be truncated so | 
| Chris@535 | 150     // as to remove the duplicate elements.  If the equal elements are | 
| Chris@535 | 151     // at the bottom, then m_trunc[x] will contain x'-x (a negative | 
| Chris@535 | 152     // value).  If m_trunc[x] is 0 then the whole of column x is | 
| Chris@535 | 153     // stored. | 
| Chris@535 | 154     std::vector<signed char> m_trunc; | 
| Chris@534 | 155     void truncateAndStore(size_t index, const Column & values); | 
| Chris@534 | 156     Column expandAndRetrieve(size_t index) const; | 
| Chris@534 | 157 | 
| Chris@152 | 158     std::vector<QString> m_binNames; | 
| Chris@152 | 159 | 
| Chris@152 | 160     size_t m_sampleRate; | 
| Chris@152 | 161     size_t m_resolution; | 
| Chris@152 | 162     size_t m_yBinCount; | 
| Chris@535 | 163     CompressionType m_compression; | 
| Chris@152 | 164     float m_minimum; | 
| Chris@152 | 165     float m_maximum; | 
| Chris@256 | 166     bool m_haveExtents; | 
| Chris@152 | 167     bool m_notifyOnAdd; | 
| Chris@152 | 168     long m_sinceLastNotifyMin; | 
| Chris@152 | 169     long m_sinceLastNotifyMax; | 
| Chris@152 | 170     int m_completion; | 
| Chris@152 | 171 | 
| Chris@536 | 172     mutable QReadWriteLock m_lock; | 
| Chris@152 | 173 }; | 
| Chris@152 | 174 | 
| Chris@152 | 175 #endif |