annotate data/fft/FFTFileCacheWriter.h @ 555:8accc7969c1c

* Some steps to avoid backward seeks in MatrixFile in common use cases
author Chris Cannam
date Mon, 09 Feb 2009 11:38:08 +0000
parents 107d3f3705c9
children 59e7fe1b1003
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@537 28 size_t width, size_t height);
Chris@537 29 ~FFTFileCacheWriter();
Chris@537 30
Chris@537 31 size_t getWidth() const;
Chris@537 32 size_t getHeight() const;
Chris@537 33
Chris@537 34 void setColumnAt(size_t x, float *mags, float *phases, float factor);
Chris@537 35 void setColumnAt(size_t x, float *reals, float *imags);
Chris@537 36
Chris@537 37 static size_t getCacheSize(size_t width, size_t height,
Chris@537 38 FFTCache::StorageType type);
Chris@537 39
Chris@550 40 bool haveSetColumnAt(size_t 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@537 51 size_t 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@537 68 size_t m_factorSize;
Chris@537 69 MatrixFile *m_mfc;
Chris@537 70 };
Chris@537 71
Chris@537 72 #endif