| 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@1122 | 39     ReadOnlyWaveFileModel(FileSource source, sv_samplerate_t targetRate = 0); | 
| Chris@1122 | 40     ReadOnlyWaveFileModel(FileSource source, AudioFileReader *reader); | 
| Chris@1122 | 41     ~ReadOnlyWaveFileModel(); | 
| Chris@147 | 42 | 
| Chris@147 | 43     bool isOK() const; | 
| Chris@147 | 44     bool isReady(int *) const; | 
| Chris@147 | 45 | 
| Chris@179 | 46     const ZoomConstraint *getZoomConstraint() const { return &m_zoomConstraint; } | 
| Chris@179 | 47 | 
| Chris@1038 | 48     sv_frame_t getFrameCount() const; | 
| Chris@929 | 49     int getChannelCount() const; | 
| Chris@1040 | 50     sv_samplerate_t getSampleRate() const; | 
| Chris@1040 | 51     sv_samplerate_t getNativeRate() const; | 
| Chris@147 | 52 | 
| Chris@333 | 53     QString getTitle() const; | 
| Chris@333 | 54     QString getMaker() const; | 
| Chris@345 | 55     QString getLocation() const; | 
| Chris@333 | 56 | 
| Chris@1010 | 57     QString getLocalFilename() const; | 
| Chris@1010 | 58 | 
| Chris@147 | 59     float getValueMinimum() const { return -1.0f; } | 
| Chris@147 | 60     float getValueMaximum() const { return  1.0f; } | 
| Chris@147 | 61 | 
| Chris@1038 | 62     virtual sv_frame_t getStartFrame() const { return m_startFrame; } | 
| Chris@1038 | 63     virtual sv_frame_t getEndFrame() const { return m_startFrame + getFrameCount(); } | 
| Chris@147 | 64 | 
| Chris@1038 | 65     void setStartFrame(sv_frame_t startFrame) { m_startFrame = startFrame; } | 
| Chris@147 | 66 | 
| Chris@1096 | 67     virtual std::vector<float> getData(int channel, sv_frame_t start, sv_frame_t count) const; | 
| Chris@147 | 68 | 
| Chris@1096 | 69     virtual std::vector<std::vector<float>> getMultiChannelData(int fromchannel, int tochannel, sv_frame_t start, sv_frame_t count) const; | 
| Chris@363 | 70 | 
| Chris@929 | 71     virtual int getSummaryBlockSize(int desired) const; | 
| Chris@377 | 72 | 
| Chris@1038 | 73     virtual void getSummaries(int channel, sv_frame_t start, sv_frame_t count, | 
| Chris@300 | 74                               RangeBlock &ranges, | 
| Chris@929 | 75                               int &blockSize) const; | 
| Chris@300 | 76 | 
| Chris@1038 | 77     virtual Range getSummary(int channel, sv_frame_t start, sv_frame_t count) const; | 
| Chris@147 | 78 | 
| Chris@345 | 79     QString getTypeName() const { return tr("Wave File"); } | 
| Chris@345 | 80 | 
| Chris@163 | 81     virtual void toXml(QTextStream &out, | 
| Chris@163 | 82                        QString indent = "", | 
| Chris@163 | 83                        QString extraAttributes = "") const; | 
| Chris@163 | 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@1122 | 95         RangeCacheFillThread(ReadOnlyWaveFileModel &model) : | 
| Chris@175 | 96 	    m_model(model), m_fillExtent(0), | 
| Chris@175 | 97             m_frameCount(model.getFrameCount()) { } | 
| Chris@147 | 98 | 
| Chris@1038 | 99 	sv_frame_t getFillExtent() const { return m_fillExtent; } | 
| Chris@147 | 100         virtual void run(); | 
| Chris@147 | 101 | 
| Chris@147 | 102     protected: | 
| Chris@1122 | 103         ReadOnlyWaveFileModel &m_model; | 
| Chris@1038 | 104 	sv_frame_t m_fillExtent; | 
| Chris@1038 | 105         sv_frame_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@1038 | 115     sv_frame_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@1038 | 121     sv_frame_t m_lastFillExtent; | 
| Chris@147 | 122     bool m_exiting; | 
| Chris@179 | 123     static PowerOfSqrtTwoZoomConstraint m_zoomConstraint; | 
| Chris@377 | 124 | 
| Chris@1096 | 125     mutable std::vector<float> m_directRead; | 
| Chris@1038 | 126     mutable sv_frame_t m_lastDirectReadStart; | 
| Chris@1038 | 127     mutable sv_frame_t m_lastDirectReadCount; | 
| Chris@377 | 128     mutable QMutex m_directReadMutex; | 
| Chris@147 | 129 }; | 
| Chris@147 | 130 | 
| Chris@147 | 131 #endif |