annotate data/fileio/CodedAudioFileReader.h @ 588:d04b8674b710

* Try to identify the properly conformant audio file structure written out by Sonic Annotator (but we still don't actually import it yet)
author Chris Cannam
date Wed, 13 May 2009 13:30:08 +0000
parents 65d955c4d671
children b98f5daab19e
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@357 46 signals:
Chris@357 47 void progress(int);
Chris@357 48
Chris@148 49 protected:
Chris@297 50 CodedAudioFileReader(CacheMode cacheMode, size_t targetRate);
Chris@148 51
Chris@148 52 void initialiseDecodeCache(); // samplerate, channels must have been set
Chris@544 53
Chris@544 54 // may throw InsufficientDiscSpace:
Chris@297 55 void addSamplesToDecodeCache(float **samples, size_t nframes);
Chris@297 56 void addSamplesToDecodeCache(float *samplesInterleaved, size_t nframes);
Chris@297 57 void addSamplesToDecodeCache(const SampleBlock &interleaved);
Chris@544 58
Chris@544 59 // may throw InsufficientDiscSpace:
Chris@148 60 void finishDecodeCache();
Chris@544 61
Chris@148 62 bool isDecodeCacheInitialised() const { return m_initialised; }
Chris@148 63
Chris@297 64 void startSerialised(QString id);
Chris@297 65 void endSerialised();
Chris@297 66
Chris@297 67 private:
Chris@297 68 void pushBuffer(float *interleaved, size_t sz, bool final);
Chris@297 69
Chris@297 70 protected:
Chris@263 71 QMutex m_cacheMutex;
Chris@148 72 CacheMode m_cacheMode;
Chris@148 73 SampleBlock m_data;
Chris@543 74 mutable QReadWriteLock m_dataLock;
Chris@148 75 bool m_initialised;
Chris@297 76 Serialiser *m_serialiser;
Chris@297 77 size_t m_fileRate;
Chris@148 78
Chris@290 79 QString m_cacheFileName;
Chris@148 80 SNDFILE *m_cacheFileWritePtr;
Chris@148 81 WavFileReader *m_cacheFileReader;
Chris@148 82 float *m_cacheWriteBuffer;
Chris@148 83 size_t m_cacheWriteBufferIndex;
Chris@148 84 size_t m_cacheWriteBufferSize; // frames
Chris@297 85
Chris@297 86 Resampler *m_resampler;
Chris@297 87 float *m_resampleBuffer;
Chris@148 88 };
Chris@148 89
Chris@148 90 #endif