annotate data/model/SparseOneDimensionalModel.h @ 823:f0558e69a074

Rename Resampling- to DecodingWavFileReader, and use it whenever we have an audio file that is not quickly seekable using libsndfile. Avoids very slow performance when analysing ogg files.
author Chris Cannam
date Wed, 17 Jul 2013 15:40:01 +0100
parents e22b6e89a7f7
children d6bd5751b8f6
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@147 7 This file copyright 2006 Chris Cannam.
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 _SPARSE_ONE_DIMENSIONAL_MODEL_H_
Chris@147 17 #define _SPARSE_ONE_DIMENSIONAL_MODEL_H_
Chris@147 18
Chris@147 19 #include "SparseModel.h"
Chris@150 20 #include "base/PlayParameterRepository.h"
Chris@147 21 #include "base/RealTime.h"
Chris@147 22
Chris@387 23 #include <QStringList>
Chris@387 24
Chris@147 25 struct OneDimensionalPoint
Chris@147 26 {
Chris@147 27 public:
Chris@147 28 OneDimensionalPoint(long _frame) : frame(_frame) { }
Chris@147 29 OneDimensionalPoint(long _frame, QString _label) : frame(_frame), label(_label) { }
Chris@147 30
Chris@147 31 int getDimensions() const { return 1; }
Chris@147 32
Chris@147 33 long frame;
Chris@147 34 QString label;
Chris@338 35
Chris@338 36 QString getLabel() const { return label; }
Chris@338 37
Chris@314 38 void toXml(QTextStream &stream,
Chris@314 39 QString indent = "",
Chris@314 40 QString extraAttributes = "") const
Chris@147 41 {
Chris@314 42 stream << QString("%1<point frame=\"%2\" label=\"%3\" %4/>\n")
Chris@603 43 .arg(indent).arg(frame).arg(XmlExportable::encodeEntities(label))
Chris@603 44 .arg(extraAttributes);
Chris@147 45 }
Chris@147 46
Chris@147 47 QString toDelimitedDataString(QString delimiter, size_t sampleRate) const
Chris@147 48 {
Chris@147 49 QStringList list;
Chris@147 50 list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str();
Chris@318 51 if (label != "") list << label;
Chris@147 52 return list.join(delimiter);
Chris@147 53 }
Chris@147 54
Chris@147 55 struct Comparator {
Chris@147 56 bool operator()(const OneDimensionalPoint &p1,
Chris@147 57 const OneDimensionalPoint &p2) const {
Chris@147 58 if (p1.frame != p2.frame) return p1.frame < p2.frame;
Chris@147 59 return p1.label < p2.label;
Chris@147 60 }
Chris@147 61 };
Chris@147 62
Chris@147 63 struct OrderComparator {
Chris@147 64 bool operator()(const OneDimensionalPoint &p1,
Chris@147 65 const OneDimensionalPoint &p2) const {
Chris@147 66 return p1.frame < p2.frame;
Chris@147 67 }
Chris@147 68 };
Chris@147 69 };
Chris@147 70
Chris@147 71
Chris@147 72 class SparseOneDimensionalModel : public SparseModel<OneDimensionalPoint>
Chris@147 73 {
Chris@423 74 Q_OBJECT
Chris@423 75
Chris@147 76 public:
Chris@147 77 SparseOneDimensionalModel(size_t sampleRate, size_t resolution,
Chris@147 78 bool notifyOnAdd = true) :
Chris@147 79 SparseModel<OneDimensionalPoint>(sampleRate, resolution, notifyOnAdd)
Chris@147 80 {
Chris@391 81 PlayParameterRepository::getInstance()->addPlayable(this);
Chris@391 82 }
Chris@391 83
Chris@391 84 virtual ~SparseOneDimensionalModel()
Chris@391 85 {
Chris@391 86 PlayParameterRepository::getInstance()->removePlayable(this);
Chris@391 87 }
Chris@391 88
Chris@391 89 virtual bool canPlay() const { return true; }
Chris@391 90
Chris@391 91 virtual QString getDefaultPlayPluginId() const
Chris@391 92 {
Chris@391 93 return "dssi:_builtin:sample_player";
Chris@391 94 }
Chris@391 95
Chris@391 96 virtual QString getDefaultPlayPluginConfiguration() const
Chris@391 97 {
Chris@391 98 return "<plugin program=\"tap\"/>";
Chris@147 99 }
Chris@147 100
Chris@420 101 int getIndexOf(const Point &point)
Chris@420 102 {
Chris@147 103 // slow
Chris@147 104 int i = 0;
Chris@147 105 Point::Comparator comparator;
Chris@147 106 for (PointList::const_iterator j = m_points.begin();
Chris@147 107 j != m_points.end(); ++j, ++i) {
Chris@147 108 if (!comparator(*j, point) && !comparator(point, *j)) return i;
Chris@147 109 }
Chris@147 110 return -1;
Chris@147 111 }
Chris@345 112
Chris@345 113 QString getTypeName() const { return tr("Sparse 1-D"); }
Chris@420 114
Chris@420 115 /**
Chris@420 116 * TabularModel methods.
Chris@420 117 */
Chris@420 118
Chris@420 119 virtual int getColumnCount() const
Chris@420 120 {
Chris@420 121 return 3;
Chris@420 122 }
Chris@420 123
Chris@420 124 virtual QString getHeading(int column) const
Chris@420 125 {
Chris@420 126 switch (column) {
Chris@420 127 case 0: return tr("Time");
Chris@420 128 case 1: return tr("Frame");
Chris@420 129 case 2: return tr("Label");
Chris@420 130 default: return tr("Unknown");
Chris@420 131 }
Chris@420 132 }
Chris@420 133
Chris@420 134 virtual QVariant getData(int row, int column, int role) const
Chris@420 135 {
Chris@425 136 if (column < 2) {
Chris@425 137 return SparseModel<OneDimensionalPoint>::getData
Chris@425 138 (row, column, role);
Chris@425 139 }
Chris@425 140
Chris@606 141 PointListConstIterator i = getPointListIteratorForRow(row);
Chris@420 142 if (i == m_points.end()) return QVariant();
Chris@420 143
Chris@420 144 switch (column) {
Chris@422 145 case 2: return i->label;
Chris@420 146 default: return QVariant();
Chris@420 147 }
Chris@420 148 }
Chris@420 149
Chris@424 150 virtual Command *getSetDataCommand(int row, int column, const QVariant &value, int role)
Chris@424 151 {
Chris@425 152 if (column < 2) {
Chris@425 153 return SparseModel<OneDimensionalPoint>::getSetDataCommand
Chris@425 154 (row, column, value, role);
Chris@425 155 }
Chris@425 156
Chris@740 157 if (role != Qt::EditRole) return 0;
Chris@606 158 PointListConstIterator i = getPointListIteratorForRow(row);
Chris@740 159 if (i == m_points.end()) return 0;
Chris@424 160 EditCommand *command = new EditCommand(this, tr("Edit Data"));
Chris@424 161
Chris@424 162 Point point(*i);
Chris@424 163 command->deletePoint(point);
Chris@424 164
Chris@424 165 switch (column) {
Chris@424 166 case 2: point.label = value.toString(); break;
Chris@424 167 }
Chris@424 168
Chris@424 169 command->addPoint(point);
Chris@424 170 return command->finish();
Chris@424 171 }
Chris@424 172
Chris@427 173
Chris@420 174 virtual bool isColumnTimeValue(int column) const
Chris@420 175 {
Chris@420 176 return (column < 2);
Chris@420 177 }
Chris@422 178
Chris@422 179 virtual SortType getSortType(int column) const
Chris@422 180 {
Chris@422 181 if (column == 2) return SortAlphabetical;
Chris@422 182 return SortNumeric;
Chris@422 183 }
Chris@147 184 };
Chris@147 185
Chris@147 186 #endif
Chris@147 187
Chris@147 188
Chris@147 189