| 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 |