annotate data/model/EditableDenseThreeDimensionalModel.h @ 1725:78fe29adfd16

Re-implement extendEndFrame behaviour, used by Tony application
author Chris Cannam
date Wed, 19 Jun 2019 13:32:52 +0100
parents 81f50b70bdef
children d484490cdf69
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@1581 16 #ifndef SV_EDITABLE_DENSE_THREE_DIMENSIONAL_MODEL_H
Chris@1581 17 #define SV_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@1040 45 EditableDenseThreeDimensionalModel(sv_samplerate_t sampleRate,
Chris@1429 46 int resolution,
Chris@1429 47 int height,
Chris@535 48 CompressionType compression,
Chris@1429 49 bool notifyOnAdd = true);
Chris@152 50
Chris@1580 51 bool isOK() const override;
Chris@1701 52 bool isReady(int *completion = 0) const override;
Chris@1701 53 void setCompletion(int completion, bool update = true);
Chris@1701 54 int getCompletion() const override;
Chris@152 55
Chris@1580 56 sv_samplerate_t getSampleRate() const override;
Chris@1580 57 sv_frame_t getStartFrame() const override;
Chris@1725 58 sv_frame_t getTrueEndFrame() const override;
Chris@152 59
Chris@152 60 /**
Chris@611 61 * Set the frame offset of the first column.
Chris@611 62 */
Chris@1038 63 virtual void setStartFrame(sv_frame_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@1580 68 int getResolution() const override;
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@929 73 virtual void setResolution(int sz);
Chris@152 74
Chris@152 75 /**
Chris@182 76 * Return the number of columns.
Chris@182 77 */
Chris@1580 78 int getWidth() const override;
Chris@182 79
Chris@182 80 /**
Chris@1252 81 * Return the number of bins in each column.
Chris@152 82 */
Chris@1580 83 int getHeight() const override;
Chris@152 84
Chris@152 85 /**
Chris@1252 86 * Set the number of bins in each column.
Chris@1252 87 *
Chris@1252 88 * You can set (via setColumn) a vector of any length as a column,
Chris@1252 89 * but any column being retrieved will be resized to this height
Chris@1252 90 * (or the height that was supplied to the constructor, if this is
Chris@1252 91 * never called) on retrieval. That is, the model owner determines
Chris@1252 92 * the height of the model at a single stroke; the columns
Chris@1252 93 * themselves don't have any effect on the height of the model.
Chris@152 94 */
Chris@929 95 virtual void setHeight(int sz);
Chris@152 96
Chris@152 97 /**
Chris@152 98 * Return the minimum value of the value in each bin.
Chris@152 99 */
Chris@1580 100 float getMinimumLevel() const override;
Chris@152 101
Chris@152 102 /**
Chris@152 103 * Set the minimum value of the value in a bin.
Chris@152 104 */
Chris@152 105 virtual void setMinimumLevel(float sz);
Chris@152 106
Chris@152 107 /**
Chris@152 108 * Return the maximum value of the value in each bin.
Chris@152 109 */
Chris@1580 110 float getMaximumLevel() const override;
Chris@152 111
Chris@152 112 /**
Chris@152 113 * Set the maximum value of the value in a bin.
Chris@152 114 */
Chris@152 115 virtual void setMaximumLevel(float sz);
Chris@152 116
Chris@182 117 /**
Chris@182 118 * Get the set of bin values at the given column.
Chris@152 119 */
Chris@1580 120 Column getColumn(int x) const override;
Chris@152 121
Chris@152 122 /**
Chris@182 123 * Get a single value, from the n'th bin of the given column.
Chris@152 124 */
Chris@1580 125 float getValueAt(int x, int n) const override;
Chris@152 126
Chris@152 127 /**
Chris@182 128 * Set the entire set of bin values at the given column.
Chris@152 129 */
Chris@929 130 virtual void setColumn(int x, const Column &values);
Chris@152 131
Chris@881 132 /**
Chris@881 133 * Return the name of bin n. This is a single label per bin that
Chris@881 134 * does not vary from one column to the next.
Chris@881 135 */
Chris@1580 136 QString getBinName(int n) const override;
Chris@881 137
Chris@881 138 /**
Chris@881 139 * Set the name of bin n.
Chris@881 140 */
Chris@929 141 virtual void setBinName(int n, QString);
Chris@881 142
Chris@881 143 /**
Chris@881 144 * Set the names of all bins.
Chris@881 145 */
Chris@152 146 virtual void setBinNames(std::vector<QString> names);
Chris@152 147
Chris@881 148 /**
Chris@886 149 * Return true if the bins have values as well as names. (The
Chris@886 150 * values may have been derived from the names, e.g. by parsing
Chris@886 151 * numbers from them.) If this returns true, getBinValue() may be
Chris@886 152 * used to retrieve the values.
Chris@886 153 */
Chris@1580 154 bool hasBinValues() const override;
Chris@886 155
Chris@886 156 /**
Chris@886 157 * Return the value of bin n, if any. This is a "vertical scale"
Chris@886 158 * value which does not vary from one column to the next. This is
Chris@886 159 * only meaningful if hasBinValues() returns true.
Chris@886 160 */
Chris@1580 161 float getBinValue(int n) const override;
Chris@886 162
Chris@886 163 /**
Chris@886 164 * Set the values of all bins (separate from their labels). These
Chris@886 165 * are "vertical scale" values which do not vary from one column
Chris@886 166 * to the next.
Chris@886 167 */
Chris@886 168 virtual void setBinValues(std::vector<float> values);
Chris@886 169
Chris@886 170 /**
Chris@886 171 * Obtain the name of the unit of the values returned from
Chris@886 172 * getBinValue(), if any.
Chris@886 173 */
Chris@1580 174 QString getBinValueUnit() const override;
Chris@886 175
Chris@886 176 /**
Chris@886 177 * Set the name of the unit of the values return from
Chris@886 178 * getBinValue() if any.
Chris@886 179 */
Chris@886 180 virtual void setBinValueUnit(QString unit);
Chris@886 181
Chris@886 182 /**
Chris@881 183 * Return true if the distribution of values in the bins is such
Chris@881 184 * as to suggest a log scale (mapping to colour etc) may be better
Chris@881 185 * than a linear one.
Chris@881 186 */
Chris@1580 187 bool shouldUseLogValueScale() const override;
Chris@478 188
Chris@1580 189 QString getTypeName() const override { return tr("Editable Dense 3-D"); }
Chris@345 190
Chris@1679 191 QString toDelimitedDataString(QString delimiter,
Chris@1679 192 DataExportOptions options,
Chris@1679 193 sv_frame_t startFrame,
Chris@1679 194 sv_frame_t duration) const override;
Chris@318 195
Chris@1580 196 void toXml(QTextStream &out,
Chris@152 197 QString indent = "",
Chris@1580 198 QString extraAttributes = "") const override;
Chris@152 199
Chris@152 200 protected:
Chris@1154 201 typedef std::vector<Column> ValueMatrix;
Chris@152 202 ValueMatrix m_data;
Chris@152 203
Chris@535 204 // m_trunc is used for simple compression. If at least the top N
Chris@535 205 // elements of column x (for N = some proportion of the column
Chris@535 206 // height) are equal to those of an earlier column x', then
Chris@535 207 // m_trunc[x] will contain x-x' and column x will be truncated so
Chris@535 208 // as to remove the duplicate elements. If the equal elements are
Chris@535 209 // at the bottom, then m_trunc[x] will contain x'-x (a negative
Chris@535 210 // value). If m_trunc[x] is 0 then the whole of column x is
Chris@535 211 // stored.
Chris@535 212 std::vector<signed char> m_trunc;
Chris@929 213 void truncateAndStore(int index, const Column & values);
Chris@929 214 Column expandAndRetrieve(int index) const;
Chris@1252 215 Column rightHeight(const Column &c) const;
Chris@534 216
Chris@152 217 std::vector<QString> m_binNames;
Chris@886 218 std::vector<float> m_binValues;
Chris@886 219 QString m_binValueUnit;
Chris@152 220
Chris@1038 221 sv_frame_t m_startFrame;
Chris@1040 222 sv_samplerate_t m_sampleRate;
Chris@929 223 int m_resolution;
Chris@929 224 int m_yBinCount;
Chris@535 225 CompressionType m_compression;
Chris@152 226 float m_minimum;
Chris@152 227 float m_maximum;
Chris@256 228 bool m_haveExtents;
Chris@152 229 bool m_notifyOnAdd;
Chris@1110 230 sv_frame_t m_sinceLastNotifyMin;
Chris@1110 231 sv_frame_t m_sinceLastNotifyMax;
Chris@152 232 int m_completion;
Chris@152 233
Chris@536 234 mutable QReadWriteLock m_lock;
Chris@152 235 };
Chris@152 236
Chris@152 237 #endif