annotate data/fileio/AudioFileReader.h @ 1008:d9e0e59a1581

When using an aggregate model to pass data to a transform, zero-pad the shorter input to the duration of the longer rather than truncating the longer. (This is better behaviour for e.g. MATCH, and in any case the code was previously truncating incorrectly and ending up with garbage data at the end.)
author Chris Cannam
date Fri, 14 Nov 2014 13:51:33 +0000
parents c9d456b1fcde
children 36f79bc5c3d7
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@929 39 int getFrameCount() const { return m_frameCount; }
Chris@929 40 int getChannelCount() const { return m_channelCount; }
Chris@929 41 int getSampleRate() const { return m_sampleRate; }
Chris@660 42
Chris@929 43 virtual int 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@989 78 * getChannelCount() samples (or fewer if end of file is
Chris@989 79 * reached). The caller does not need to allocate space and any
Chris@989 80 * existing content in the SampleBlock will be erased.
Chris@327 81 *
Chris@148 82 * The subclass implementations of this function must be
Chris@148 83 * thread-safe -- that is, safe to call from multiple threads with
Chris@148 84 * different arguments on the same object at the same time.
Chris@148 85 */
Chris@929 86 virtual void getInterleavedFrames(int start, int count,
Chris@148 87 SampleBlock &frames) const = 0;
Chris@175 88
Chris@327 89 /**
Chris@327 90 * Return de-interleaved samples for count frames from index
Chris@327 91 * start. Implemented in this class (it calls
Chris@327 92 * getInterleavedFrames and de-interleaves). The resulting vector
Chris@327 93 * will contain getChannelCount() sample blocks of count samples
Chris@327 94 * each (or fewer if end of file is reached).
Chris@327 95 */
Chris@929 96 virtual void getDeInterleavedFrames(int start, int count,
Chris@327 97 std::vector<SampleBlock> &frames) const;
Chris@327 98
Chris@265 99 // only subclasses that do not know exactly how long the audio
Chris@265 100 // file is until it's been completely decoded should implement this
Chris@265 101 virtual int getDecodeCompletion() const { return 100; } // %
Chris@265 102
Chris@176 103 virtual bool isUpdating() const { return false; }
Chris@176 104
Chris@175 105 signals:
Chris@175 106 void frameCountChanged();
Chris@148 107
Chris@148 108 protected:
Chris@929 109 int m_frameCount;
Chris@929 110 int m_channelCount;
Chris@929 111 int m_sampleRate;
Chris@148 112 };
Chris@148 113
Chris@148 114 #endif