annotate data/fileio/WavFileReader.h @ 823:f0558e69a074

Rename Resampling- to DecodingWavFileReader, and use it whenever we have an audio file that is not quickly seekable using libsndfile. Avoids very slow performance when analysing ogg files.
author Chris Cannam
date Wed, 17 Jul 2013 15:40:01 +0100
parents 700cd3350391
children 59e7fe1b1003
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@823 45 virtual bool isQuicklySeekable() const { return m_seekable; }
Chris@823 46
Chris@148 47 /**
Chris@148 48 * Must be safe to call from multiple threads with different
Chris@148 49 * arguments on the same object at the same time.
Chris@148 50 */
Chris@148 51 virtual void getInterleavedFrames(size_t start, size_t count,
Chris@148 52 SampleBlock &frames) const;
Chris@148 53
Chris@290 54 static void getSupportedExtensions(std::set<QString> &extensions);
Chris@316 55 static bool supportsExtension(QString ext);
Chris@316 56 static bool supportsContentType(QString type);
Chris@317 57 static bool supports(FileSource &source);
Chris@157 58
Chris@265 59 virtual int getDecodeCompletion() const { return 100; }
Chris@265 60
Chris@176 61 bool isUpdating() const { return m_updating; }
Chris@176 62
Chris@175 63 void updateFrameCount();
Chris@176 64 void updateDone();
Chris@175 65
Chris@148 66 protected:
Chris@148 67 SF_INFO m_fileInfo;
Chris@148 68 SNDFILE *m_file;
Chris@148 69
Chris@317 70 FileSource m_source;
Chris@290 71 QString m_path;
Chris@290 72 QString m_error;
Chris@148 73
Chris@823 74 bool m_seekable;
Chris@823 75
Chris@148 76 mutable QMutex m_mutex;
Chris@148 77 mutable float *m_buffer;
Chris@148 78 mutable size_t m_bufsiz;
Chris@148 79 mutable size_t m_lastStart;
Chris@148 80 mutable size_t m_lastCount;
Chris@176 81
Chris@176 82 bool m_updating;
Chris@148 83 };
Chris@148 84
Chris@148 85 #endif