Chris@148: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@148: Chris@148: /* Chris@148: Sonic Visualiser Chris@148: An audio file viewer and annotation editor. Chris@148: Centre for Digital Music, Queen Mary, University of London. Chris@148: This file copyright 2006 Chris Cannam. Chris@148: Chris@148: This program is free software; you can redistribute it and/or Chris@148: modify it under the terms of the GNU General Public License as Chris@148: published by the Free Software Foundation; either version 2 of the Chris@148: License, or (at your option) any later version. See the file Chris@148: COPYING included with this distribution for more information. Chris@148: */ Chris@148: Chris@1359: #ifndef SV_CODED_AUDIO_FILE_READER_H Chris@1359: #define SV_CODED_AUDIO_FILE_READER_H Chris@148: Chris@148: #include "AudioFileReader.h" Chris@148: Chris@263: #include Chris@543: #include Chris@148: Chris@1359: #ifdef Q_OS_WIN Chris@1359: #include Chris@1359: #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 Chris@1359: #endif Chris@1359: Chris@1359: #include Chris@1359: Chris@148: class WavFileReader; Chris@297: class Serialiser; Chris@1318: Chris@1318: namespace breakfastquay { Chris@1318: class Resampler; Chris@1318: } Chris@148: Chris@148: class CodedAudioFileReader : public AudioFileReader Chris@148: { Chris@357: Q_OBJECT Chris@357: Chris@148: public: Chris@148: virtual ~CodedAudioFileReader(); Chris@148: Chris@148: enum CacheMode { Chris@148: CacheInTemporaryFile, Chris@148: CacheInMemory Chris@148: }; Chris@148: Chris@1097: enum DecodeMode { Chris@1097: DecodeAtOnce, // decode the file on construction, with progress Chris@1097: DecodeThreaded // decode in a background thread after construction Chris@1097: }; Chris@1097: Chris@1326: virtual floatvec_t getInterleavedFrames(sv_frame_t start, sv_frame_t count) const; Chris@148: Chris@1040: virtual sv_samplerate_t getNativeRate() const { return m_fileRate; } Chris@297: Chris@1010: virtual QString getLocalFilename() const { return m_cacheFileName; } Chris@1010: Chris@823: /// Intermediate cache means all CodedAudioFileReaders are quickly seekable Chris@823: virtual bool isQuicklySeekable() const { return true; } Chris@823: Chris@357: signals: Chris@357: void progress(int); Chris@357: Chris@148: protected: Chris@933: CodedAudioFileReader(CacheMode cacheMode, Chris@1040: sv_samplerate_t targetRate, Chris@920: bool normalised); Chris@148: Chris@148: void initialiseDecodeCache(); // samplerate, channels must have been set Chris@544: Chris@1305: // compensation for encoder delays: Chris@1307: void setFramesToTrim(sv_frame_t fromStart, sv_frame_t fromEnd); Chris@1305: Chris@544: // may throw InsufficientDiscSpace: Chris@1038: void addSamplesToDecodeCache(float **samples, sv_frame_t nframes); Chris@1038: void addSamplesToDecodeCache(float *samplesInterleaved, sv_frame_t nframes); Chris@1326: void addSamplesToDecodeCache(const floatvec_t &interleaved); Chris@544: Chris@544: // may throw InsufficientDiscSpace: Chris@148: void finishDecodeCache(); Chris@544: Chris@148: bool isDecodeCacheInitialised() const { return m_initialised; } Chris@148: Chris@297: void startSerialised(QString id); Chris@297: void endSerialised(); Chris@297: Chris@297: private: Chris@1306: void pushCacheWriteBufferMaybe(bool final); Chris@1306: Chris@1306: sv_frame_t pushBuffer(float *interleaved, sv_frame_t sz, bool final); Chris@1306: Chris@1306: // to be called only by pushBuffer Chris@1038: void pushBufferResampling(float *interleaved, sv_frame_t sz, double ratio, bool final); Chris@1306: Chris@1306: // to be called only by pushBuffer and pushBufferResampling Chris@1038: void pushBufferNonResampling(float *interleaved, sv_frame_t sz); Chris@297: Chris@297: protected: Chris@263: QMutex m_cacheMutex; Chris@148: CacheMode m_cacheMode; Chris@1326: floatvec_t m_data; Chris@1100: mutable QMutex m_dataLock; Chris@148: bool m_initialised; Chris@297: Serialiser *m_serialiser; Chris@1040: sv_samplerate_t m_fileRate; Chris@148: Chris@290: QString m_cacheFileName; Chris@148: SNDFILE *m_cacheFileWritePtr; Chris@148: WavFileReader *m_cacheFileReader; Chris@148: float *m_cacheWriteBuffer; Chris@1320: sv_frame_t m_cacheWriteBufferIndex; // buffer write pointer in samples Chris@1320: sv_frame_t m_cacheWriteBufferFrames; // buffer size in frames Chris@297: Chris@1318: breakfastquay::Resampler *m_resampler; Chris@297: float *m_resampleBuffer; Chris@1320: int m_resampleBufferFrames; Chris@1038: sv_frame_t m_fileFrameCount; Chris@920: Chris@920: bool m_normalised; Chris@920: float m_max; Chris@920: float m_gain; Chris@1285: Chris@1305: sv_frame_t m_trimFromStart; Chris@1305: sv_frame_t m_trimFromEnd; Chris@1305: Chris@1285: sv_frame_t m_clippedCount; Chris@1285: sv_frame_t m_firstNonzero; Chris@1286: sv_frame_t m_lastNonzero; Chris@148: }; Chris@148: Chris@148: #endif