| 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 _WAV_FILE_READER_H_ | 
| Chris@148 | 17 #define _WAV_FILE_READER_H_ | 
| Chris@148 | 18 | 
| Chris@148 | 19 #include "AudioFileReader.h" | 
| Chris@148 | 20 | 
| Chris@148 | 21 #include <sndfile.h> | 
| Chris@148 | 22 #include <QMutex> | 
| Chris@148 | 23 | 
| Chris@157 | 24 #include <set> | 
| Chris@157 | 25 | 
| Chris@823 | 26 /** | 
| Chris@823 | 27  * Reader for audio files using libsndfile. | 
| Chris@823 | 28  * | 
| Chris@823 | 29  * This is typically intended for seekable file types that can be read | 
| Chris@823 | 30  * directly (e.g. WAV, AIFF etc). | 
| Chris@823 | 31  * | 
| Chris@823 | 32  * Compressed files supported by libsndfile (e.g. Ogg, FLAC) should | 
| Chris@823 | 33  * normally be read using DecodingWavFileReader instead (which decodes | 
| Chris@823 | 34  * to an intermediate cached file). | 
| Chris@823 | 35  */ | 
| Chris@148 | 36 class WavFileReader : public AudioFileReader | 
| Chris@148 | 37 { | 
| Chris@148 | 38 public: | 
| Chris@317 | 39     WavFileReader(FileSource source, bool fileUpdating = false); | 
| Chris@148 | 40     virtual ~WavFileReader(); | 
| Chris@148 | 41 | 
| Chris@345 | 42     virtual QString getLocation() const { return m_source.getLocation(); } | 
| Chris@290 | 43     virtual QString getError() const { return m_error; } | 
| Chris@290 | 44 | 
| Chris@1010 | 45     virtual QString getLocalFilename() const { return m_path; } | 
| Chris@1010 | 46 | 
| Chris@823 | 47     virtual bool isQuicklySeekable() const { return m_seekable; } | 
| Chris@823 | 48 | 
| Chris@148 | 49     /** | 
| Chris@148 | 50      * Must be safe to call from multiple threads with different | 
| Chris@148 | 51      * arguments on the same object at the same time. | 
| Chris@148 | 52      */ | 
| Chris@1096 | 53     virtual std::vector<float> getInterleavedFrames(sv_frame_t start, sv_frame_t count) const; | 
| Chris@148 | 54 | 
| Chris@290 | 55     static void getSupportedExtensions(std::set<QString> &extensions); | 
| Chris@316 | 56     static bool supportsExtension(QString ext); | 
| Chris@316 | 57     static bool supportsContentType(QString type); | 
| Chris@317 | 58     static bool supports(FileSource &source); | 
| Chris@157 | 59 | 
| Chris@265 | 60     virtual int getDecodeCompletion() const { return 100; } | 
| Chris@265 | 61 | 
| Chris@176 | 62     bool isUpdating() const { return m_updating; } | 
| Chris@176 | 63 | 
| Chris@175 | 64     void updateFrameCount(); | 
| Chris@176 | 65     void updateDone(); | 
| Chris@175 | 66 | 
| Chris@148 | 67 protected: | 
| Chris@148 | 68     SF_INFO m_fileInfo; | 
| Chris@148 | 69     SNDFILE *m_file; | 
| Chris@148 | 70 | 
| Chris@317 | 71     FileSource m_source; | 
| Chris@290 | 72     QString m_path; | 
| Chris@290 | 73     QString m_error; | 
| Chris@148 | 74 | 
| Chris@823 | 75     bool m_seekable; | 
| Chris@823 | 76 | 
| Chris@148 | 77     mutable QMutex m_mutex; | 
| Chris@1096 | 78     mutable std::vector<float> m_buffer; | 
| Chris@1038 | 79     mutable sv_frame_t m_lastStart; | 
| Chris@1038 | 80     mutable sv_frame_t m_lastCount; | 
| Chris@176 | 81 | 
| Chris@176 | 82     bool m_updating; | 
| Chris@148 | 83 }; | 
| Chris@148 | 84 | 
| Chris@148 | 85 #endif |