annotate data/fileio/WavFileReader.h @ 1496:fde8c497373f

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