annotate data/model/SparseOneDimensionalModel.h @ 263:71dfc6ab3b54

* Threaded mp3/ogg file reading. Not activated yet, as it doesn't work in context (SV needs to know the duration of its main model at the outset)
author Chris Cannam
date Thu, 24 May 2007 16:20:22 +0000
parents 4b2ea82fd0ed
children 70a232b1f12a
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@147 23 struct OneDimensionalPoint
Chris@147 24 {
Chris@147 25 public:
Chris@147 26 OneDimensionalPoint(long _frame) : frame(_frame) { }
Chris@147 27 OneDimensionalPoint(long _frame, QString _label) : frame(_frame), label(_label) { }
Chris@147 28
Chris@147 29 int getDimensions() const { return 1; }
Chris@147 30
Chris@147 31 long frame;
Chris@147 32 QString label;
Chris@147 33
Chris@147 34 QString toXmlString(QString indent = "",
Chris@147 35 QString extraAttributes = "") const
Chris@147 36 {
Chris@147 37 return QString("%1<point frame=\"%2\" label=\"%3\" %4/>\n")
Chris@147 38 .arg(indent).arg(frame).arg(label).arg(extraAttributes);
Chris@147 39 }
Chris@147 40
Chris@147 41 QString toDelimitedDataString(QString delimiter, size_t sampleRate) const
Chris@147 42 {
Chris@147 43 QStringList list;
Chris@147 44 list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str();
Chris@147 45 list << label;
Chris@147 46 return list.join(delimiter);
Chris@147 47 }
Chris@147 48
Chris@147 49 struct Comparator {
Chris@147 50 bool operator()(const OneDimensionalPoint &p1,
Chris@147 51 const OneDimensionalPoint &p2) const {
Chris@147 52 if (p1.frame != p2.frame) return p1.frame < p2.frame;
Chris@147 53 return p1.label < p2.label;
Chris@147 54 }
Chris@147 55 };
Chris@147 56
Chris@147 57 struct OrderComparator {
Chris@147 58 bool operator()(const OneDimensionalPoint &p1,
Chris@147 59 const OneDimensionalPoint &p2) const {
Chris@147 60 return p1.frame < p2.frame;
Chris@147 61 }
Chris@147 62 };
Chris@147 63 };
Chris@147 64
Chris@147 65
Chris@147 66 class SparseOneDimensionalModel : public SparseModel<OneDimensionalPoint>
Chris@147 67 {
Chris@147 68 public:
Chris@147 69 SparseOneDimensionalModel(size_t sampleRate, size_t resolution,
Chris@147 70 bool notifyOnAdd = true) :
Chris@147 71 SparseModel<OneDimensionalPoint>(sampleRate, resolution, notifyOnAdd)
Chris@147 72 {
Chris@147 73 PlayParameterRepository::getInstance()->addModel(this);
Chris@147 74 }
Chris@147 75
Chris@147 76 int getIndexOf(const Point &point) {
Chris@147 77 // slow
Chris@147 78 int i = 0;
Chris@147 79 Point::Comparator comparator;
Chris@147 80 for (PointList::const_iterator j = m_points.begin();
Chris@147 81 j != m_points.end(); ++j, ++i) {
Chris@147 82 if (!comparator(*j, point) && !comparator(point, *j)) return i;
Chris@147 83 }
Chris@147 84 return -1;
Chris@147 85 }
Chris@147 86 };
Chris@147 87
Chris@147 88 #endif
Chris@147 89
Chris@147 90
Chris@147 91