Chris@537: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
Chris@537: 
Chris@537: /*
Chris@537:     Sonic Visualiser
Chris@537:     An audio file viewer and annotation editor.
Chris@537:     Centre for Digital Music, Queen Mary, University of London.
Chris@537:     This file copyright 2006-2009 Chris Cannam and QMUL.
Chris@537:     
Chris@537:     This program is free software; you can redistribute it and/or
Chris@537:     modify it under the terms of the GNU General Public License as
Chris@537:     published by the Free Software Foundation; either version 2 of the
Chris@537:     License, or (at your option) any later version.  See the file
Chris@537:     COPYING included with this distribution for more information.
Chris@537: */
Chris@537: 
Chris@537: #ifndef _FFT_FILE_CACHE_WRITER_H_
Chris@537: #define _FFT_FILE_CACHE_WRITER_H_
Chris@537: 
Chris@537: #include "FFTCacheStorageType.h"
Chris@537: #include "FFTCacheWriter.h"
Chris@537: #include "data/fileio/MatrixFile.h"
Chris@537: 
Chris@537: class FFTFileCacheWriter : public FFTCacheWriter
Chris@537: {
Chris@537: public:
Chris@537:     FFTFileCacheWriter(QString fileBase,
Chris@537:                        FFTCache::StorageType storageType,
Chris@929:                        int width, int height);
Chris@537:     ~FFTFileCacheWriter();
Chris@537: 
Chris@929:     int getWidth() const;
Chris@929:     int getHeight() const;
Chris@537: 
Chris@929:     void setColumnAt(int x, float *mags, float *phases, float factor);
Chris@929:     void setColumnAt(int x, float *reals, float *imags);
Chris@537: 
Chris@1038:     static size_t getCacheSize(int width, int height,
Chris@537:                                FFTCache::StorageType type);
Chris@537: 
Chris@929:     bool haveSetColumnAt(int x) const;
Chris@550: 
Chris@537:     void allColumnsWritten();
Chris@537: 
Chris@537:     QString getFileBase() const;
Chris@537:     FFTCache::StorageType getStorageType() const { return m_storageType; }
Chris@537: 
Chris@537: protected:
Chris@537:     char *m_writebuf;
Chris@537: 
Chris@537:     void setNormalizationFactorToWritebuf(float newfactor) {
Chris@929:         int h = m_mfc->getHeight();
Chris@537:         if (h < m_factorSize) return;
Chris@537:         if (m_storageType != FFTCache::Compact) {
Chris@537:             ((float *)m_writebuf)[h - 1] = newfactor;
Chris@537:         } else {
Chris@537:             union {
Chris@537:                 float f;
Chris@537:                 uint16_t u[2];
Chris@537:             } factor;
Chris@537:             factor.f = newfactor;
Chris@537:             ((uint16_t *)m_writebuf)[h - 2] = factor.u[0];
Chris@537:             ((uint16_t *)m_writebuf)[h - 1] = factor.u[1];
Chris@537:         }
Chris@537:     }            
Chris@537: 
Chris@537:     QString m_fileBase;
Chris@537:     FFTCache::StorageType m_storageType;
Chris@929:     int m_factorSize;
Chris@537:     MatrixFile *m_mfc;
Chris@537: };
Chris@537: 
Chris@537: #endif