annotate data/fileio/AudioFileReader.h @ 1310:aa1b1fc2d018 mp3-gapless

Stop reporting sync errors only when we really are at eof, i.e. after the input callback has been called again (previously we just tested whether we'd buffered up all the input, which of course we do in one go at the start)
author Chris Cannam
date Tue, 29 Nov 2016 16:45:29 +0000
parents 4d9816ba0ebe
children ff9697592bef
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@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@1038 38 sv_frame_t getFrameCount() const { return m_frameCount; }
Chris@929 39 int getChannelCount() const { return m_channelCount; }
Chris@1040 40 sv_samplerate_t getSampleRate() const { return m_sampleRate; }
Chris@660 41
Chris@1040 42 virtual sv_samplerate_t getNativeRate() const { return m_sampleRate; } // if resampled
Chris@345 43
Chris@345 44 /**
Chris@345 45 * Return the location of the audio data in the reader (as passed
Chris@345 46 * in to the FileSource constructor, for example).
Chris@345 47 */
Chris@345 48 virtual QString getLocation() const { return ""; }
Chris@148 49
Chris@271 50 /**
Chris@271 51 * Return the title of the work in the audio file, if known. This
Chris@271 52 * may be implemented by subclasses that support file tagging.
Chris@271 53 * This is not the same thing as the file name.
Chris@271 54 */
Chris@290 55 virtual QString getTitle() const { return ""; }
Chris@271 56
Chris@333 57 /**
Chris@333 58 * Return the "maker" of the work in the audio file, if known.
Chris@333 59 * This could represent almost anything (band, composer,
Chris@333 60 * conductor, artist etc).
Chris@333 61 */
Chris@333 62 virtual QString getMaker() const { return ""; }
Chris@333 63
Chris@1010 64 /**
Chris@1010 65 * Return the local file path of the audio data. This is the
Chris@1010 66 * location most likely to contain readable audio data: it may be
Chris@1010 67 * in a different place or format from the originally specified
Chris@1010 68 * location, for example if the file has been retrieved and
Chris@1010 69 * decoded. In some cases there may be no local file path, and
Chris@1010 70 * this will return "" if there is none.
Chris@1010 71 */
Chris@1010 72 virtual QString getLocalFilename() const { return ""; }
Chris@1010 73
Chris@632 74 typedef std::map<QString, QString> TagMap;
Chris@632 75 virtual TagMap getTags() const { return TagMap(); }
Chris@632 76
Chris@823 77 /**
Chris@823 78 * Return true if this file supports fast seek and random
Chris@823 79 * access. Typically this will be true for uncompressed formats
Chris@823 80 * and false for compressed ones.
Chris@823 81 */
Chris@823 82 virtual bool isQuicklySeekable() const = 0;
Chris@823 83
Chris@148 84 /**
Chris@327 85 * Return interleaved samples for count frames from index start.
Chris@1096 86 * The resulting vector will contain count * getChannelCount()
Chris@1096 87 * samples (or fewer if end of file is reached).
Chris@327 88 *
Chris@148 89 * The subclass implementations of this function must be
Chris@148 90 * thread-safe -- that is, safe to call from multiple threads with
Chris@148 91 * different arguments on the same object at the same time.
Chris@148 92 */
Chris@1096 93 virtual std::vector<float> getInterleavedFrames(sv_frame_t start, sv_frame_t count) const = 0;
Chris@175 94
Chris@327 95 /**
Chris@327 96 * Return de-interleaved samples for count frames from index
Chris@327 97 * start. Implemented in this class (it calls
Chris@327 98 * getInterleavedFrames and de-interleaves). The resulting vector
Chris@327 99 * will contain getChannelCount() sample blocks of count samples
Chris@327 100 * each (or fewer if end of file is reached).
Chris@327 101 */
Chris@1096 102 virtual std::vector<std::vector<float> > getDeInterleavedFrames(sv_frame_t start, sv_frame_t count) const;
Chris@327 103
Chris@265 104 // only subclasses that do not know exactly how long the audio
Chris@265 105 // file is until it's been completely decoded should implement this
Chris@265 106 virtual int getDecodeCompletion() const { return 100; } // %
Chris@265 107
Chris@176 108 virtual bool isUpdating() const { return false; }
Chris@176 109
Chris@175 110 signals:
Chris@175 111 void frameCountChanged();
Chris@148 112
Chris@148 113 protected:
Chris@1038 114 sv_frame_t m_frameCount;
Chris@929 115 int m_channelCount;
Chris@1040 116 sv_samplerate_t m_sampleRate;
Chris@148 117 };
Chris@148 118
Chris@148 119 #endif