annotate data/model/WaveFileModel.h @ 458:f60360209e5c

* Fix race condition in FFTFileCache when reading from the same FFT model from multiple threads (e.g. when applying more than one plugin at once)
author Chris Cannam
date Wed, 15 Oct 2008 12:08:02 +0000
parents 166c22eff678
children 29efe322ab47
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@345 53 QString getLocation() const;
Chris@333 54
Chris@147 55 virtual Model *clone() const;
Chris@147 56
Chris@147 57 float getValueMinimum() const { return -1.0f; }
Chris@147 58 float getValueMaximum() const { return 1.0f; }
Chris@147 59
Chris@300 60 virtual size_t getStartFrame() const { return m_startFrame; }
Chris@300 61 virtual size_t getEndFrame() const { return m_startFrame + getFrameCount(); }
Chris@147 62
Chris@300 63 void setStartFrame(size_t startFrame) { m_startFrame = startFrame; }
Chris@147 64
Chris@300 65 virtual size_t getData(int channel, size_t start, size_t count,
Chris@300 66 float *buffer) const;
Chris@147 67
Chris@300 68 virtual size_t getData(int channel, size_t start, size_t count,
Chris@300 69 double *buffer) const;
Chris@147 70
Chris@363 71 virtual size_t getData(size_t fromchannel, size_t tochannel,
Chris@363 72 size_t start, size_t count,
Chris@363 73 float **buffers) const;
Chris@363 74
Chris@377 75 virtual size_t getSummaryBlockSize(size_t desired) const;
Chris@377 76
Chris@300 77 virtual void getSummaries(size_t channel, size_t start, size_t count,
Chris@300 78 RangeBlock &ranges,
Chris@300 79 size_t &blockSize) const;
Chris@300 80
Chris@300 81 virtual Range getSummary(size_t channel, size_t start, size_t count) const;
Chris@147 82
Chris@345 83 QString getTypeName() const { return tr("Wave File"); }
Chris@345 84
Chris@163 85 virtual void toXml(QTextStream &out,
Chris@163 86 QString indent = "",
Chris@163 87 QString extraAttributes = "") const;
Chris@163 88
Chris@239 89 signals:
Chris@239 90 void modelChanged();
Chris@258 91 void modelChanged(size_t, size_t);
Chris@239 92 void completionChanged();
Chris@239 93
Chris@147 94 protected slots:
Chris@147 95 void fillTimerTimedOut();
Chris@147 96 void cacheFilled();
Chris@147 97
Chris@147 98 protected:
Chris@147 99 void initialize();
Chris@147 100
Chris@147 101 class RangeCacheFillThread : public Thread
Chris@147 102 {
Chris@147 103 public:
Chris@147 104 RangeCacheFillThread(WaveFileModel &model) :
Chris@175 105 m_model(model), m_fillExtent(0),
Chris@175 106 m_frameCount(model.getFrameCount()) { }
Chris@147 107
Chris@147 108 size_t getFillExtent() const { return m_fillExtent; }
Chris@147 109 virtual void run();
Chris@147 110
Chris@147 111 protected:
Chris@147 112 WaveFileModel &m_model;
Chris@147 113 size_t m_fillExtent;
Chris@175 114 size_t m_frameCount;
Chris@147 115 };
Chris@147 116
Chris@147 117 void fillCache();
Chris@316 118
Chris@317 119 FileSource m_source;
Chris@147 120 QString m_path;
Chris@147 121 AudioFileReader *m_reader;
Chris@175 122 bool m_myReader;
Chris@147 123
Chris@300 124 size_t m_startFrame;
Chris@300 125
Chris@147 126 RangeBlock m_cache[2]; // interleaved at two base resolutions
Chris@147 127 mutable QMutex m_mutex;
Chris@147 128 RangeCacheFillThread *m_fillThread;
Chris@147 129 QTimer *m_updateTimer;
Chris@147 130 size_t m_lastFillExtent;
Chris@147 131 bool m_exiting;
Chris@179 132 static PowerOfSqrtTwoZoomConstraint m_zoomConstraint;
Chris@377 133
Chris@377 134 mutable SampleBlock m_directRead;
Chris@377 135 mutable size_t m_lastDirectReadStart;
Chris@377 136 mutable size_t m_lastDirectReadCount;
Chris@377 137 mutable QMutex m_directReadMutex;
Chris@147 138 };
Chris@147 139
Chris@147 140 #endif