annotate data/model/RangeSummarisableTimeValueModel.h @ 319:3ff8f571da09

* Hoist alignment model set/query up to Model, so any models can be aligned * Add Model::aboutToDelete and aboutToBeDeleted for management of models that are contained by or referred to by other models instead of only the document
author Chris Cannam
date Wed, 24 Oct 2007 15:21:38 +0000
parents 5877d68815c7
children 700cd3350391 6f6ab834449d
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@297 7 This file copyright 2006-2007 Chris Cannam and QMUL.
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 _RANGE_SUMMARISABLE_TIME_VALUE_MODEL_H_
Chris@147 17 #define _RANGE_SUMMARISABLE_TIME_VALUE_MODEL_H_
Chris@147 18
Chris@147 19 #include <QObject>
Chris@147 20
Chris@147 21 #include "DenseTimeValueModel.h"
Chris@147 22 #include "base/ZoomConstraint.h"
Chris@147 23
Chris@147 24 /**
Chris@147 25 * Base class for models containing dense two-dimensional data (value
Chris@147 26 * against time) that may be meaningfully represented in a zoomed view
Chris@147 27 * using min/max range summaries. Audio waveform data is an obvious
Chris@147 28 * example: think "peaks and minima" for "ranges".
Chris@147 29 */
Chris@147 30
Chris@179 31 class RangeSummarisableTimeValueModel : public DenseTimeValueModel
Chris@147 32 {
Chris@147 33 Q_OBJECT
Chris@147 34
Chris@147 35 public:
Chris@319 36 RangeSummarisableTimeValueModel() { }
Chris@297 37
Chris@147 38 struct Range
Chris@147 39 {
Chris@147 40 float min;
Chris@147 41 float max;
Chris@147 42 float absmean;
Chris@147 43 Range() :
Chris@147 44 min(0.f), max(0.f), absmean(0.f) { }
Chris@147 45 Range(const Range &r) :
Chris@147 46 min(r.min), max(r.max), absmean(r.absmean) { }
Chris@147 47 Range(float min_, float max_, float absmean_) :
Chris@147 48 min(min_), max(max_), absmean(absmean_) { }
Chris@147 49 };
Chris@147 50
Chris@147 51 typedef std::vector<Range> RangeBlock;
Chris@147 52
Chris@147 53 /**
Chris@300 54 * Return ranges from the given start frame, corresponding to the
Chris@300 55 * given number of underlying sample frames, summarised at the
Chris@300 56 * given block size. duration / blockSize ranges should ideally
Chris@300 57 * be returned.
Chris@147 58 *
Chris@147 59 * If the given block size is not supported by this model
Chris@147 60 * (according to its zoom constraint), also modify the blockSize
Chris@147 61 * parameter so as to return the block size that was actually
Chris@147 62 * obtained.
Chris@147 63 */
Chris@300 64 virtual void getSummaries(size_t channel, size_t start, size_t count,
Chris@300 65 RangeBlock &ranges,
Chris@300 66 size_t &blockSize) const = 0;
Chris@147 67
Chris@147 68 /**
Chris@300 69 * Return the range from the given start frame, corresponding to
Chris@300 70 * the given number of underlying sample frames, summarised at a
Chris@300 71 * block size equal to the distance between start and end frames.
Chris@147 72 */
Chris@300 73 virtual Range getSummary(size_t channel, size_t start, size_t count) const = 0;
Chris@147 74 };
Chris@147 75
Chris@147 76 #endif
Chris@147 77