annotate data/model/WaveFileModel.h @ 335:02d2ad95ea52 spectrogram-cache-rejig

* Get storage advice for each cache in an FFT data server. Allows us to be more confident about the actual memory situation and cut over from memory to disc part way through an FFT calculation if necessary. StorageAdviser is now a bit too optimistic though (it's too keen to allocate large numbers of small blocks in memory).
author Chris Cannam
date Tue, 13 Nov 2007 13:54:10 +0000
parents 1afaf98dbf11
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@202 7 This file copyright 2006 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 _WAVE_FILE_MODEL_H_
Chris@147 17 #define _WAVE_FILE_MODEL_H_
Chris@147 18
Chris@150 19 #include "base/Thread.h"
Chris@147 20 #include <QMutex>
Chris@147 21 #include <QTimer>
Chris@147 22
Chris@317 23 #include "data/fileio/FileSource.h"
Chris@316 24
Chris@147 25 #include "RangeSummarisableTimeValueModel.h"
Chris@147 26 #include "PowerOfSqrtTwoZoomConstraint.h"
Chris@147 27
Chris@147 28 #include <stdlib.h>
Chris@147 29
Chris@147 30 class AudioFileReader;
Chris@147 31
Chris@179 32 class WaveFileModel : public RangeSummarisableTimeValueModel
Chris@147 33 {
Chris@147 34 Q_OBJECT
Chris@147 35
Chris@147 36 public:
Chris@317 37 WaveFileModel(FileSource source, size_t targetRate = 0);
Chris@317 38 WaveFileModel(FileSource source, AudioFileReader *reader);
Chris@147 39 ~WaveFileModel();
Chris@147 40
Chris@147 41 bool isOK() const;
Chris@147 42 bool isReady(int *) const;
Chris@147 43
Chris@179 44 const ZoomConstraint *getZoomConstraint() const { return &m_zoomConstraint; }
Chris@179 45
Chris@147 46 size_t getFrameCount() const;
Chris@147 47 size_t getChannelCount() const;
Chris@147 48 size_t getSampleRate() const;
Chris@297 49 size_t getNativeRate() const;
Chris@147 50
Chris@333 51 QString getTitle() const;
Chris@333 52 QString getMaker() const;
Chris@333 53
Chris@147 54 virtual Model *clone() const;
Chris@147 55
Chris@147 56 float getValueMinimum() const { return -1.0f; }
Chris@147 57 float getValueMaximum() const { return 1.0f; }
Chris@147 58
Chris@300 59 virtual size_t getStartFrame() const { return m_startFrame; }
Chris@300 60 virtual size_t getEndFrame() const { return m_startFrame + getFrameCount(); }
Chris@147 61
Chris@300 62 void setStartFrame(size_t startFrame) { m_startFrame = startFrame; }
Chris@147 63
Chris@300 64 virtual size_t getData(int channel, size_t start, size_t count,
Chris@300 65 float *buffer) const;
Chris@147 66
Chris@300 67 virtual size_t getData(int channel, size_t start, size_t count,
Chris@300 68 double *buffer) const;
Chris@147 69
Chris@300 70 virtual void getSummaries(size_t channel, size_t start, size_t count,
Chris@300 71 RangeBlock &ranges,
Chris@300 72 size_t &blockSize) const;
Chris@300 73
Chris@300 74 virtual Range getSummary(size_t channel, size_t start, size_t count) const;
Chris@147 75
Chris@163 76 virtual void toXml(QTextStream &out,
Chris@163 77 QString indent = "",
Chris@163 78 QString extraAttributes = "") const;
Chris@163 79
Chris@239 80 signals:
Chris@239 81 void modelChanged();
Chris@258 82 void modelChanged(size_t, size_t);
Chris@239 83 void completionChanged();
Chris@239 84
Chris@147 85 protected slots:
Chris@147 86 void fillTimerTimedOut();
Chris@147 87 void cacheFilled();
Chris@147 88
Chris@147 89 protected:
Chris@147 90 void initialize();
Chris@147 91
Chris@147 92 class RangeCacheFillThread : public Thread
Chris@147 93 {
Chris@147 94 public:
Chris@147 95 RangeCacheFillThread(WaveFileModel &model) :
Chris@175 96 m_model(model), m_fillExtent(0),
Chris@175 97 m_frameCount(model.getFrameCount()) { }
Chris@147 98
Chris@147 99 size_t getFillExtent() const { return m_fillExtent; }
Chris@147 100 virtual void run();
Chris@147 101
Chris@147 102 protected:
Chris@147 103 WaveFileModel &m_model;
Chris@147 104 size_t m_fillExtent;
Chris@175 105 size_t m_frameCount;
Chris@147 106 };
Chris@147 107
Chris@147 108 void fillCache();
Chris@316 109
Chris@317 110 FileSource m_source;
Chris@147 111 QString m_path;
Chris@147 112 AudioFileReader *m_reader;
Chris@175 113 bool m_myReader;
Chris@147 114
Chris@300 115 size_t m_startFrame;
Chris@300 116
Chris@147 117 RangeBlock m_cache[2]; // interleaved at two base resolutions
Chris@147 118 mutable QMutex m_mutex;
Chris@147 119 RangeCacheFillThread *m_fillThread;
Chris@147 120 QTimer *m_updateTimer;
Chris@147 121 size_t m_lastFillExtent;
Chris@147 122 bool m_exiting;
Chris@179 123 static PowerOfSqrtTwoZoomConstraint m_zoomConstraint;
Chris@147 124 };
Chris@147 125
Chris@147 126 #endif