annotate data/model/EditableDenseThreeDimensionalModel.h @ 661:a4faa1840384

* If a FileSource URL won't convert at all in strict mode, try again in tolerant mode (necessary for e.g. filenames with square brackets in them)
author Chris Cannam
date Tue, 19 Oct 2010 21:47:55 +0100
parents dd97f7b3d120
children 33fca917c800
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@152 130 virtual QString getBinName(size_t n) const;
Chris@152 131 virtual void setBinName(size_t n, QString);
Chris@152 132 virtual void setBinNames(std::vector<QString> names);
Chris@152 133
Chris@478 134 bool shouldUseLogValueScale() const;
Chris@478 135
Chris@333 136 virtual void setCompletion(int completion, bool update = true);
Chris@152 137 virtual int getCompletion() const { return m_completion; }
Chris@152 138
Chris@345 139 QString getTypeName() const { return tr("Editable Dense 3-D"); }
Chris@345 140
Chris@318 141 virtual QString toDelimitedDataString(QString delimiter) const;
Chris@318 142
Chris@152 143 virtual void toXml(QTextStream &out,
Chris@152 144 QString indent = "",
Chris@152 145 QString extraAttributes = "") const;
Chris@152 146
Chris@152 147 protected:
Chris@533 148 typedef QVector<Column> ValueMatrix;
Chris@152 149 ValueMatrix m_data;
Chris@152 150
Chris@535 151 // m_trunc is used for simple compression. If at least the top N
Chris@535 152 // elements of column x (for N = some proportion of the column
Chris@535 153 // height) are equal to those of an earlier column x', then
Chris@535 154 // m_trunc[x] will contain x-x' and column x will be truncated so
Chris@535 155 // as to remove the duplicate elements. If the equal elements are
Chris@535 156 // at the bottom, then m_trunc[x] will contain x'-x (a negative
Chris@535 157 // value). If m_trunc[x] is 0 then the whole of column x is
Chris@535 158 // stored.
Chris@535 159 std::vector<signed char> m_trunc;
Chris@534 160 void truncateAndStore(size_t index, const Column & values);
Chris@534 161 Column expandAndRetrieve(size_t index) const;
Chris@534 162
Chris@152 163 std::vector<QString> m_binNames;
Chris@152 164
Chris@611 165 size_t m_startFrame;
Chris@152 166 size_t m_sampleRate;
Chris@152 167 size_t m_resolution;
Chris@152 168 size_t m_yBinCount;
Chris@535 169 CompressionType m_compression;
Chris@152 170 float m_minimum;
Chris@152 171 float m_maximum;
Chris@256 172 bool m_haveExtents;
Chris@152 173 bool m_notifyOnAdd;
Chris@152 174 long m_sinceLastNotifyMin;
Chris@152 175 long m_sinceLastNotifyMax;
Chris@152 176 int m_completion;
Chris@152 177
Chris@536 178 mutable QReadWriteLock m_lock;
Chris@152 179 };
Chris@152 180
Chris@152 181 #endif