annotate data/model/SparseTimeValueModel.h @ 299:576be0d0d218

* Merge transform directory from sv-match-alignment branch (the previous comment included notes for this stuff, but I missed it in the actual merge) * Fix crash when a transform fails to create an output model and the thread that created the transform then deletes its input model thinking it's no longer needed, even though the transform run thread is still using it -- fix is to wait() on the transform before returning the null output model
author Chris Cannam
date Fri, 28 Sep 2007 16:15:06 +0000
parents 9c85517ff0f5
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_TIME_VALUE_MODEL_H_
Chris@147 17 #define _SPARSE_TIME_VALUE_MODEL_H_
Chris@147 18
Chris@147 19 #include "SparseValueModel.h"
Chris@150 20 #include "base/PlayParameterRepository.h"
Chris@147 21 #include "base/RealTime.h"
Chris@147 22
Chris@147 23 /**
Chris@147 24 * Time/value point type for use in a SparseModel or SparseValueModel.
Chris@147 25 * With this point type, the model basically represents a wiggly-line
Chris@147 26 * plot with points at arbitrary intervals of the model resolution.
Chris@147 27 */
Chris@147 28
Chris@147 29 struct TimeValuePoint
Chris@147 30 {
Chris@147 31 public:
Chris@147 32 TimeValuePoint(long _frame) : frame(_frame), value(0.0f) { }
Chris@147 33 TimeValuePoint(long _frame, float _value, QString _label) :
Chris@147 34 frame(_frame), value(_value), label(_label) { }
Chris@147 35
Chris@147 36 int getDimensions() const { return 2; }
Chris@147 37
Chris@147 38 long frame;
Chris@147 39 float value;
Chris@147 40 QString label;
Chris@147 41
Chris@147 42 QString toXmlString(QString indent = "",
Chris@147 43 QString extraAttributes = "") const
Chris@147 44 {
Chris@147 45 return QString("%1<point frame=\"%2\" value=\"%3\" label=\"%4\" %5/>\n")
Chris@147 46 .arg(indent).arg(frame).arg(value).arg(label).arg(extraAttributes);
Chris@147 47 }
Chris@147 48
Chris@147 49 QString toDelimitedDataString(QString delimiter, size_t sampleRate) const
Chris@147 50 {
Chris@147 51 QStringList list;
Chris@147 52 list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str();
Chris@147 53 list << QString("%1").arg(value);
Chris@147 54 list << label;
Chris@147 55 return list.join(delimiter);
Chris@147 56 }
Chris@147 57
Chris@147 58 struct Comparator {
Chris@147 59 bool operator()(const TimeValuePoint &p1,
Chris@147 60 const TimeValuePoint &p2) const {
Chris@147 61 if (p1.frame != p2.frame) return p1.frame < p2.frame;
Chris@147 62 if (p1.value != p2.value) return p1.value < p2.value;
Chris@147 63 return p1.label < p2.label;
Chris@147 64 }
Chris@147 65 };
Chris@147 66
Chris@147 67 struct OrderComparator {
Chris@147 68 bool operator()(const TimeValuePoint &p1,
Chris@147 69 const TimeValuePoint &p2) const {
Chris@147 70 return p1.frame < p2.frame;
Chris@147 71 }
Chris@147 72 };
Chris@147 73 };
Chris@147 74
Chris@147 75
Chris@147 76 class SparseTimeValueModel : public SparseValueModel<TimeValuePoint>
Chris@147 77 {
Chris@147 78 public:
Chris@147 79 SparseTimeValueModel(size_t sampleRate, size_t resolution,
Chris@256 80 bool notifyOnAdd = true) :
Chris@256 81 SparseValueModel<TimeValuePoint>(sampleRate, resolution,
Chris@256 82 notifyOnAdd)
Chris@256 83 {
Chris@256 84 PlayParameterRepository::getInstance()->addModel(this);
Chris@256 85 }
Chris@256 86
Chris@256 87 SparseTimeValueModel(size_t sampleRate, size_t resolution,
Chris@147 88 float valueMinimum, float valueMaximum,
Chris@147 89 bool notifyOnAdd = true) :
Chris@147 90 SparseValueModel<TimeValuePoint>(sampleRate, resolution,
Chris@147 91 valueMinimum, valueMaximum,
Chris@147 92 notifyOnAdd)
Chris@147 93 {
Chris@147 94 PlayParameterRepository::getInstance()->addModel(this);
Chris@147 95 }
Chris@147 96 };
Chris@147 97
Chris@147 98
Chris@147 99 #endif
Chris@147 100
Chris@147 101
Chris@147 102