lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 Chris Cannam. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #ifndef _MODEL_H_ lbajardsilogic@0: #define _MODEL_H_ lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: #include "base/XmlExportable.h" lbajardsilogic@0: lbajardsilogic@0: typedef std::vector SampleBlock; lbajardsilogic@0: lbajardsilogic@0: class ZoomConstraint; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Model is the base class for all data models that represent any sort lbajardsilogic@0: * of data on a time scale based on an audio frame rate. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: class Model : public QObject, lbajardsilogic@0: public XmlExportable lbajardsilogic@0: { lbajardsilogic@0: Q_OBJECT lbajardsilogic@0: lbajardsilogic@0: public: lbajardsilogic@0: virtual ~Model(); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Return true if the model was constructed successfully. Classes lbajardsilogic@0: * that refer to the model should always test this before use. lbajardsilogic@0: */ lbajardsilogic@0: virtual bool isOK() const = 0; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Return the first audio frame spanned by the model. lbajardsilogic@0: */ lbajardsilogic@0: virtual size_t getStartFrame() const = 0; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Return the last audio frame spanned by the model. lbajardsilogic@0: */ lbajardsilogic@0: virtual size_t getEndFrame() const = 0; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Return the frame rate in frames per second. lbajardsilogic@0: */ lbajardsilogic@0: virtual size_t getSampleRate() const = 0; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Return a copy of this model. lbajardsilogic@0: * lbajardsilogic@0: * If the model is not editable, this may be effectively a shallow lbajardsilogic@0: * copy. If the model is editable, however, this operation must lbajardsilogic@0: * properly copy all of the model's editable data. lbajardsilogic@0: * lbajardsilogic@0: * In general this operation is not useful for non-editable dense lbajardsilogic@0: * models such as waveforms, because there may be no efficient lbajardsilogic@0: * copy operation implemented -- for such models it is better not lbajardsilogic@0: * to copy at all. lbajardsilogic@0: * lbajardsilogic@0: * Caller owns the returned value. lbajardsilogic@0: */ lbajardsilogic@0: virtual Model *clone() const = 0; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Return true if the model has finished loading or calculating lbajardsilogic@0: * all its data, for a model that is capable of calculating in a lbajardsilogic@0: * background thread. The default implementation is appropriate lbajardsilogic@0: * for a thread that does not background any work but carries out lbajardsilogic@0: * all its calculation from the constructor or accessors. lbajardsilogic@0: * lbajardsilogic@0: * If "completion" is non-NULL, this function should return lbajardsilogic@0: * through it an estimated percentage value showing how far lbajardsilogic@0: * through the background operation it thinks it is (for progress lbajardsilogic@0: * reporting). If it has no way to calculate progress, it may lbajardsilogic@0: * return the special value COMPLETION_UNKNOWN. lbajardsilogic@0: */ lbajardsilogic@0: virtual bool isReady(int *completion = 0) const { lbajardsilogic@0: bool ok = isOK(); lbajardsilogic@0: if (completion) *completion = (ok ? 100 : 0); lbajardsilogic@0: return ok; lbajardsilogic@0: } lbajardsilogic@0: static const int COMPLETION_UNKNOWN; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * If this model imposes a zoom constraint, i.e. some limit to the lbajardsilogic@0: * set of resolutions at which its data can meaningfully be lbajardsilogic@0: * displayed, then return it. lbajardsilogic@0: */ lbajardsilogic@0: virtual const ZoomConstraint *getZoomConstraint() const { lbajardsilogic@0: return 0; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: virtual void toXml(QTextStream &stream, lbajardsilogic@0: QString indent = "", lbajardsilogic@0: QString extraAttributes = "") const; lbajardsilogic@0: lbajardsilogic@0: virtual QString toXmlString(QString indent = "", lbajardsilogic@0: QString extraAttributes = "") const; lbajardsilogic@0: lbajardsilogic@0: virtual QString toDelimitedDataString(QString) const { return ""; } lbajardsilogic@0: lbajardsilogic@0: signals: lbajardsilogic@0: /** lbajardsilogic@0: * Emitted when a model has been edited (or more data retrieved lbajardsilogic@0: * from cache, in the case of a cached model that generates slowly) lbajardsilogic@0: */ lbajardsilogic@0: void modelChanged(); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Emitted when a model has been edited (or more data retrieved lbajardsilogic@0: * from cache, in the case of a cached model that generates slowly) lbajardsilogic@0: */ lbajardsilogic@0: void modelChanged(size_t startFrame, size_t endFrame); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Emitted when some internal processing has advanced a stage, but lbajardsilogic@0: * the model has not changed externally. Views should respond by lbajardsilogic@0: * updating any progress meters or other monitoring, but not lbajardsilogic@0: * refreshing the actual view. lbajardsilogic@0: */ lbajardsilogic@0: void completionChanged(); lbajardsilogic@0: lbajardsilogic@0: protected: lbajardsilogic@0: Model() { } lbajardsilogic@0: lbajardsilogic@0: // Not provided. lbajardsilogic@0: Model(const Model &); lbajardsilogic@0: Model &operator=(const Model &); lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: #endif