annotate data/model/RangeSummarisableTimeValueModel.h @ 1412:b7a9edee85e0 scale-ticks

Change loop to something that feels more correct, though it makes no difference to the tests here. More tests, one failing.
author Chris Cannam
date Thu, 04 May 2017 08:32:41 +0100
parents 54af1e21705c
children 2a06e4bc1c41
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@1326 16 #ifndef SV_RANGE_SUMMARISABLE_TIME_VALUE_MODEL_H
Chris@1326 17 #define SV_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@769 24 #include <stdint.h>
chris@769 25
Chris@147 26 /**
Chris@147 27 * Base class for models containing dense two-dimensional data (value
Chris@147 28 * against time) that may be meaningfully represented in a zoomed view
Chris@147 29 * using min/max range summaries. Audio waveform data is an obvious
Chris@147 30 * example: think "peaks and minima" for "ranges".
Chris@147 31 */
Chris@147 32
Chris@179 33 class RangeSummarisableTimeValueModel : public DenseTimeValueModel
Chris@147 34 {
Chris@147 35 Q_OBJECT
Chris@147 36
Chris@147 37 public:
Chris@319 38 RangeSummarisableTimeValueModel() { }
Chris@297 39
Chris@410 40 class Range
Chris@410 41 {
Chris@410 42 public:
Chris@410 43 Range() :
Chris@1053 44 m_new(true), m_min(0.f), m_max(0.f), m_absmean(0.f) { }
Chris@410 45 Range(const Range &r) :
Chris@1053 46 m_new(true), m_min(r.m_min), m_max(r.m_max), m_absmean(r.m_absmean) { }
Chris@410 47 Range(float min, float max, float absmean) :
Chris@1053 48 m_new(true), m_min(min), m_max(max), m_absmean(absmean) { }
Chris@410 49
Chris@410 50 float min() const { return m_min; }
Chris@410 51 float max() const { return m_max; }
Chris@410 52 float absmean() const { return m_absmean; }
Chris@410 53
Chris@1053 54 void setMin(float min) { m_min = min; m_new = false; }
Chris@1053 55 void setMax(float max) { m_max = max; m_new = false; }
Chris@410 56 void setAbsmean(float absmean) { m_absmean = absmean; }
Chris@410 57
Chris@1053 58 void sample(float s) {
Chris@1053 59 if (m_new) {
Chris@1053 60 m_min = s;
Chris@1053 61 m_max = s;
Chris@1053 62 m_new = false;
Chris@1053 63 } else {
Chris@1053 64 if (s < m_min) m_min = s;
Chris@1053 65 if (s > m_max) m_max = s;
Chris@1053 66 }
Chris@1053 67 }
Chris@1053 68
Chris@410 69 private:
Chris@1053 70 bool m_new;
Chris@410 71 float m_min;
Chris@410 72 float m_max;
Chris@410 73 float m_absmean;
Chris@410 74 };
Chris@147 75
Chris@147 76 typedef std::vector<Range> RangeBlock;
Chris@147 77
Chris@147 78 /**
Chris@300 79 * Return ranges from the given start frame, corresponding to the
Chris@300 80 * given number of underlying sample frames, summarised at the
Chris@300 81 * given block size. duration / blockSize ranges should ideally
Chris@300 82 * be returned.
Chris@147 83 *
Chris@147 84 * If the given block size is not supported by this model
Chris@147 85 * (according to its zoom constraint), also modify the blockSize
Chris@147 86 * parameter so as to return the block size that was actually
Chris@147 87 * obtained.
Chris@147 88 */
Chris@1038 89 virtual void getSummaries(int channel, sv_frame_t start, sv_frame_t count,
Chris@300 90 RangeBlock &ranges,
Chris@929 91 int &blockSize) const = 0;
Chris@147 92
Chris@147 93 /**
Chris@300 94 * Return the range from the given start frame, corresponding to
Chris@300 95 * the given number of underlying sample frames, summarised at a
Chris@300 96 * block size equal to the distance between start and end frames.
Chris@147 97 */
Chris@1038 98 virtual Range getSummary(int channel, sv_frame_t start, sv_frame_t count) const = 0;
Chris@345 99
Chris@929 100 virtual int getSummaryBlockSize(int desired) const = 0;
Chris@377 101
Chris@345 102 QString getTypeName() const { return tr("Range-Summarisable Time-Value"); }
Chris@147 103 };
Chris@147 104
Chris@147 105 #endif
Chris@147 106