annotate data/fileio/CodedAudioFileReader.h @ 875:3e6ed8a8577b tonioni

Use a sparse time-value model only for outputs with fixed bin count of 1, not for those with unknown bin count. (Precursor to using more than one model for outputs with unknown bin count)
author Chris Cannam
date Tue, 28 Jan 2014 18:52:22 +0000
parents f0558e69a074
children f3cda3280398 59e7fe1b1003
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@148 41 virtual void getInterleavedFrames(size_t start, size_t count,
Chris@148 42 SampleBlock &frames) const;
Chris@148 43
Chris@297 44 virtual size_t 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@297 53 CodedAudioFileReader(CacheMode cacheMode, size_t targetRate);
Chris@148 54
Chris@148 55 void initialiseDecodeCache(); // samplerate, channels must have been set
Chris@544 56
Chris@544 57 // may throw InsufficientDiscSpace:
Chris@297 58 void addSamplesToDecodeCache(float **samples, size_t nframes);
Chris@297 59 void addSamplesToDecodeCache(float *samplesInterleaved, size_t nframes);
Chris@297 60 void addSamplesToDecodeCache(const SampleBlock &interleaved);
Chris@544 61
Chris@544 62 // may throw InsufficientDiscSpace:
Chris@148 63 void finishDecodeCache();
Chris@544 64
Chris@148 65 bool isDecodeCacheInitialised() const { return m_initialised; }
Chris@148 66
Chris@297 67 void startSerialised(QString id);
Chris@297 68 void endSerialised();
Chris@297 69
Chris@297 70 private:
Chris@297 71 void pushBuffer(float *interleaved, size_t sz, bool final);
Chris@758 72 void pushBufferResampling(float *interleaved, size_t sz, float ratio, bool final);
Chris@758 73 void pushBufferNonResampling(float *interleaved, size_t sz);
Chris@297 74
Chris@297 75 protected:
Chris@263 76 QMutex m_cacheMutex;
Chris@148 77 CacheMode m_cacheMode;
Chris@148 78 SampleBlock m_data;
Chris@543 79 mutable QReadWriteLock m_dataLock;
Chris@148 80 bool m_initialised;
Chris@297 81 Serialiser *m_serialiser;
Chris@297 82 size_t m_fileRate;
Chris@148 83
Chris@290 84 QString m_cacheFileName;
Chris@148 85 SNDFILE *m_cacheFileWritePtr;
Chris@148 86 WavFileReader *m_cacheFileReader;
Chris@148 87 float *m_cacheWriteBuffer;
Chris@148 88 size_t m_cacheWriteBufferIndex;
Chris@148 89 size_t m_cacheWriteBufferSize; // frames
Chris@297 90
Chris@297 91 Resampler *m_resampler;
Chris@297 92 float *m_resampleBuffer;
Chris@757 93 size_t m_fileFrameCount;
Chris@148 94 };
Chris@148 95
Chris@148 96 #endif