annotate data/model/WaveFileModel.h @ 360:ac300d385ab2

* Various fixes to object lifetime management, particularly in the spectrum layer and for notification of main model deletion. The main purpose of this is to improve the behaviour of the spectrum, but I think it may also help with #1840922 Various crashes in Layer Summary window.
author Chris Cannam
date Wed, 23 Jan 2008 15:43:27 +0000
parents 700cd3350391
children 0e30c8ec15a0 94fc0591ea43
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@300 71 virtual void getSummaries(size_t channel, size_t start, size_t count,
Chris@300 72 RangeBlock &ranges,
Chris@300 73 size_t &blockSize) const;
Chris@300 74
Chris@300 75 virtual Range getSummary(size_t channel, size_t start, size_t count) const;
Chris@147 76
Chris@345 77 QString getTypeName() const { return tr("Wave File"); }
Chris@345 78
Chris@163 79 virtual void toXml(QTextStream &out,
Chris@163 80 QString indent = "",
Chris@163 81 QString extraAttributes = "") const;
Chris@163 82
Chris@239 83 signals:
Chris@239 84 void modelChanged();
Chris@258 85 void modelChanged(size_t, size_t);
Chris@239 86 void completionChanged();
Chris@239 87
Chris@147 88 protected slots:
Chris@147 89 void fillTimerTimedOut();
Chris@147 90 void cacheFilled();
Chris@147 91
Chris@147 92 protected:
Chris@147 93 void initialize();
Chris@147 94
Chris@147 95 class RangeCacheFillThread : public Thread
Chris@147 96 {
Chris@147 97 public:
Chris@147 98 RangeCacheFillThread(WaveFileModel &model) :
Chris@175 99 m_model(model), m_fillExtent(0),
Chris@175 100 m_frameCount(model.getFrameCount()) { }
Chris@147 101
Chris@147 102 size_t getFillExtent() const { return m_fillExtent; }
Chris@147 103 virtual void run();
Chris@147 104
Chris@147 105 protected:
Chris@147 106 WaveFileModel &m_model;
Chris@147 107 size_t m_fillExtent;
Chris@175 108 size_t m_frameCount;
Chris@147 109 };
Chris@147 110
Chris@147 111 void fillCache();
Chris@316 112
Chris@317 113 FileSource m_source;
Chris@147 114 QString m_path;
Chris@147 115 AudioFileReader *m_reader;
Chris@175 116 bool m_myReader;
Chris@147 117
Chris@300 118 size_t m_startFrame;
Chris@300 119
Chris@147 120 RangeBlock m_cache[2]; // interleaved at two base resolutions
Chris@147 121 mutable QMutex m_mutex;
Chris@147 122 RangeCacheFillThread *m_fillThread;
Chris@147 123 QTimer *m_updateTimer;
Chris@147 124 size_t m_lastFillExtent;
Chris@147 125 bool m_exiting;
Chris@179 126 static PowerOfSqrtTwoZoomConstraint m_zoomConstraint;
Chris@147 127 };
Chris@147 128
Chris@147 129 #endif