annotate data/fileio/AudioFileReader.h @ 490:c3fb8258e34d

* Make it possible to import an entire session from an RDF document. However, at the moment the timings of events appear to be constrained by how far the audio decoder has got through its audio file at the time the event is queried -- need to investigate.
author Chris Cannam
date Fri, 21 Nov 2008 18:03:14 +0000
parents 700cd3350391
children a4b8ad0f1a8f
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 _AUDIO_FILE_READER_H_
Chris@148 17 #define _AUDIO_FILE_READER_H_
Chris@148 18
Chris@290 19 #include <QString>
Chris@148 20
Chris@317 21 #include "FileSource.h"
Chris@316 22
Chris@327 23 #include <vector>
Chris@327 24
Chris@327 25 typedef std::vector<float> SampleBlock;
Chris@327 26
Chris@175 27 class AudioFileReader : public QObject
Chris@148 28 {
Chris@175 29 Q_OBJECT
Chris@175 30
Chris@148 31 public:
Chris@148 32 virtual ~AudioFileReader() { }
Chris@148 33
Chris@148 34 bool isOK() const { return (m_channelCount > 0); }
Chris@148 35
Chris@290 36 virtual QString getError() const { return ""; }
Chris@148 37
Chris@148 38 size_t getFrameCount() const { return m_frameCount; }
Chris@148 39 size_t getChannelCount() const { return m_channelCount; }
Chris@148 40 size_t getSampleRate() const { return m_sampleRate; }
Chris@297 41 size_t getNativeRate() const { return m_sampleRate; } // if resampled
Chris@345 42
Chris@345 43 /**
Chris@345 44 * Return the location of the audio data in the reader (as passed
Chris@345 45 * in to the FileSource constructor, for example).
Chris@345 46 */
Chris@345 47 virtual QString getLocation() const { return ""; }
Chris@148 48
Chris@271 49 /**
Chris@271 50 * Return the title of the work in the audio file, if known. This
Chris@271 51 * may be implemented by subclasses that support file tagging.
Chris@271 52 * This is not the same thing as the file name.
Chris@271 53 */
Chris@290 54 virtual QString getTitle() const { return ""; }
Chris@271 55
Chris@333 56 /**
Chris@333 57 * Return the "maker" of the work in the audio file, if known.
Chris@333 58 * This could represent almost anything (band, composer,
Chris@333 59 * conductor, artist etc).
Chris@333 60 */
Chris@333 61 virtual QString getMaker() const { return ""; }
Chris@333 62
Chris@148 63 /**
Chris@327 64 * Return interleaved samples for count frames from index start.
Chris@327 65 * The resulting sample block will contain count *
Chris@327 66 * getChannelCount() samples (or fewer if end of file is reached).
Chris@327 67 *
Chris@148 68 * The subclass implementations of this function must be
Chris@148 69 * thread-safe -- that is, safe to call from multiple threads with
Chris@148 70 * different arguments on the same object at the same time.
Chris@148 71 */
Chris@148 72 virtual void getInterleavedFrames(size_t start, size_t count,
Chris@148 73 SampleBlock &frames) const = 0;
Chris@175 74
Chris@327 75 /**
Chris@327 76 * Return de-interleaved samples for count frames from index
Chris@327 77 * start. Implemented in this class (it calls
Chris@327 78 * getInterleavedFrames and de-interleaves). The resulting vector
Chris@327 79 * will contain getChannelCount() sample blocks of count samples
Chris@327 80 * each (or fewer if end of file is reached).
Chris@327 81 */
Chris@327 82 virtual void getDeInterleavedFrames(size_t start, size_t count,
Chris@327 83 std::vector<SampleBlock> &frames) const;
Chris@327 84
Chris@265 85 // only subclasses that do not know exactly how long the audio
Chris@265 86 // file is until it's been completely decoded should implement this
Chris@265 87 virtual int getDecodeCompletion() const { return 100; } // %
Chris@265 88
Chris@176 89 virtual bool isUpdating() const { return false; }
Chris@176 90
Chris@175 91 signals:
Chris@175 92 void frameCountChanged();
Chris@148 93
Chris@148 94 protected:
Chris@148 95 size_t m_frameCount;
Chris@148 96 size_t m_channelCount;
Chris@148 97 size_t m_sampleRate;
Chris@148 98 };
Chris@148 99
Chris@148 100 #endif