annotate data/fileio/CodedAudioFileReader.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 d03b3d956358
children 36f79bc5c3d7
rev   line source
Chris@148 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@148 2
Chris@148 3 /*
Chris@148 4 Sonic Visualiser
Chris@148 5 An audio file viewer and annotation editor.
Chris@148 6 Centre for Digital Music, Queen Mary, University of London.
Chris@148 7 This file copyright 2006 Chris Cannam.
Chris@148 8
Chris@148 9 This program is free software; you can redistribute it and/or
Chris@148 10 modify it under the terms of the GNU General Public License as
Chris@148 11 published by the Free Software Foundation; either version 2 of the
Chris@148 12 License, or (at your option) any later version. See the file
Chris@148 13 COPYING included with this distribution for more information.
Chris@148 14 */
Chris@148 15
Chris@148 16 #ifndef _CODED_AUDIO_FILE_READER_H_
Chris@148 17 #define _CODED_AUDIO_FILE_READER_H_
Chris@148 18
Chris@148 19 #include "AudioFileReader.h"
Chris@148 20
Chris@148 21 #include <sndfile.h>
Chris@263 22 #include <QMutex>
Chris@543 23 #include <QReadWriteLock>
Chris@148 24
Chris@148 25 class WavFileReader;
Chris@297 26 class Serialiser;
Chris@297 27 class Resampler;
Chris@148 28
Chris@148 29 class CodedAudioFileReader : public AudioFileReader
Chris@148 30 {
Chris@357 31 Q_OBJECT
Chris@357 32
Chris@148 33 public:
Chris@148 34 virtual ~CodedAudioFileReader();
Chris@148 35
Chris@148 36 enum CacheMode {
Chris@148 37 CacheInTemporaryFile,
Chris@148 38 CacheInMemory
Chris@148 39 };
Chris@148 40
Chris@929 41 virtual void getInterleavedFrames(int start, int count,
Chris@148 42 SampleBlock &frames) const;
Chris@148 43
Chris@929 44 virtual int getNativeRate() const { return m_fileRate; }
Chris@297 45
Chris@823 46 /// Intermediate cache means all CodedAudioFileReaders are quickly seekable
Chris@823 47 virtual bool isQuicklySeekable() const { return true; }
Chris@823 48
Chris@357 49 signals:
Chris@357 50 void progress(int);
Chris@357 51
Chris@148 52 protected:
Chris@933 53 CodedAudioFileReader(CacheMode cacheMode,
Chris@933 54 int targetRate,
Chris@920 55 bool normalised);
Chris@148 56
Chris@148 57 void initialiseDecodeCache(); // samplerate, channels must have been set
Chris@544 58
Chris@544 59 // may throw InsufficientDiscSpace:
Chris@929 60 void addSamplesToDecodeCache(float **samples, int nframes);
Chris@929 61 void addSamplesToDecodeCache(float *samplesInterleaved, int nframes);
Chris@297 62 void addSamplesToDecodeCache(const SampleBlock &interleaved);
Chris@544 63
Chris@544 64 // may throw InsufficientDiscSpace:
Chris@148 65 void finishDecodeCache();
Chris@544 66
Chris@148 67 bool isDecodeCacheInitialised() const { return m_initialised; }
Chris@148 68
Chris@297 69 void startSerialised(QString id);
Chris@297 70 void endSerialised();
Chris@297 71
Chris@297 72 private:
Chris@929 73 void pushBuffer(float *interleaved, int sz, bool final);
Chris@929 74 void pushBufferResampling(float *interleaved, int sz, float ratio, bool final);
Chris@929 75 void pushBufferNonResampling(float *interleaved, int sz);
Chris@297 76
Chris@297 77 protected:
Chris@263 78 QMutex m_cacheMutex;
Chris@148 79 CacheMode m_cacheMode;
Chris@148 80 SampleBlock m_data;
Chris@543 81 mutable QReadWriteLock m_dataLock;
Chris@148 82 bool m_initialised;
Chris@297 83 Serialiser *m_serialiser;
Chris@929 84 int m_fileRate;
Chris@148 85
Chris@290 86 QString m_cacheFileName;
Chris@148 87 SNDFILE *m_cacheFileWritePtr;
Chris@148 88 WavFileReader *m_cacheFileReader;
Chris@148 89 float *m_cacheWriteBuffer;
Chris@929 90 int m_cacheWriteBufferIndex;
Chris@929 91 int m_cacheWriteBufferSize; // frames
Chris@297 92
Chris@297 93 Resampler *m_resampler;
Chris@297 94 float *m_resampleBuffer;
Chris@929 95 int m_fileFrameCount;
Chris@920 96
Chris@920 97 bool m_normalised;
Chris@920 98 float m_max;
Chris@920 99 float m_gain;
Chris@148 100 };
Chris@148 101
Chris@148 102 #endif