annotate data/fft/FFTFileCacheWriter.h @ 1071:f4ad0bfceeb7

Handle case where plugin erroneously returns sample rate 0 for fixed-rate output
author Chris Cannam
date Thu, 14 May 2015 14:04:41 +0100 (2015-05-14)
parents cc27f35aa75c
children
rev   line source
Chris@537 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@537 2
Chris@537 3 /*
Chris@537 4 Sonic Visualiser
Chris@537 5 An audio file viewer and annotation editor.
Chris@537 6 Centre for Digital Music, Queen Mary, University of London.
Chris@537 7 This file copyright 2006-2009 Chris Cannam and QMUL.
Chris@537 8
Chris@537 9 This program is free software; you can redistribute it and/or
Chris@537 10 modify it under the terms of the GNU General Public License as
Chris@537 11 published by the Free Software Foundation; either version 2 of the
Chris@537 12 License, or (at your option) any later version. See the file
Chris@537 13 COPYING included with this distribution for more information.
Chris@537 14 */
Chris@537 15
Chris@537 16 #ifndef _FFT_FILE_CACHE_WRITER_H_
Chris@537 17 #define _FFT_FILE_CACHE_WRITER_H_
Chris@537 18
Chris@537 19 #include "FFTCacheStorageType.h"
Chris@537 20 #include "FFTCacheWriter.h"
Chris@537 21 #include "data/fileio/MatrixFile.h"
Chris@537 22
Chris@537 23 class FFTFileCacheWriter : public FFTCacheWriter
Chris@537 24 {
Chris@537 25 public:
Chris@537 26 FFTFileCacheWriter(QString fileBase,
Chris@537 27 FFTCache::StorageType storageType,
Chris@929 28 int width, int height);
Chris@537 29 ~FFTFileCacheWriter();
Chris@537 30
Chris@929 31 int getWidth() const;
Chris@929 32 int getHeight() const;
Chris@537 33
Chris@929 34 void setColumnAt(int x, float *mags, float *phases, float factor);
Chris@929 35 void setColumnAt(int x, float *reals, float *imags);
Chris@537 36
Chris@1038 37 static size_t getCacheSize(int width, int height,
Chris@537 38 FFTCache::StorageType type);
Chris@537 39
Chris@929 40 bool haveSetColumnAt(int x) const;
Chris@550 41
Chris@537 42 void allColumnsWritten();
Chris@537 43
Chris@537 44 QString getFileBase() const;
Chris@537 45 FFTCache::StorageType getStorageType() const { return m_storageType; }
Chris@537 46
Chris@537 47 protected:
Chris@537 48 char *m_writebuf;
Chris@537 49
Chris@537 50 void setNormalizationFactorToWritebuf(float newfactor) {
Chris@929 51 int h = m_mfc->getHeight();
Chris@537 52 if (h < m_factorSize) return;
Chris@537 53 if (m_storageType != FFTCache::Compact) {
Chris@537 54 ((float *)m_writebuf)[h - 1] = newfactor;
Chris@537 55 } else {
Chris@537 56 union {
Chris@537 57 float f;
Chris@537 58 uint16_t u[2];
Chris@537 59 } factor;
Chris@537 60 factor.f = newfactor;
Chris@537 61 ((uint16_t *)m_writebuf)[h - 2] = factor.u[0];
Chris@537 62 ((uint16_t *)m_writebuf)[h - 1] = factor.u[1];
Chris@537 63 }
Chris@537 64 }
Chris@537 65
Chris@537 66 QString m_fileBase;
Chris@537 67 FFTCache::StorageType m_storageType;
Chris@929 68 int m_factorSize;
Chris@537 69 MatrixFile *m_mfc;
Chris@537 70 };
Chris@537 71
Chris@537 72 #endif