annotate data/fileio/AudioFileReader.h @ 1078:ce82bcdc95d0

Fail upfront if the file is going to be too large. We expect the caller to split up large data sets into several MatrixFiles
author Chris Cannam
date Wed, 10 Jun 2015 13:10:26 +0100
parents 843f67be0ed9
children 4d9816ba0ebe
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@1038 21 #include "base/BaseTypes.h"
Chris@317 22 #include "FileSource.h"
Chris@316 23
Chris@327 24 #include <vector>
Chris@632 25 #include <map>
Chris@327 26
Chris@327 27 typedef std::vector<float> SampleBlock;
Chris@327 28
Chris@175 29 class AudioFileReader : public QObject
Chris@148 30 {
Chris@175 31 Q_OBJECT
Chris@175 32
Chris@148 33 public:
Chris@148 34 virtual ~AudioFileReader() { }
Chris@148 35
Chris@148 36 bool isOK() const { return (m_channelCount > 0); }
Chris@148 37
Chris@290 38 virtual QString getError() const { return ""; }
Chris@148 39
Chris@1038 40 sv_frame_t getFrameCount() const { return m_frameCount; }
Chris@929 41 int getChannelCount() const { return m_channelCount; }
Chris@1040 42 sv_samplerate_t getSampleRate() const { return m_sampleRate; }
Chris@660 43
Chris@1040 44 virtual sv_samplerate_t getNativeRate() const { return m_sampleRate; } // if resampled
Chris@345 45
Chris@345 46 /**
Chris@345 47 * Return the location of the audio data in the reader (as passed
Chris@345 48 * in to the FileSource constructor, for example).
Chris@345 49 */
Chris@345 50 virtual QString getLocation() const { return ""; }
Chris@148 51
Chris@271 52 /**
Chris@271 53 * Return the title of the work in the audio file, if known. This
Chris@271 54 * may be implemented by subclasses that support file tagging.
Chris@271 55 * This is not the same thing as the file name.
Chris@271 56 */
Chris@290 57 virtual QString getTitle() const { return ""; }
Chris@271 58
Chris@333 59 /**
Chris@333 60 * Return the "maker" of the work in the audio file, if known.
Chris@333 61 * This could represent almost anything (band, composer,
Chris@333 62 * conductor, artist etc).
Chris@333 63 */
Chris@333 64 virtual QString getMaker() const { return ""; }
Chris@333 65
Chris@1010 66 /**
Chris@1010 67 * Return the local file path of the audio data. This is the
Chris@1010 68 * location most likely to contain readable audio data: it may be
Chris@1010 69 * in a different place or format from the originally specified
Chris@1010 70 * location, for example if the file has been retrieved and
Chris@1010 71 * decoded. In some cases there may be no local file path, and
Chris@1010 72 * this will return "" if there is none.
Chris@1010 73 */
Chris@1010 74 virtual QString getLocalFilename() const { return ""; }
Chris@1010 75
Chris@632 76 typedef std::map<QString, QString> TagMap;
Chris@632 77 virtual TagMap getTags() const { return TagMap(); }
Chris@632 78
Chris@823 79 /**
Chris@823 80 * Return true if this file supports fast seek and random
Chris@823 81 * access. Typically this will be true for uncompressed formats
Chris@823 82 * and false for compressed ones.
Chris@823 83 */
Chris@823 84 virtual bool isQuicklySeekable() const = 0;
Chris@823 85
Chris@148 86 /**
Chris@327 87 * Return interleaved samples for count frames from index start.
Chris@327 88 * The resulting sample block will contain count *
Chris@989 89 * getChannelCount() samples (or fewer if end of file is
Chris@989 90 * reached). The caller does not need to allocate space and any
Chris@989 91 * existing content in the SampleBlock will be erased.
Chris@327 92 *
Chris@148 93 * The subclass implementations of this function must be
Chris@148 94 * thread-safe -- that is, safe to call from multiple threads with
Chris@148 95 * different arguments on the same object at the same time.
Chris@148 96 */
Chris@1041 97 virtual SampleBlock getInterleavedFrames(sv_frame_t start, sv_frame_t count) const = 0;
Chris@175 98
Chris@327 99 /**
Chris@327 100 * Return de-interleaved samples for count frames from index
Chris@327 101 * start. Implemented in this class (it calls
Chris@327 102 * getInterleavedFrames and de-interleaves). The resulting vector
Chris@327 103 * will contain getChannelCount() sample blocks of count samples
Chris@327 104 * each (or fewer if end of file is reached).
Chris@327 105 */
Chris@1041 106 virtual std::vector<SampleBlock> getDeInterleavedFrames(sv_frame_t start, sv_frame_t count) const;
Chris@327 107
Chris@265 108 // only subclasses that do not know exactly how long the audio
Chris@265 109 // file is until it's been completely decoded should implement this
Chris@265 110 virtual int getDecodeCompletion() const { return 100; } // %
Chris@265 111
Chris@176 112 virtual bool isUpdating() const { return false; }
Chris@176 113
Chris@175 114 signals:
Chris@175 115 void frameCountChanged();
Chris@148 116
Chris@148 117 protected:
Chris@1038 118 sv_frame_t m_frameCount;
Chris@929 119 int m_channelCount;
Chris@1040 120 sv_samplerate_t m_sampleRate;
Chris@148 121 };
Chris@148 122
Chris@148 123 #endif