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@148: #ifndef _CODED_AUDIO_FILE_READER_H_ Chris@148: #define _CODED_AUDIO_FILE_READER_H_ Chris@148: Chris@148: #include "AudioFileReader.h" Chris@148: Chris@148: #include Chris@263: #include Chris@543: #include Chris@148: Chris@148: class WavFileReader; Chris@297: class Serialiser; Chris@297: class Resampler; 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@148: virtual void getInterleavedFrames(size_t start, size_t count, Chris@148: SampleBlock &frames) const; Chris@148: Chris@297: virtual size_t getNativeRate() const { return m_fileRate; } Chris@297: Chris@357: signals: Chris@357: void progress(int); Chris@357: Chris@148: protected: Chris@297: CodedAudioFileReader(CacheMode cacheMode, size_t targetRate); Chris@148: Chris@148: void initialiseDecodeCache(); // samplerate, channels must have been set Chris@544: Chris@544: // may throw InsufficientDiscSpace: Chris@297: void addSamplesToDecodeCache(float **samples, size_t nframes); Chris@297: void addSamplesToDecodeCache(float *samplesInterleaved, size_t nframes); Chris@297: void addSamplesToDecodeCache(const SampleBlock &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@297: void pushBuffer(float *interleaved, size_t sz, bool final); Chris@758: void pushBufferResampling(float *interleaved, size_t sz, float ratio, bool final); Chris@758: void pushBufferNonResampling(float *interleaved, size_t sz); Chris@297: Chris@297: protected: Chris@263: QMutex m_cacheMutex; Chris@148: CacheMode m_cacheMode; Chris@148: SampleBlock m_data; Chris@543: mutable QReadWriteLock m_dataLock; Chris@148: bool m_initialised; Chris@297: Serialiser *m_serialiser; Chris@297: size_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@148: size_t m_cacheWriteBufferIndex; Chris@148: size_t m_cacheWriteBufferSize; // frames Chris@297: Chris@297: Resampler *m_resampler; Chris@297: float *m_resampleBuffer; Chris@757: size_t m_fileFrameCount; Chris@148: }; Chris@148: Chris@148: #endif