Chris@147: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@147: Chris@147: /* Chris@147: Sonic Visualiser Chris@147: An audio file viewer and annotation editor. Chris@147: Centre for Digital Music, Queen Mary, University of London. Chris@297: This file copyright 2006-2007 Chris Cannam and QMUL. Chris@147: Chris@147: This program is free software; you can redistribute it and/or Chris@147: modify it under the terms of the GNU General Public License as Chris@147: published by the Free Software Foundation; either version 2 of the Chris@147: License, or (at your option) any later version. See the file Chris@147: COPYING included with this distribution for more information. Chris@147: */ Chris@147: Chris@147: #ifndef _RANGE_SUMMARISABLE_TIME_VALUE_MODEL_H_ Chris@147: #define _RANGE_SUMMARISABLE_TIME_VALUE_MODEL_H_ Chris@147: Chris@147: #include Chris@147: Chris@147: #include "DenseTimeValueModel.h" Chris@147: #include "base/ZoomConstraint.h" Chris@147: Chris@147: /** Chris@147: * Base class for models containing dense two-dimensional data (value Chris@147: * against time) that may be meaningfully represented in a zoomed view Chris@147: * using min/max range summaries. Audio waveform data is an obvious Chris@147: * example: think "peaks and minima" for "ranges". Chris@147: */ Chris@147: Chris@179: class RangeSummarisableTimeValueModel : public DenseTimeValueModel Chris@147: { Chris@147: Q_OBJECT Chris@147: Chris@147: public: Chris@319: RangeSummarisableTimeValueModel() { } Chris@297: Chris@147: struct Range Chris@147: { Chris@147: float min; Chris@147: float max; Chris@147: float absmean; Chris@147: Range() : Chris@147: min(0.f), max(0.f), absmean(0.f) { } Chris@147: Range(const Range &r) : Chris@147: min(r.min), max(r.max), absmean(r.absmean) { } Chris@147: Range(float min_, float max_, float absmean_) : Chris@147: min(min_), max(max_), absmean(absmean_) { } Chris@147: }; Chris@147: Chris@147: typedef std::vector RangeBlock; Chris@147: Chris@147: /** Chris@300: * Return ranges from the given start frame, corresponding to the Chris@300: * given number of underlying sample frames, summarised at the Chris@300: * given block size. duration / blockSize ranges should ideally Chris@300: * be returned. Chris@147: * Chris@147: * If the given block size is not supported by this model Chris@147: * (according to its zoom constraint), also modify the blockSize Chris@147: * parameter so as to return the block size that was actually Chris@147: * obtained. Chris@147: */ Chris@300: virtual void getSummaries(size_t channel, size_t start, size_t count, Chris@300: RangeBlock &ranges, Chris@300: size_t &blockSize) const = 0; Chris@147: Chris@147: /** Chris@300: * Return the range from the given start frame, corresponding to Chris@300: * the given number of underlying sample frames, summarised at a Chris@300: * block size equal to the distance between start and end frames. Chris@147: */ Chris@300: virtual Range getSummary(size_t channel, size_t start, size_t count) const = 0; Chris@384: Chris@384: virtual size_t getSummaryBlockSize(size_t desired) const = 0; Chris@384: Chris@384: QString getTypeName() const { return tr("Range-Summarisable Time-Value"); } Chris@147: }; Chris@147: Chris@147: #endif Chris@147: