annotate data/fileio/CodedAudioFileReader.h @ 1247:8f076d02569a piper

Make SVDEBUG always write to a log file -- formerly this was disabled in NDEBUG builds. I think there's little use to that, it just means that we keep adding more cerr debug output because we aren't getting the log we need. And SVDEBUG logging is not usually used in tight loops, I don't think the performance overhead is too serious. Also update the About box.
author Chris Cannam
date Thu, 03 Nov 2016 14:57:00 +0000
parents 5cbf71022679
children 757a406dabc4
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@1097 41 enum DecodeMode {
Chris@1097 42 DecodeAtOnce, // decode the file on construction, with progress
Chris@1097 43 DecodeThreaded // decode in a background thread after construction
Chris@1097 44 };
Chris@1097 45
Chris@1096 46 virtual std::vector<float> getInterleavedFrames(sv_frame_t start, sv_frame_t count) const;
Chris@148 47
Chris@1040 48 virtual sv_samplerate_t getNativeRate() const { return m_fileRate; }
Chris@297 49
Chris@1010 50 virtual QString getLocalFilename() const { return m_cacheFileName; }
Chris@1010 51
Chris@823 52 /// Intermediate cache means all CodedAudioFileReaders are quickly seekable
Chris@823 53 virtual bool isQuicklySeekable() const { return true; }
Chris@823 54
Chris@357 55 signals:
Chris@357 56 void progress(int);
Chris@357 57
Chris@148 58 protected:
Chris@933 59 CodedAudioFileReader(CacheMode cacheMode,
Chris@1040 60 sv_samplerate_t targetRate,
Chris@920 61 bool normalised);
Chris@148 62
Chris@148 63 void initialiseDecodeCache(); // samplerate, channels must have been set
Chris@544 64
Chris@544 65 // may throw InsufficientDiscSpace:
Chris@1038 66 void addSamplesToDecodeCache(float **samples, sv_frame_t nframes);
Chris@1038 67 void addSamplesToDecodeCache(float *samplesInterleaved, sv_frame_t nframes);
Chris@1096 68 void addSamplesToDecodeCache(const std::vector<float> &interleaved);
Chris@544 69
Chris@544 70 // may throw InsufficientDiscSpace:
Chris@148 71 void finishDecodeCache();
Chris@544 72
Chris@148 73 bool isDecodeCacheInitialised() const { return m_initialised; }
Chris@148 74
Chris@297 75 void startSerialised(QString id);
Chris@297 76 void endSerialised();
Chris@297 77
Chris@297 78 private:
Chris@1038 79 void pushBuffer(float *interleaved, sv_frame_t sz, bool final);
Chris@1038 80 void pushBufferResampling(float *interleaved, sv_frame_t sz, double ratio, bool final);
Chris@1038 81 void pushBufferNonResampling(float *interleaved, sv_frame_t sz);
Chris@297 82
Chris@297 83 protected:
Chris@263 84 QMutex m_cacheMutex;
Chris@148 85 CacheMode m_cacheMode;
Chris@1096 86 std::vector<float> m_data;
Chris@1100 87 mutable QMutex m_dataLock;
Chris@148 88 bool m_initialised;
Chris@297 89 Serialiser *m_serialiser;
Chris@1040 90 sv_samplerate_t m_fileRate;
Chris@148 91
Chris@290 92 QString m_cacheFileName;
Chris@148 93 SNDFILE *m_cacheFileWritePtr;
Chris@148 94 WavFileReader *m_cacheFileReader;
Chris@148 95 float *m_cacheWriteBuffer;
Chris@1038 96 sv_frame_t m_cacheWriteBufferIndex;
Chris@1038 97 sv_frame_t m_cacheWriteBufferSize; // frames
Chris@297 98
Chris@297 99 Resampler *m_resampler;
Chris@297 100 float *m_resampleBuffer;
Chris@1038 101 sv_frame_t m_fileFrameCount;
Chris@920 102
Chris@920 103 bool m_normalised;
Chris@920 104 float m_max;
Chris@920 105 float m_gain;
Chris@148 106 };
Chris@148 107
Chris@148 108 #endif