annotate data/model/EditableDenseThreeDimensionalModel.h @ 881:816c751a7979

Comments
author Chris Cannam
date Fri, 31 Jan 2014 17:25:24 +0000
parents 33fca917c800
children 48410857b03c
rev   line source
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@611 61 * Set the frame offset of the first column.
Chris@611 62 */
Chris@611 63 virtual void setStartFrame(size_t);
Chris@611 64
Chris@611 65 /**
Chris@152 66 * Return the number of sample frames covered by each set of bins.
Chris@152 67 */
Chris@152 68 virtual size_t getResolution() const;
Chris@152 69
Chris@152 70 /**
Chris@152 71 * Set the number of sample frames covered by each set of bins.
Chris@152 72 */
Chris@152 73 virtual void setResolution(size_t sz);
Chris@152 74
Chris@152 75 /**
Chris@182 76 * Return the number of columns.
Chris@182 77 */
Chris@182 78 virtual size_t getWidth() const;
Chris@182 79
Chris@182 80 /**
Chris@152 81 * Return the number of bins in each set of bins.
Chris@152 82 */
Chris@182 83 virtual size_t getHeight() const;
Chris@152 84
Chris@152 85 /**
Chris@152 86 * Set the number of bins in each set of bins.
Chris@152 87 */
Chris@182 88 virtual void setHeight(size_t sz);
Chris@152 89
Chris@152 90 /**
Chris@152 91 * Return the minimum value of the value in each bin.
Chris@152 92 */
Chris@152 93 virtual float getMinimumLevel() const;
Chris@152 94
Chris@152 95 /**
Chris@152 96 * Set the minimum value of the value in a bin.
Chris@152 97 */
Chris@152 98 virtual void setMinimumLevel(float sz);
Chris@152 99
Chris@152 100 /**
Chris@152 101 * Return the maximum value of the value in each bin.
Chris@152 102 */
Chris@152 103 virtual float getMaximumLevel() const;
Chris@152 104
Chris@152 105 /**
Chris@152 106 * Set the maximum value of the value in a bin.
Chris@152 107 */
Chris@152 108 virtual void setMaximumLevel(float sz);
Chris@152 109
Chris@182 110 /**
Chris@182 111 * Return true if there are data available for the given column.
Chris@182 112 */
Chris@182 113 virtual bool isColumnAvailable(size_t x) const { return x < getWidth(); }
Chris@152 114
Chris@152 115 /**
Chris@182 116 * Get the set of bin values at the given column.
Chris@152 117 */
Chris@533 118 virtual Column getColumn(size_t x) const;
Chris@152 119
Chris@152 120 /**
Chris@182 121 * Get a single value, from the n'th bin of the given column.
Chris@152 122 */
Chris@182 123 virtual float getValueAt(size_t x, size_t n) const;
Chris@152 124
Chris@152 125 /**
Chris@182 126 * Set the entire set of bin values at the given column.
Chris@152 127 */
Chris@182 128 virtual void setColumn(size_t x, const Column &values);
Chris@152 129
Chris@881 130 /**
Chris@881 131 * Return the name of bin n. This is a single label per bin that
Chris@881 132 * does not vary from one column to the next.
Chris@881 133 */
Chris@152 134 virtual QString getBinName(size_t n) const;
Chris@881 135
Chris@881 136 /**
Chris@881 137 * Set the name of bin n.
Chris@881 138 */
Chris@152 139 virtual void setBinName(size_t n, QString);
Chris@881 140
Chris@881 141 /**
Chris@881 142 * Set the names of all bins.
Chris@881 143 */
Chris@152 144 virtual void setBinNames(std::vector<QString> names);
Chris@152 145
Chris@881 146 /**
Chris@881 147 * Return true if the distribution of values in the bins is such
Chris@881 148 * as to suggest a log scale (mapping to colour etc) may be better
Chris@881 149 * than a linear one.
Chris@881 150 */
Chris@478 151 bool shouldUseLogValueScale() const;
Chris@478 152
Chris@333 153 virtual void setCompletion(int completion, bool update = true);
Chris@152 154 virtual int getCompletion() const { return m_completion; }
Chris@152 155
Chris@345 156 QString getTypeName() const { return tr("Editable Dense 3-D"); }
Chris@345 157
Chris@318 158 virtual QString toDelimitedDataString(QString delimiter) const;
Chris@838 159 virtual QString toDelimitedDataString(QString delimiter, size_t f0, size_t f1) const;
Chris@318 160
Chris@152 161 virtual void toXml(QTextStream &out,
Chris@152 162 QString indent = "",
Chris@152 163 QString extraAttributes = "") const;
Chris@152 164
Chris@152 165 protected:
Chris@533 166 typedef QVector<Column> ValueMatrix;
Chris@152 167 ValueMatrix m_data;
Chris@152 168
Chris@535 169 // m_trunc is used for simple compression. If at least the top N
Chris@535 170 // elements of column x (for N = some proportion of the column
Chris@535 171 // height) are equal to those of an earlier column x', then
Chris@535 172 // m_trunc[x] will contain x-x' and column x will be truncated so
Chris@535 173 // as to remove the duplicate elements. If the equal elements are
Chris@535 174 // at the bottom, then m_trunc[x] will contain x'-x (a negative
Chris@535 175 // value). If m_trunc[x] is 0 then the whole of column x is
Chris@535 176 // stored.
Chris@535 177 std::vector<signed char> m_trunc;
Chris@534 178 void truncateAndStore(size_t index, const Column & values);
Chris@534 179 Column expandAndRetrieve(size_t index) const;
Chris@534 180
Chris@152 181 std::vector<QString> m_binNames;
Chris@152 182
Chris@611 183 size_t m_startFrame;
Chris@152 184 size_t m_sampleRate;
Chris@152 185 size_t m_resolution;
Chris@152 186 size_t m_yBinCount;
Chris@535 187 CompressionType m_compression;
Chris@152 188 float m_minimum;
Chris@152 189 float m_maximum;
Chris@256 190 bool m_haveExtents;
Chris@152 191 bool m_notifyOnAdd;
Chris@152 192 long m_sinceLastNotifyMin;
Chris@152 193 long m_sinceLastNotifyMax;
Chris@152 194 int m_completion;
Chris@152 195
Chris@536 196 mutable QReadWriteLock m_lock;
Chris@152 197 };
Chris@152 198
Chris@152 199 #endif