annotate data/model/WaveFileModel.h @ 823:f0558e69a074

Rename Resampling- to DecodingWavFileReader, and use it whenever we have an audio file that is not quickly seekable using libsndfile. Avoids very slow performance when analysing ogg files.
author Chris Cannam
date Wed, 17 Jul 2013 15:40:01 +0100
parents 29efe322ab47
children 59e7fe1b1003
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@147 89 protected slots:
Chris@147 90 void fillTimerTimedOut();
Chris@147 91 void cacheFilled();
Chris@147 92
Chris@147 93 protected:
Chris@147 94 void initialize();
Chris@147 95
Chris@147 96 class RangeCacheFillThread : public Thread
Chris@147 97 {
Chris@147 98 public:
Chris@147 99 RangeCacheFillThread(WaveFileModel &model) :
Chris@175 100 m_model(model), m_fillExtent(0),
Chris@175 101 m_frameCount(model.getFrameCount()) { }
Chris@147 102
Chris@147 103 size_t getFillExtent() const { return m_fillExtent; }
Chris@147 104 virtual void run();
Chris@147 105
Chris@147 106 protected:
Chris@147 107 WaveFileModel &m_model;
Chris@147 108 size_t m_fillExtent;
Chris@175 109 size_t m_frameCount;
Chris@147 110 };
Chris@147 111
Chris@147 112 void fillCache();
Chris@316 113
Chris@317 114 FileSource m_source;
Chris@147 115 QString m_path;
Chris@147 116 AudioFileReader *m_reader;
Chris@175 117 bool m_myReader;
Chris@147 118
Chris@300 119 size_t m_startFrame;
Chris@300 120
Chris@147 121 RangeBlock m_cache[2]; // interleaved at two base resolutions
Chris@147 122 mutable QMutex m_mutex;
Chris@147 123 RangeCacheFillThread *m_fillThread;
Chris@147 124 QTimer *m_updateTimer;
Chris@147 125 size_t m_lastFillExtent;
Chris@147 126 bool m_exiting;
Chris@179 127 static PowerOfSqrtTwoZoomConstraint m_zoomConstraint;
Chris@377 128
Chris@377 129 mutable SampleBlock m_directRead;
Chris@377 130 mutable size_t m_lastDirectReadStart;
Chris@377 131 mutable size_t m_lastDirectReadCount;
Chris@377 132 mutable QMutex m_directReadMutex;
Chris@147 133 };
Chris@147 134
Chris@147 135 #endif