annotate data/fft/FFTFileCache.h @ 498:fdf5930b7ccc

* Bring FeatureWriter and RDFFeatureWriter into the fold (from Runner) so that we can use them to export features from SV as well
author Chris Cannam
date Fri, 28 Nov 2008 13:47:11 +0000
parents f60360209e5c
children 6066bde1c126
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@202 7 This file copyright 2006 Chris Cannam and QMUL.
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 _FFT_FILE_CACHE_H_
Chris@148 17 #define _FFT_FILE_CACHE_H_
Chris@148 18
Chris@152 19 #include "FFTCache.h"
Chris@150 20 #include "fileio/MatrixFile.h"
Chris@148 21
Chris@148 22 #include <QMutex>
Chris@148 23
Chris@148 24 class FFTFileCache : public FFTCache
Chris@148 25 {
Chris@148 26 public:
Chris@148 27 FFTFileCache(QString fileBase, MatrixFile::Mode mode,
Chris@148 28 StorageType storageType);
Chris@148 29 virtual ~FFTFileCache();
Chris@148 30
Chris@148 31 MatrixFile::Mode getMode() const { return m_mfc->getMode(); }
Chris@148 32
Chris@148 33 virtual size_t getWidth() const;
Chris@148 34 virtual size_t getHeight() const;
Chris@148 35
Chris@148 36 virtual void resize(size_t width, size_t height);
Chris@148 37 virtual void reset(); // zero-fill or 1-fill as appropriate without changing size
Chris@148 38
Chris@148 39 virtual float getMagnitudeAt(size_t x, size_t y) const;
Chris@148 40 virtual float getNormalizedMagnitudeAt(size_t x, size_t y) const;
Chris@148 41 virtual float getMaximumMagnitudeAt(size_t x) const;
Chris@148 42 virtual float getPhaseAt(size_t x, size_t y) const;
Chris@148 43
Chris@148 44 virtual void getValuesAt(size_t x, size_t y, float &real, float &imag) const;
Chris@148 45
Chris@148 46 virtual bool haveSetColumnAt(size_t x) const;
Chris@148 47
Chris@148 48 virtual void setColumnAt(size_t x, float *mags, float *phases, float factor);
Chris@148 49 virtual void setColumnAt(size_t x, float *reals, float *imags);
Chris@148 50
Chris@148 51 virtual void suspend() { m_mfc->suspend(); }
Chris@148 52
Chris@170 53 static size_t getCacheSize(size_t width, size_t height, StorageType type);
Chris@170 54
Chris@408 55 virtual StorageType getStorageType() { return m_storageType; }
Chris@359 56 virtual Type getType() { return FileCache; }
Chris@359 57
Chris@148 58 protected:
Chris@148 59 char *m_writebuf;
Chris@148 60 mutable char *m_readbuf;
Chris@148 61 mutable size_t m_readbufCol;
Chris@148 62 mutable size_t m_readbufWidth;
Chris@148 63
Chris@148 64 float getFromReadBufStandard(size_t x, size_t y) const {
Chris@458 65 m_readbufMutex.lock();
Chris@148 66 if (m_readbuf &&
Chris@148 67 (m_readbufCol == x || (m_readbufWidth > 1 && m_readbufCol+1 == x))) {
Chris@458 68 float v = ((float *)m_readbuf)[(x - m_readbufCol) * m_mfc->getHeight() + y];
Chris@458 69 m_readbufMutex.unlock();
Chris@458 70 return v;
Chris@148 71 } else {
Chris@148 72 populateReadBuf(x);
Chris@458 73 m_readbufMutex.unlock();
Chris@148 74 return getFromReadBufStandard(x, y);
Chris@148 75 }
Chris@148 76 }
Chris@148 77
Chris@148 78 float getFromReadBufCompactUnsigned(size_t x, size_t y) const {
Chris@458 79 m_readbufMutex.lock();
Chris@148 80 if (m_readbuf &&
Chris@148 81 (m_readbufCol == x || (m_readbufWidth > 1 && m_readbufCol+1 == x))) {
Chris@458 82 float v = ((uint16_t *)m_readbuf)[(x - m_readbufCol) * m_mfc->getHeight() + y];
Chris@458 83 m_readbufMutex.unlock();
Chris@458 84 return v;
Chris@148 85 } else {
Chris@148 86 populateReadBuf(x);
Chris@458 87 m_readbufMutex.unlock();
Chris@148 88 return getFromReadBufCompactUnsigned(x, y);
Chris@148 89 }
Chris@148 90 }
Chris@148 91
Chris@148 92 float getFromReadBufCompactSigned(size_t x, size_t y) const {
Chris@458 93 m_readbufMutex.lock();
Chris@148 94 if (m_readbuf &&
Chris@148 95 (m_readbufCol == x || (m_readbufWidth > 1 && m_readbufCol+1 == x))) {
Chris@458 96 float v = ((int16_t *)m_readbuf)[(x - m_readbufCol) * m_mfc->getHeight() + y];
Chris@458 97 m_readbufMutex.unlock();
Chris@458 98 return v;
Chris@148 99 } else {
Chris@148 100 populateReadBuf(x);
Chris@458 101 m_readbufMutex.unlock();
Chris@148 102 return getFromReadBufCompactSigned(x, y);
Chris@148 103 }
Chris@148 104 }
Chris@148 105
Chris@183 106 void populateReadBuf(size_t x) const;
Chris@148 107
Chris@148 108 float getNormalizationFactor(size_t col) const {
Chris@266 109 size_t h = m_mfc->getHeight();
Chris@266 110 if (h < m_factorSize) return 0;
Chris@148 111 if (m_storageType != Compact) {
Chris@266 112 return getFromReadBufStandard(col, h - 1);
Chris@148 113 } else {
Chris@458 114 m_readbufMutex.lock();
Chris@266 115 union {
Chris@266 116 float f;
Chris@266 117 uint16_t u[2];
Chris@266 118 } factor;
Chris@266 119 if (!m_readbuf ||
Chris@266 120 !(m_readbufCol == col ||
Chris@266 121 (m_readbufWidth > 1 && m_readbufCol+1 == col))) {
Chris@266 122 populateReadBuf(col);
Chris@266 123 }
Chris@266 124 size_t ix = (col - m_readbufCol) * m_mfc->getHeight() + h;
Chris@266 125 factor.u[0] = ((uint16_t *)m_readbuf)[ix - 2];
Chris@266 126 factor.u[1] = ((uint16_t *)m_readbuf)[ix - 1];
Chris@458 127 m_readbufMutex.unlock();
Chris@266 128 return factor.f;
Chris@148 129 }
Chris@148 130 }
Chris@148 131
Chris@266 132 void setNormalizationFactorToWritebuf(float newfactor) {
Chris@266 133 size_t h = m_mfc->getHeight();
Chris@266 134 if (h < m_factorSize) return;
Chris@266 135 if (m_storageType != Compact) {
Chris@266 136 ((float *)m_writebuf)[h - 1] = newfactor;
Chris@266 137 } else {
Chris@266 138 union {
Chris@266 139 float f;
Chris@266 140 uint16_t u[2];
Chris@266 141 } factor;
Chris@266 142 factor.f = newfactor;
Chris@266 143 ((uint16_t *)m_writebuf)[h - 2] = factor.u[0];
Chris@266 144 ((uint16_t *)m_writebuf)[h - 1] = factor.u[1];
Chris@266 145 }
Chris@266 146 }
Chris@266 147
Chris@148 148 MatrixFile *m_mfc;
Chris@148 149 QMutex m_writeMutex;
Chris@458 150 mutable QMutex m_readbufMutex;
Chris@148 151 StorageType m_storageType;
Chris@266 152 size_t m_factorSize;
Chris@148 153 };
Chris@148 154
Chris@148 155 #endif