annotate data/fileio/CodedAudioFileReader.h @ 1288:5ef9b4d4bbdb 3.0-integration

Filter out Xing/LAME info frames, rather than letting them go to the mp3 decoder as if they were audio frames. Fixes the 1152-sample zero pad at start of some decoded mp3 files (distinct from decoder delay). The logic here is based on the madplay code.
author Chris Cannam
date Thu, 24 Nov 2016 13:32:04 +0000
parents 40c042780bc9
children 9f9f55a8af92
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 _CODED_AUDIO_FILE_READER_H_
Chris@148 17 #define _CODED_AUDIO_FILE_READER_H_
Chris@148 18
Chris@148 19 #include "AudioFileReader.h"
Chris@148 20
Chris@148 21 #include <sndfile.h>
Chris@263 22 #include <QMutex>
Chris@543 23 #include <QReadWriteLock>
Chris@148 24
Chris@148 25 class WavFileReader;
Chris@297 26 class Serialiser;
Chris@297 27 class Resampler;
Chris@148 28
Chris@148 29 class CodedAudioFileReader : public AudioFileReader
Chris@148 30 {
Chris@357 31 Q_OBJECT
Chris@357 32
Chris@148 33 public:
Chris@148 34 virtual ~CodedAudioFileReader();
Chris@148 35
Chris@148 36 enum CacheMode {
Chris@148 37 CacheInTemporaryFile,
Chris@148 38 CacheInMemory
Chris@148 39 };
Chris@148 40
Chris@1097 41 enum DecodeMode {
Chris@1097 42 DecodeAtOnce, // decode the file on construction, with progress
Chris@1097 43 DecodeThreaded // decode in a background thread after construction
Chris@1097 44 };
Chris@1097 45
Chris@1096 46 virtual std::vector<float> getInterleavedFrames(sv_frame_t start, sv_frame_t count) const;
Chris@148 47
Chris@1040 48 virtual sv_samplerate_t getNativeRate() const { return m_fileRate; }
Chris@297 49
Chris@1010 50 virtual QString getLocalFilename() const { return m_cacheFileName; }
Chris@1010 51
Chris@823 52 /// Intermediate cache means all CodedAudioFileReaders are quickly seekable
Chris@823 53 virtual bool isQuicklySeekable() const { return true; }
Chris@823 54
Chris@357 55 signals:
Chris@357 56 void progress(int);
Chris@357 57
Chris@148 58 protected:
Chris@933 59 CodedAudioFileReader(CacheMode cacheMode,
Chris@1040 60 sv_samplerate_t targetRate,
Chris@920 61 bool normalised);
Chris@148 62
Chris@148 63 void initialiseDecodeCache(); // samplerate, channels must have been set
Chris@544 64
Chris@544 65 // may throw InsufficientDiscSpace:
Chris@1038 66 void addSamplesToDecodeCache(float **samples, sv_frame_t nframes);
Chris@1038 67 void addSamplesToDecodeCache(float *samplesInterleaved, sv_frame_t nframes);
Chris@1096 68 void addSamplesToDecodeCache(const std::vector<float> &interleaved);
Chris@544 69
Chris@544 70 // may throw InsufficientDiscSpace:
Chris@148 71 void finishDecodeCache();
Chris@544 72
Chris@148 73 bool isDecodeCacheInitialised() const { return m_initialised; }
Chris@148 74
Chris@297 75 void startSerialised(QString id);
Chris@297 76 void endSerialised();
Chris@297 77
Chris@297 78 private:
Chris@1038 79 void pushBuffer(float *interleaved, sv_frame_t sz, bool final);
Chris@1038 80 void pushBufferResampling(float *interleaved, sv_frame_t sz, double ratio, bool final);
Chris@1038 81 void pushBufferNonResampling(float *interleaved, sv_frame_t sz);
Chris@297 82
Chris@297 83 protected:
Chris@263 84 QMutex m_cacheMutex;
Chris@148 85 CacheMode m_cacheMode;
Chris@1096 86 std::vector<float> m_data;
Chris@1100 87 mutable QMutex m_dataLock;
Chris@148 88 bool m_initialised;
Chris@297 89 Serialiser *m_serialiser;
Chris@1040 90 sv_samplerate_t m_fileRate;
Chris@148 91
Chris@290 92 QString m_cacheFileName;
Chris@148 93 SNDFILE *m_cacheFileWritePtr;
Chris@148 94 WavFileReader *m_cacheFileReader;
Chris@148 95 float *m_cacheWriteBuffer;
Chris@1038 96 sv_frame_t m_cacheWriteBufferIndex;
Chris@1038 97 sv_frame_t m_cacheWriteBufferSize; // frames
Chris@297 98
Chris@297 99 Resampler *m_resampler;
Chris@297 100 float *m_resampleBuffer;
Chris@1038 101 sv_frame_t m_fileFrameCount;
Chris@920 102
Chris@920 103 bool m_normalised;
Chris@920 104 float m_max;
Chris@920 105 float m_gain;
Chris@1285 106
Chris@1285 107 sv_frame_t m_clippedCount;
Chris@1285 108 sv_frame_t m_firstNonzero;
Chris@1286 109 sv_frame_t m_lastNonzero;
Chris@148 110 };
Chris@148 111
Chris@148 112 #endif