annotate data/fileio/AudioFileReader.h @ 661:a4faa1840384

* If a FileSource URL won't convert at all in strict mode, try again in tolerant mode (necessary for e.g. filenames with square brackets in them)
author Chris Cannam
date Tue, 19 Oct 2010 21:47:55 +0100
parents 5db8181ea521
children f0558e69a074
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@632 24 #include <map>
Chris@327 25
Chris@327 26 typedef std::vector<float> SampleBlock;
Chris@327 27
Chris@175 28 class AudioFileReader : public QObject
Chris@148 29 {
Chris@175 30 Q_OBJECT
Chris@175 31
Chris@148 32 public:
Chris@148 33 virtual ~AudioFileReader() { }
Chris@148 34
Chris@148 35 bool isOK() const { return (m_channelCount > 0); }
Chris@148 36
Chris@290 37 virtual QString getError() const { return ""; }
Chris@148 38
Chris@148 39 size_t getFrameCount() const { return m_frameCount; }
Chris@148 40 size_t getChannelCount() const { return m_channelCount; }
Chris@148 41 size_t getSampleRate() const { return m_sampleRate; }
Chris@660 42
Chris@660 43 virtual size_t getNativeRate() const { return m_sampleRate; } // if resampled
Chris@345 44
Chris@345 45 /**
Chris@345 46 * Return the location of the audio data in the reader (as passed
Chris@345 47 * in to the FileSource constructor, for example).
Chris@345 48 */
Chris@345 49 virtual QString getLocation() const { return ""; }
Chris@148 50
Chris@271 51 /**
Chris@271 52 * Return the title of the work in the audio file, if known. This
Chris@271 53 * may be implemented by subclasses that support file tagging.
Chris@271 54 * This is not the same thing as the file name.
Chris@271 55 */
Chris@290 56 virtual QString getTitle() const { return ""; }
Chris@271 57
Chris@333 58 /**
Chris@333 59 * Return the "maker" of the work in the audio file, if known.
Chris@333 60 * This could represent almost anything (band, composer,
Chris@333 61 * conductor, artist etc).
Chris@333 62 */
Chris@333 63 virtual QString getMaker() const { return ""; }
Chris@333 64
Chris@632 65 typedef std::map<QString, QString> TagMap;
Chris@632 66 virtual TagMap getTags() const { return TagMap(); }
Chris@632 67
Chris@148 68 /**
Chris@327 69 * Return interleaved samples for count frames from index start.
Chris@327 70 * The resulting sample block will contain count *
Chris@327 71 * getChannelCount() samples (or fewer if end of file is reached).
Chris@327 72 *
Chris@148 73 * The subclass implementations of this function must be
Chris@148 74 * thread-safe -- that is, safe to call from multiple threads with
Chris@148 75 * different arguments on the same object at the same time.
Chris@148 76 */
Chris@148 77 virtual void getInterleavedFrames(size_t start, size_t count,
Chris@148 78 SampleBlock &frames) const = 0;
Chris@175 79
Chris@327 80 /**
Chris@327 81 * Return de-interleaved samples for count frames from index
Chris@327 82 * start. Implemented in this class (it calls
Chris@327 83 * getInterleavedFrames and de-interleaves). The resulting vector
Chris@327 84 * will contain getChannelCount() sample blocks of count samples
Chris@327 85 * each (or fewer if end of file is reached).
Chris@327 86 */
Chris@327 87 virtual void getDeInterleavedFrames(size_t start, size_t count,
Chris@327 88 std::vector<SampleBlock> &frames) const;
Chris@327 89
Chris@265 90 // only subclasses that do not know exactly how long the audio
Chris@265 91 // file is until it's been completely decoded should implement this
Chris@265 92 virtual int getDecodeCompletion() const { return 100; } // %
Chris@265 93
Chris@176 94 virtual bool isUpdating() const { return false; }
Chris@176 95
Chris@175 96 signals:
Chris@175 97 void frameCountChanged();
Chris@148 98
Chris@148 99 protected:
Chris@148 100 size_t m_frameCount;
Chris@148 101 size_t m_channelCount;
Chris@148 102 size_t m_sampleRate;
Chris@148 103 };
Chris@148 104
Chris@148 105 #endif