annotate data/model/RangeSummarisableTimeValueModel.h @ 184:5a916fee6d2d

* Handle generator transforms (plugins whose channel count isn't dependent on number of audio inputs, as they have none) * Be less keen to suspend writing FFT data in spectrogram repaint -- only do it if we find we actually need to query the FFT data (i.e. we aren't repainting an area that hasn't been generated at all yet)
author Chris Cannam
date Tue, 10 Oct 2006 19:04:57 +0000
parents 0ed2b2e26b44
children 185454896a76
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 _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@147 36 struct Range
Chris@147 37 {
Chris@147 38 float min;
Chris@147 39 float max;
Chris@147 40 float absmean;
Chris@147 41 Range() :
Chris@147 42 min(0.f), max(0.f), absmean(0.f) { }
Chris@147 43 Range(const Range &r) :
Chris@147 44 min(r.min), max(r.max), absmean(r.absmean) { }
Chris@147 45 Range(float min_, float max_, float absmean_) :
Chris@147 46 min(min_), max(max_), absmean(absmean_) { }
Chris@147 47 };
Chris@147 48
Chris@147 49 typedef std::vector<Range> RangeBlock;
Chris@147 50
Chris@147 51 /**
Chris@147 52 * Return ranges between the given start and end frames,
Chris@147 53 * summarised at the given block size. ((end - start + 1) /
Chris@147 54 * blockSize) ranges should ideally be returned.
Chris@147 55 *
Chris@147 56 * If the given block size is not supported by this model
Chris@147 57 * (according to its zoom constraint), also modify the blockSize
Chris@147 58 * parameter so as to return the block size that was actually
Chris@147 59 * obtained.
Chris@147 60 */
Chris@147 61 virtual RangeBlock getRanges(size_t channel, size_t start, size_t end,
Chris@147 62 size_t &blockSize) const = 0;
Chris@147 63
Chris@147 64 /**
Chris@147 65 * Return the range between the given start and end frames,
Chris@147 66 * summarised at a block size equal to the distance between start
Chris@147 67 * and end frames.
Chris@147 68 */
Chris@147 69 virtual Range getRange(size_t channel, size_t start, size_t end) const = 0;
Chris@147 70 };
Chris@147 71
Chris@147 72 #endif
Chris@147 73