annotate data/fileio/WavFileReader.h @ 1520:954d0cf29ca7 import-audio-data

Switch the normalisation option in WritableWaveFileModel from normalising on read to normalising on write, so that the saved file is already normalised and therefore can be read again without having to remember to normalise it
author Chris Cannam
date Wed, 12 Sep 2018 13:56:56 +0100
parents 75d92155fa20
children c01cbe41aeb5 f8e3dcbafb4d
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@1520 44 enum class Normalisation { None, Peak };
Chris@1520 45
Chris@1513 46 WavFileReader(FileSource source,
Chris@1513 47 bool fileUpdating = false,
Chris@1520 48 Normalisation normalise = Normalisation::None);
Chris@148 49 virtual ~WavFileReader();
Chris@148 50
Chris@345 51 virtual QString getLocation() const { return m_source.getLocation(); }
Chris@290 52 virtual QString getError() const { return m_error; }
Chris@290 53
Chris@1010 54 virtual QString getLocalFilename() const { return m_path; }
Chris@1010 55
Chris@823 56 virtual bool isQuicklySeekable() const { return m_seekable; }
Chris@823 57
Chris@148 58 /**
Chris@148 59 * Must be safe to call from multiple threads with different
Chris@148 60 * arguments on the same object at the same time.
Chris@148 61 */
Chris@1513 62 virtual floatvec_t getInterleavedFrames(sv_frame_t start, sv_frame_t count)
Chris@1513 63 const;
Chris@148 64
Chris@290 65 static void getSupportedExtensions(std::set<QString> &extensions);
Chris@316 66 static bool supportsExtension(QString ext);
Chris@316 67 static bool supportsContentType(QString type);
Chris@317 68 static bool supports(FileSource &source);
Chris@157 69
Chris@265 70 virtual int getDecodeCompletion() const { return 100; }
Chris@265 71
Chris@176 72 bool isUpdating() const { return m_updating; }
Chris@176 73
Chris@175 74 void updateFrameCount();
Chris@176 75 void updateDone();
Chris@175 76
Chris@148 77 protected:
Chris@148 78 SF_INFO m_fileInfo;
Chris@1349 79 SNDFILE *m_file;
Chris@148 80
Chris@317 81 FileSource m_source;
Chris@290 82 QString m_path;
Chris@290 83 QString m_error;
Chris@148 84
Chris@823 85 bool m_seekable;
Chris@823 86
Chris@148 87 mutable QMutex m_mutex;
Chris@1326 88 mutable floatvec_t m_buffer;
Chris@1038 89 mutable sv_frame_t m_lastStart;
Chris@1038 90 mutable sv_frame_t m_lastCount;
Chris@176 91
Chris@1520 92 Normalisation m_normalisation;
Chris@1513 93 float m_max;
Chris@1513 94
Chris@176 95 bool m_updating;
Chris@1513 96
Chris@1513 97 floatvec_t getInterleavedFramesUnnormalised(sv_frame_t start,
Chris@1513 98 sv_frame_t count) const;
Chris@1513 99 float getMax() const;
Chris@148 100 };
Chris@148 101
Chris@148 102 #endif