annotate data/model/SparseOneDimensionalModel.h @ 360:ac300d385ab2

* Various fixes to object lifetime management, particularly in the spectrum layer and for notification of main model deletion. The main purpose of this is to improve the behaviour of the spectrum, but I think it may also help with #1840922 Various crashes in Layer Summary window.
author Chris Cannam
date Wed, 23 Jan 2008 15:43:27 +0000
parents 700cd3350391
children 7aa1de571880
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@338 33
Chris@338 34 QString getLabel() const { return label; }
Chris@338 35
Chris@314 36 void toXml(QTextStream &stream,
Chris@314 37 QString indent = "",
Chris@314 38 QString extraAttributes = "") const
Chris@147 39 {
Chris@314 40 stream << QString("%1<point frame=\"%2\" label=\"%3\" %4/>\n")
Chris@147 41 .arg(indent).arg(frame).arg(label).arg(extraAttributes);
Chris@147 42 }
Chris@147 43
Chris@147 44 QString toDelimitedDataString(QString delimiter, size_t sampleRate) const
Chris@147 45 {
Chris@147 46 QStringList list;
Chris@147 47 list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str();
Chris@318 48 if (label != "") list << label;
Chris@147 49 return list.join(delimiter);
Chris@147 50 }
Chris@147 51
Chris@147 52 struct Comparator {
Chris@147 53 bool operator()(const OneDimensionalPoint &p1,
Chris@147 54 const OneDimensionalPoint &p2) const {
Chris@147 55 if (p1.frame != p2.frame) return p1.frame < p2.frame;
Chris@147 56 return p1.label < p2.label;
Chris@147 57 }
Chris@147 58 };
Chris@147 59
Chris@147 60 struct OrderComparator {
Chris@147 61 bool operator()(const OneDimensionalPoint &p1,
Chris@147 62 const OneDimensionalPoint &p2) const {
Chris@147 63 return p1.frame < p2.frame;
Chris@147 64 }
Chris@147 65 };
Chris@147 66 };
Chris@147 67
Chris@147 68
Chris@147 69 class SparseOneDimensionalModel : public SparseModel<OneDimensionalPoint>
Chris@147 70 {
Chris@147 71 public:
Chris@147 72 SparseOneDimensionalModel(size_t sampleRate, size_t resolution,
Chris@147 73 bool notifyOnAdd = true) :
Chris@147 74 SparseModel<OneDimensionalPoint>(sampleRate, resolution, notifyOnAdd)
Chris@147 75 {
Chris@147 76 PlayParameterRepository::getInstance()->addModel(this);
Chris@147 77 }
Chris@147 78
Chris@147 79 int getIndexOf(const Point &point) {
Chris@147 80 // slow
Chris@147 81 int i = 0;
Chris@147 82 Point::Comparator comparator;
Chris@147 83 for (PointList::const_iterator j = m_points.begin();
Chris@147 84 j != m_points.end(); ++j, ++i) {
Chris@147 85 if (!comparator(*j, point) && !comparator(point, *j)) return i;
Chris@147 86 }
Chris@147 87 return -1;
Chris@147 88 }
Chris@345 89
Chris@345 90 QString getTypeName() const { return tr("Sparse 1-D"); }
Chris@147 91 };
Chris@147 92
Chris@147 93 #endif
Chris@147 94
Chris@147 95
Chris@147 96