annotate data/fileio/CodedAudioFileReader.h @ 1078:ce82bcdc95d0

Fail upfront if the file is going to be too large. We expect the caller to split up large data sets into several MatrixFiles
author Chris Cannam
date Wed, 10 Jun 2015 13:10:26 +0100
parents 843f67be0ed9
children 4d9816ba0ebe
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@1041 41 virtual SampleBlock getInterleavedFrames(sv_frame_t start, sv_frame_t count) const;
Chris@148 42
Chris@1040 43 virtual sv_samplerate_t getNativeRate() const { return m_fileRate; }
Chris@297 44
Chris@1010 45 virtual QString getLocalFilename() const { return m_cacheFileName; }
Chris@1010 46
Chris@823 47 /// Intermediate cache means all CodedAudioFileReaders are quickly seekable
Chris@823 48 virtual bool isQuicklySeekable() const { return true; }
Chris@823 49
Chris@357 50 signals:
Chris@357 51 void progress(int);
Chris@357 52
Chris@148 53 protected:
Chris@933 54 CodedAudioFileReader(CacheMode cacheMode,
Chris@1040 55 sv_samplerate_t targetRate,
Chris@920 56 bool normalised);
Chris@148 57
Chris@148 58 void initialiseDecodeCache(); // samplerate, channels must have been set
Chris@544 59
Chris@544 60 // may throw InsufficientDiscSpace:
Chris@1038 61 void addSamplesToDecodeCache(float **samples, sv_frame_t nframes);
Chris@1038 62 void addSamplesToDecodeCache(float *samplesInterleaved, sv_frame_t nframes);
Chris@297 63 void addSamplesToDecodeCache(const SampleBlock &interleaved);
Chris@544 64
Chris@544 65 // may throw InsufficientDiscSpace:
Chris@148 66 void finishDecodeCache();
Chris@544 67
Chris@148 68 bool isDecodeCacheInitialised() const { return m_initialised; }
Chris@148 69
Chris@297 70 void startSerialised(QString id);
Chris@297 71 void endSerialised();
Chris@297 72
Chris@297 73 private:
Chris@1038 74 void pushBuffer(float *interleaved, sv_frame_t sz, bool final);
Chris@1038 75 void pushBufferResampling(float *interleaved, sv_frame_t sz, double ratio, bool final);
Chris@1038 76 void pushBufferNonResampling(float *interleaved, sv_frame_t sz);
Chris@297 77
Chris@297 78 protected:
Chris@263 79 QMutex m_cacheMutex;
Chris@148 80 CacheMode m_cacheMode;
Chris@148 81 SampleBlock m_data;
Chris@543 82 mutable QReadWriteLock m_dataLock;
Chris@148 83 bool m_initialised;
Chris@297 84 Serialiser *m_serialiser;
Chris@1040 85 sv_samplerate_t m_fileRate;
Chris@148 86
Chris@290 87 QString m_cacheFileName;
Chris@148 88 SNDFILE *m_cacheFileWritePtr;
Chris@148 89 WavFileReader *m_cacheFileReader;
Chris@148 90 float *m_cacheWriteBuffer;
Chris@1038 91 sv_frame_t m_cacheWriteBufferIndex;
Chris@1038 92 sv_frame_t m_cacheWriteBufferSize; // frames
Chris@297 93
Chris@297 94 Resampler *m_resampler;
Chris@297 95 float *m_resampleBuffer;
Chris@1038 96 sv_frame_t m_fileFrameCount;
Chris@920 97
Chris@920 98 bool m_normalised;
Chris@920 99 float m_max;
Chris@920 100 float m_gain;
Chris@148 101 };
Chris@148 102
Chris@148 103 #endif