annotate data/model/SparseOneDimensionalModel.h @ 392:183ee2a55fc7

* More work to abstract out interactive components used in the data library, so that it does not need to depend on QtGui.
author Chris Cannam
date Fri, 14 Mar 2008 17:14:21 +0000
parents 5858cc462d0a
children 50a956688baa
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@147 43 .arg(indent).arg(frame).arg(label).arg(extraAttributes);
Chris@147 44 }
Chris@147 45
Chris@147 46 QString toDelimitedDataString(QString delimiter, size_t sampleRate) const
Chris@147 47 {
Chris@147 48 QStringList list;
Chris@147 49 list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str();
Chris@318 50 if (label != "") list << label;
Chris@147 51 return list.join(delimiter);
Chris@147 52 }
Chris@147 53
Chris@147 54 struct Comparator {
Chris@147 55 bool operator()(const OneDimensionalPoint &p1,
Chris@147 56 const OneDimensionalPoint &p2) const {
Chris@147 57 if (p1.frame != p2.frame) return p1.frame < p2.frame;
Chris@147 58 return p1.label < p2.label;
Chris@147 59 }
Chris@147 60 };
Chris@147 61
Chris@147 62 struct OrderComparator {
Chris@147 63 bool operator()(const OneDimensionalPoint &p1,
Chris@147 64 const OneDimensionalPoint &p2) const {
Chris@147 65 return p1.frame < p2.frame;
Chris@147 66 }
Chris@147 67 };
Chris@147 68 };
Chris@147 69
Chris@147 70
Chris@147 71 class SparseOneDimensionalModel : public SparseModel<OneDimensionalPoint>
Chris@147 72 {
Chris@147 73 public:
Chris@147 74 SparseOneDimensionalModel(size_t sampleRate, size_t resolution,
Chris@147 75 bool notifyOnAdd = true) :
Chris@147 76 SparseModel<OneDimensionalPoint>(sampleRate, resolution, notifyOnAdd)
Chris@147 77 {
Chris@391 78 PlayParameterRepository::getInstance()->addPlayable(this);
Chris@391 79 }
Chris@391 80
Chris@391 81 virtual ~SparseOneDimensionalModel()
Chris@391 82 {
Chris@391 83 PlayParameterRepository::getInstance()->removePlayable(this);
Chris@391 84 }
Chris@391 85
Chris@391 86 virtual bool canPlay() const { return true; }
Chris@391 87
Chris@391 88 virtual QString getDefaultPlayPluginId() const
Chris@391 89 {
Chris@391 90 return "dssi:_builtin:sample_player";
Chris@391 91 }
Chris@391 92
Chris@391 93 virtual QString getDefaultPlayPluginConfiguration() const
Chris@391 94 {
Chris@391 95 return "<plugin program=\"tap\"/>";
Chris@147 96 }
Chris@147 97
Chris@147 98 int getIndexOf(const Point &point) {
Chris@147 99 // slow
Chris@147 100 int i = 0;
Chris@147 101 Point::Comparator comparator;
Chris@147 102 for (PointList::const_iterator j = m_points.begin();
Chris@147 103 j != m_points.end(); ++j, ++i) {
Chris@147 104 if (!comparator(*j, point) && !comparator(point, *j)) return i;
Chris@147 105 }
Chris@147 106 return -1;
Chris@147 107 }
Chris@345 108
Chris@345 109 QString getTypeName() const { return tr("Sparse 1-D"); }
Chris@147 110 };
Chris@147 111
Chris@147 112 #endif
Chris@147 113
Chris@147 114
Chris@147 115