annotate data/model/WaveFileModel.h @ 1008:d9e0e59a1581

When using an aggregate model to pass data to a transform, zero-pad the shorter input to the duration of the longer rather than truncating the longer. (This is better behaviour for e.g. MATCH, and in any case the code was previously truncating incorrectly and ending up with garbage data at the end.)
author Chris Cannam
date Fri, 14 Nov 2014 13:51:33 +0000
parents 6d2ece0fe356
children 36f79bc5c3d7
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@929 37 WaveFileModel(FileSource source, int 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@929 46 int getFrameCount() const;
Chris@929 47 int getChannelCount() const;
Chris@929 48 int getSampleRate() const;
Chris@929 49 int 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@929 60 virtual int getStartFrame() const { return m_startFrame; }
Chris@929 61 virtual int getEndFrame() const { return m_startFrame + getFrameCount(); }
Chris@147 62
Chris@929 63 void setStartFrame(int startFrame) { m_startFrame = startFrame; }
Chris@147 64
Chris@929 65 virtual int getData(int channel, int start, int count,
Chris@948 66 float *buffer) const;
Chris@147 67
Chris@929 68 virtual int getData(int channel, int start, int count,
Chris@948 69 double *buffer) const;
Chris@147 70
Chris@929 71 virtual int getData(int fromchannel, int tochannel,
Chris@948 72 int start, int count,
Chris@948 73 float **buffers) const;
Chris@363 74
Chris@929 75 virtual int getSummaryBlockSize(int desired) const;
Chris@377 76
Chris@929 77 virtual void getSummaries(int channel, int start, int count,
Chris@300 78 RangeBlock &ranges,
Chris@929 79 int &blockSize) const;
Chris@300 80
Chris@929 81 virtual Range getSummary(int channel, int start, int 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@929 103 int 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@929 108 int m_fillExtent;
Chris@929 109 int 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@929 119 int 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@929 125 int 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@929 130 mutable int m_lastDirectReadStart;
Chris@929 131 mutable int m_lastDirectReadCount;
Chris@377 132 mutable QMutex m_directReadMutex;
Chris@147 133 };
Chris@147 134
Chris@147 135 #endif