annotate data/fileio/AudioFileReader.h @ 823:f0558e69a074

Rename Resampling- to DecodingWavFileReader, and use it whenever we have an audio file that is not quickly seekable using libsndfile. Avoids very slow performance when analysing ogg files.
author Chris Cannam
date Wed, 17 Jul 2013 15:40:01 +0100
parents 5db8181ea521
children 59e7fe1b1003
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@823 68 /**
Chris@823 69 * Return true if this file supports fast seek and random
Chris@823 70 * access. Typically this will be true for uncompressed formats
Chris@823 71 * and false for compressed ones.
Chris@823 72 */
Chris@823 73 virtual bool isQuicklySeekable() const = 0;
Chris@823 74
Chris@148 75 /**
Chris@327 76 * Return interleaved samples for count frames from index start.
Chris@327 77 * The resulting sample block will contain count *
Chris@327 78 * getChannelCount() samples (or fewer if end of file is reached).
Chris@327 79 *
Chris@148 80 * The subclass implementations of this function must be
Chris@148 81 * thread-safe -- that is, safe to call from multiple threads with
Chris@148 82 * different arguments on the same object at the same time.
Chris@148 83 */
Chris@148 84 virtual void getInterleavedFrames(size_t start, size_t count,
Chris@148 85 SampleBlock &frames) const = 0;
Chris@175 86
Chris@327 87 /**
Chris@327 88 * Return de-interleaved samples for count frames from index
Chris@327 89 * start. Implemented in this class (it calls
Chris@327 90 * getInterleavedFrames and de-interleaves). The resulting vector
Chris@327 91 * will contain getChannelCount() sample blocks of count samples
Chris@327 92 * each (or fewer if end of file is reached).
Chris@327 93 */
Chris@327 94 virtual void getDeInterleavedFrames(size_t start, size_t count,
Chris@327 95 std::vector<SampleBlock> &frames) const;
Chris@327 96
Chris@265 97 // only subclasses that do not know exactly how long the audio
Chris@265 98 // file is until it's been completely decoded should implement this
Chris@265 99 virtual int getDecodeCompletion() const { return 100; } // %
Chris@265 100
Chris@176 101 virtual bool isUpdating() const { return false; }
Chris@176 102
Chris@175 103 signals:
Chris@175 104 void frameCountChanged();
Chris@148 105
Chris@148 106 protected:
Chris@148 107 size_t m_frameCount;
Chris@148 108 size_t m_channelCount;
Chris@148 109 size_t m_sampleRate;
Chris@148 110 };
Chris@148 111
Chris@148 112 #endif