annotate data/fileio/WavFileReader.h @ 1078:ce82bcdc95d0

Fail upfront if the file is going to be too large. We expect the caller to split up large data sets into several MatrixFiles
author Chris Cannam
date Wed, 10 Jun 2015 13:10:26 +0100
parents 843f67be0ed9
children 4d9816ba0ebe
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 _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@1041 53 virtual SampleBlock 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@1041 78 mutable SampleBlock m_buffer;
Chris@1038 79 mutable sv_frame_t m_bufsiz;
Chris@1038 80 mutable sv_frame_t m_lastStart;
Chris@1038 81 mutable sv_frame_t m_lastCount;
Chris@176 82
Chris@176 83 bool m_updating;
Chris@148 84 };
Chris@148 85
Chris@148 86 #endif