annotate data/model/DenseThreeDimensionalModel.h @ 1179:6b1af0f05f06 pluginscan

Make use of, and warn for, the plugin checker for all types of plugin. Haven't yet resolved the question of how to install and find it.
author Chris Cannam
date Thu, 14 Apr 2016 14:03:18 +0100
parents abb78e824820
children fd40a5335968
rev   line source
Chris@147 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@147 2
Chris@147 3 /*
Chris@147 4 Sonic Visualiser
Chris@147 5 An audio file viewer and annotation editor.
Chris@147 6 Centre for Digital Music, Queen Mary, University of London.
Chris@202 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@147 8
Chris@147 9 This program is free software; you can redistribute it and/or
Chris@147 10 modify it under the terms of the GNU General Public License as
Chris@147 11 published by the Free Software Foundation; either version 2 of the
Chris@147 12 License, or (at your option) any later version. See the file
Chris@147 13 COPYING included with this distribution for more information.
Chris@147 14 */
Chris@147 15
Chris@147 16 #ifndef _DENSE_THREE_DIMENSIONAL_MODEL_H_
Chris@147 17 #define _DENSE_THREE_DIMENSIONAL_MODEL_H_
Chris@147 18
Chris@150 19 #include "Model.h"
Chris@500 20 #include "TabularModel.h"
Chris@147 21 #include "base/ZoomConstraint.h"
Chris@500 22 #include "base/RealTime.h"
Chris@147 23
Chris@147 24 #include <QMutex>
Chris@533 25 #include <QVector>
Chris@147 26
Chris@500 27 class DenseThreeDimensionalModel : public Model,
Chris@500 28 public TabularModel
Chris@147 29 {
Chris@147 30 Q_OBJECT
Chris@147 31
Chris@147 32 public:
Chris@147 33 /**
Chris@182 34 * Return the number of sample frames covered by each column of bins.
Chris@147 35 */
Chris@929 36 virtual int getResolution() const = 0;
Chris@147 37
Chris@147 38 /**
Chris@182 39 * Return the number of columns of bins in the model.
Chris@147 40 */
Chris@929 41 virtual int getWidth() const = 0;
Chris@147 42
Chris@147 43 /**
Chris@182 44 * Return the number of bins in each column.
Chris@182 45 */
Chris@929 46 virtual int getHeight() const = 0;
Chris@182 47
Chris@182 48 /**
Chris@182 49 * Return the minimum permissible value in each bin.
Chris@147 50 */
Chris@152 51 virtual float getMinimumLevel() const = 0;
Chris@147 52
Chris@147 53 /**
Chris@182 54 * Return the maximum permissible value in each bin.
Chris@147 55 */
Chris@152 56 virtual float getMaximumLevel() const = 0;
Chris@147 57
Chris@1154 58 typedef std::vector<float> Column;
Chris@147 59
Chris@147 60 /**
Chris@182 61 * Get data from the given column of bin values.
Chris@147 62 */
Chris@929 63 virtual Column getColumn(int column) const = 0;
Chris@147 64
Chris@147 65 /**
Chris@182 66 * Get the single data point from the n'th bin of the given column.
Chris@147 67 */
Chris@929 68 virtual float getValueAt(int column, int n) const = 0;
Chris@147 69
Chris@182 70 /**
Chris@182 71 * Get the name of a given bin (i.e. a label to associate with
Chris@182 72 * that bin across all columns).
Chris@182 73 */
Chris@929 74 virtual QString getBinName(int n) const = 0;
Chris@147 75
Chris@182 76 /**
Chris@887 77 * Return true if the bins have values as well as names. If this
Chris@887 78 * returns true, getBinValue() may be used to retrieve the values.
Chris@887 79 */
Chris@887 80 virtual bool hasBinValues() const { return false; }
Chris@887 81
Chris@887 82 /**
Chris@887 83 * Return the value of bin n, if any. This is a "vertical scale"
Chris@887 84 * value which does not vary from one column to the next. This is
Chris@887 85 * only meaningful if hasBinValues() returns true.
Chris@887 86 */
Chris@1038 87 virtual float getBinValue(int n) const { return float(n); }
Chris@887 88
Chris@887 89 /**
Chris@887 90 * Obtain the name of the unit of the values returned from
Chris@887 91 * getBinValue(), if any.
Chris@887 92 */
Chris@887 93 virtual QString getBinValueUnit() const { return ""; }
Chris@887 94
Chris@887 95 /**
Chris@478 96 * Estimate whether a logarithmic scale might be appropriate for
Chris@478 97 * the value scale.
Chris@478 98 */
Chris@478 99 virtual bool shouldUseLogValueScale() const = 0;
Chris@478 100
Chris@478 101 /**
Chris@182 102 * Utility function to query whether a given bin is greater than
Chris@182 103 * its (vertical) neighbours.
Chris@182 104 */
Chris@929 105 bool isLocalPeak(int x, int y) {
Chris@182 106 float value = getValueAt(x, y);
Chris@182 107 if (y > 0 && value < getValueAt(x, y - 1)) return false;
Chris@182 108 if (y < getHeight() - 1 && value < getValueAt(x, y + 1)) return false;
Chris@182 109 return true;
Chris@182 110 }
Chris@182 111
Chris@182 112 /**
Chris@182 113 * Utility function to query whether a given bin is greater than a
Chris@182 114 * certain threshold.
Chris@182 115 */
Chris@929 116 bool isOverThreshold(int x, int y, float threshold) {
Chris@182 117 return getValueAt(x, y) > threshold;
Chris@182 118 }
Chris@182 119
Chris@345 120 QString getTypeName() const { return tr("Dense 3-D"); }
Chris@345 121
Chris@152 122 virtual int getCompletion() const = 0;
Chris@147 123
Chris@500 124 /*
Chris@500 125 TabularModel methods.
Chris@500 126 This class is non-editable -- subclasses may be editable.
Chris@500 127 Row and column are transposed for the tabular view (which is
Chris@500 128 "on its side").
Chris@500 129 */
Chris@500 130
Chris@500 131 virtual int getRowCount() const { return getWidth(); }
Chris@500 132 virtual int getColumnCount() const { return getHeight() + 2; }
Chris@500 133
Chris@500 134 virtual QString getHeading(int column) const
Chris@500 135 {
Chris@500 136 switch (column) {
Chris@500 137 case 0: return tr("Time");
Chris@500 138 case 1: return tr("Frame");
Chris@500 139 default: return getBinName(column - 2);
Chris@500 140 }
Chris@500 141 }
Chris@500 142
Chris@568 143 virtual QVariant getData(int row, int column, int) const
Chris@500 144 {
Chris@500 145 switch (column) {
Chris@500 146 case 0: {
Chris@1171 147 RealTime rt = RealTime::frame2RealTime
Chris@1171 148 (row * getResolution() + getStartFrame(), getSampleRate());
Chris@500 149 return rt.toText().c_str();
Chris@500 150 }
Chris@500 151 case 1:
Chris@1171 152 return int(row * getResolution() + getStartFrame());
Chris@500 153 default:
Chris@500 154 return getValueAt(row, column - 2);
Chris@500 155 }
Chris@500 156 }
Chris@500 157
Chris@500 158 virtual bool isColumnTimeValue(int col) const {
Chris@500 159 return col < 2;
Chris@500 160 }
Chris@568 161 virtual SortType getSortType(int) const {
Chris@500 162 return SortNumeric;
Chris@500 163 }
Chris@500 164
Chris@1038 165 virtual sv_frame_t getFrameForRow(int row) const {
Chris@1171 166 return sv_frame_t(row) * getResolution() + getStartFrame();
Chris@500 167 }
Chris@1038 168 virtual int getRowForFrame(sv_frame_t frame) const {
Chris@1171 169 return int((frame - getStartFrame()) / getResolution());
Chris@500 170 }
Chris@500 171
Chris@147 172 protected:
Chris@152 173 DenseThreeDimensionalModel() { }
Chris@147 174 };
Chris@147 175
Chris@147 176 #endif