annotate data/model/ReadOnlyWaveFileModel.h @ 1773:fadd9f8aaa27

This output is too annoying, in the perfectly innocuous case of reading from an aggregate model whose components are different lengths
author Chris Cannam
date Wed, 14 Aug 2019 13:54:23 +0100
parents 78fe29adfd16
children 14747f24ad04
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@1122 16 #ifndef READ_ONLY_WAVE_FILE_MODEL_H
Chris@1122 17 #define READ_ONLY_WAVE_FILE_MODEL_H
Chris@1122 18
Chris@1122 19 #include "WaveFileModel.h"
Chris@147 20
Chris@150 21 #include "base/Thread.h"
Chris@147 22 #include <QMutex>
Chris@147 23 #include <QTimer>
Chris@147 24
Chris@317 25 #include "data/fileio/FileSource.h"
Chris@316 26
Chris@147 27 #include "RangeSummarisableTimeValueModel.h"
Chris@147 28 #include "PowerOfSqrtTwoZoomConstraint.h"
Chris@147 29
Chris@147 30 #include <stdlib.h>
Chris@147 31
Chris@147 32 class AudioFileReader;
Chris@147 33
Chris@1122 34 class ReadOnlyWaveFileModel : public WaveFileModel
Chris@147 35 {
Chris@147 36 Q_OBJECT
Chris@147 37
Chris@147 38 public:
Chris@1514 39 /**
Chris@1514 40 * Construct a WaveFileModel from a source path and optional
Chris@1514 41 * resampling target rate
Chris@1514 42 */
Chris@1122 43 ReadOnlyWaveFileModel(FileSource source, sv_samplerate_t targetRate = 0);
Chris@1514 44
Chris@1514 45 /**
Chris@1514 46 * Construct a WaveFileModel from a source path using an existing
Chris@1514 47 * AudioFileReader. The model does not take ownership of the
Chris@1514 48 * AudioFileReader, which remains managed by the caller and must
Chris@1514 49 * outlive the model.
Chris@1514 50 */
Chris@1122 51 ReadOnlyWaveFileModel(FileSource source, AudioFileReader *reader);
Chris@1514 52
Chris@1122 53 ~ReadOnlyWaveFileModel();
Chris@147 54
Chris@1580 55 bool isOK() const override;
Chris@1580 56 bool isReady(int *) const override;
Chris@1671 57 int getCompletion() const override {
Chris@1671 58 int c = 0;
Chris@1671 59 (void)isReady(&c);
Chris@1671 60 return c;
Chris@1671 61 }
Chris@147 62
Chris@1580 63 const ZoomConstraint *getZoomConstraint() const override { return &m_zoomConstraint; }
Chris@179 64
Chris@1580 65 sv_frame_t getFrameCount() const override;
Chris@1580 66 int getChannelCount() const override;
Chris@1580 67 sv_samplerate_t getSampleRate() const override;
Chris@1580 68 sv_samplerate_t getNativeRate() const override;
Chris@147 69
Chris@1580 70 QString getTitle() const override;
Chris@1580 71 QString getMaker() const override;
Chris@1580 72 QString getLocation() const override;
Chris@333 73
Chris@1010 74 QString getLocalFilename() const;
Chris@1010 75
Chris@1580 76 float getValueMinimum() const override { return -1.0f; }
Chris@1580 77 float getValueMaximum() const override { return 1.0f; }
Chris@147 78
Chris@1580 79 sv_frame_t getStartFrame() const override { return m_startFrame; }
Chris@1725 80 sv_frame_t getTrueEndFrame() const override { return m_startFrame + getFrameCount(); }
Chris@147 81
Chris@1580 82 void setStartFrame(sv_frame_t startFrame) override { m_startFrame = startFrame; }
Chris@147 83
Chris@1580 84 floatvec_t getData(int channel, sv_frame_t start, sv_frame_t count) const override;
Chris@147 85
Chris@1580 86 std::vector<floatvec_t> getMultiChannelData(int fromchannel, int tochannel, sv_frame_t start, sv_frame_t count) const override;
Chris@363 87
Chris@1580 88 int getSummaryBlockSize(int desired) const override;
Chris@377 89
Chris@1580 90 void getSummaries(int channel, sv_frame_t start, sv_frame_t count,
Chris@300 91 RangeBlock &ranges,
Chris@1580 92 int &blockSize) const override;
Chris@300 93
Chris@1580 94 Range getSummary(int channel, sv_frame_t start, sv_frame_t count) const override;
Chris@147 95
Chris@1580 96 QString getTypeName() const override { return tr("Wave File"); }
Chris@345 97
Chris@1580 98 void toXml(QTextStream &out,
Chris@163 99 QString indent = "",
Chris@1580 100 QString extraAttributes = "") const override;
Chris@163 101
Chris@147 102 protected slots:
Chris@147 103 void fillTimerTimedOut();
Chris@147 104 void cacheFilled();
Chris@147 105
Chris@147 106 protected:
Chris@147 107 void initialize();
Chris@147 108
Chris@147 109 class RangeCacheFillThread : public Thread
Chris@147 110 {
Chris@147 111 public:
Chris@1122 112 RangeCacheFillThread(ReadOnlyWaveFileModel &model) :
Chris@1406 113 m_model(model), m_fillExtent(0),
Chris@175 114 m_frameCount(model.getFrameCount()) { }
Chris@147 115
Chris@1406 116 sv_frame_t getFillExtent() const { return m_fillExtent; }
Chris@1580 117 void run() override;
Chris@147 118
Chris@147 119 protected:
Chris@1122 120 ReadOnlyWaveFileModel &m_model;
Chris@1406 121 sv_frame_t m_fillExtent;
Chris@1038 122 sv_frame_t m_frameCount;
Chris@147 123 };
Chris@147 124
Chris@147 125 void fillCache();
Chris@316 126
Chris@317 127 FileSource m_source;
Chris@147 128 QString m_path;
Chris@147 129 AudioFileReader *m_reader;
Chris@175 130 bool m_myReader;
Chris@147 131
Chris@1038 132 sv_frame_t m_startFrame;
Chris@300 133
Chris@147 134 RangeBlock m_cache[2]; // interleaved at two base resolutions
Chris@147 135 mutable QMutex m_mutex;
Chris@147 136 RangeCacheFillThread *m_fillThread;
Chris@147 137 QTimer *m_updateTimer;
Chris@1038 138 sv_frame_t m_lastFillExtent;
Chris@1557 139 mutable int m_prevCompletion;
Chris@147 140 bool m_exiting;
Chris@179 141 static PowerOfSqrtTwoZoomConstraint m_zoomConstraint;
Chris@377 142
Chris@1326 143 mutable floatvec_t m_directRead;
Chris@1038 144 mutable sv_frame_t m_lastDirectReadStart;
Chris@1038 145 mutable sv_frame_t m_lastDirectReadCount;
Chris@377 146 mutable QMutex m_directReadMutex;
Chris@147 147 };
Chris@147 148
Chris@147 149 #endif