Chris@152: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
Chris@152: 
Chris@152: /*
Chris@152:     Sonic Visualiser
Chris@152:     An audio file viewer and annotation editor.
Chris@152:     Centre for Digital Music, Queen Mary, University of London.
Chris@152:     This file copyright 2006 Chris Cannam.
Chris@152:     
Chris@152:     This program is free software; you can redistribute it and/or
Chris@152:     modify it under the terms of the GNU General Public License as
Chris@152:     published by the Free Software Foundation; either version 2 of the
Chris@152:     License, or (at your option) any later version.  See the file
Chris@152:     COPYING included with this distribution for more information.
Chris@152: */
Chris@152: 
Chris@152: #ifndef _FFT_MODEL_H_
Chris@152: #define _FFT_MODEL_H_
Chris@152: 
Chris@152: #include "data/fft/FFTDataServer.h"
Chris@152: #include "DenseThreeDimensionalModel.h"
Chris@152: 
Chris@152: class FFTModel : public DenseThreeDimensionalModel
Chris@152: {
Chris@152: public:
Chris@152:     FFTModel(const DenseTimeValueModel *model,
Chris@152:              int channel,
Chris@152:              WindowType windowType,
Chris@152:              size_t windowSize,
Chris@152:              size_t windowIncrement,
Chris@152:              size_t fftSize,
Chris@152:              bool polar,
Chris@152:              size_t fillFromColumn = 0);
Chris@152:     ~FFTModel();
Chris@152: 
Chris@152:     float getMagnitudeAt(size_t x, size_t y) {
Chris@152:         return m_server->getMagnitudeAt(x << m_xshift, y << m_yshift);
Chris@152:     }
Chris@152:     float getNormalizedMagnitudeAt(size_t x, size_t y) {
Chris@152:         return m_server->getNormalizedMagnitudeAt(x << m_xshift, y << m_yshift);
Chris@152:     }
Chris@152:     float getMaximumMagnitudeAt(size_t x) {
Chris@152:         return m_server->getMaximumMagnitudeAt(x << m_xshift);
Chris@152:     }
Chris@152:     float getPhaseAt(size_t x, size_t y) {
Chris@152:         return m_server->getPhaseAt(x << m_xshift, y << m_yshift);
Chris@152:     }
Chris@152:     void getValuesAt(size_t x, size_t y, float &real, float &imaginary) {
Chris@152:         m_server->getValuesAt(x << m_xshift, y << m_yshift, real, imaginary);
Chris@152:     }
Chris@182:     bool isColumnAvailable(size_t x) const {
Chris@152:         return m_server->isColumnReady(x << m_xshift);
Chris@152:     }
Chris@152: 
Chris@152:     size_t getFillExtent() const { return m_server->getFillExtent(); }
Chris@152: 
Chris@152:     // DenseThreeDimensionalModel and Model methods:
Chris@152:     //
Chris@182:     virtual size_t getWidth() const {
Chris@182:         return m_server->getWidth() >> m_xshift;
Chris@182:     }
Chris@182:     virtual size_t getHeight() const {
Chris@182:         return m_server->getHeight() >> m_yshift;
Chris@182:     }
Chris@182:     virtual float getValueAt(size_t x, size_t y) const {
Chris@182:         return const_cast<FFTModel *>(this)->getMagnitudeAt(x, y);
Chris@182:     }
Chris@152:     virtual bool isOK() const {
Chris@152:         return m_server && m_server->getModel();
Chris@152:     }
Chris@152:     virtual size_t getStartFrame() const {
Chris@152:         return 0;
Chris@152:     }
Chris@152:     virtual size_t getEndFrame() const {
Chris@152:         return getWidth() * getResolution() + getResolution();
Chris@152:     }
Chris@152:     virtual size_t getSampleRate() const;
Chris@152:     virtual size_t getResolution() const {
Chris@152:         return m_server->getWindowIncrement() << m_xshift;
Chris@152:     }
Chris@152:     virtual size_t getYBinCount() const {
Chris@152:         return getHeight();
Chris@152:     }
Chris@152:     virtual float getMinimumLevel() const {
Chris@152:         return 0.f; // Can't provide
Chris@152:     }
Chris@152:     virtual float getMaximumLevel() const {
Chris@152:         return 1.f; // Can't provide
Chris@152:     }
Chris@182:     virtual void getColumn(size_t x, Column &result) const;
Chris@152:     virtual QString getBinName(size_t n) const;
Chris@152: 
Chris@152:     virtual int getCompletion() const { return m_server->getFillCompletion(); }
Chris@152: 
Chris@152:     virtual Model *clone() const;
Chris@152: 
Chris@154:     virtual void suspend() { m_server->suspend(); }
Chris@155:     virtual void suspendWrites() { m_server->suspendWrites(); }
Chris@154:     virtual void resume() { m_server->resume(); }
Chris@154: 
Chris@152: private:
Chris@152:     FFTModel(const FFTModel &);
Chris@152:     FFTModel &operator=(const FFTModel &); // not implemented
Chris@152: 
Chris@152:     FFTDataServer *m_server;
Chris@152:     int m_xshift;
Chris@152:     int m_yshift;
Chris@152: };
Chris@152: 
Chris@152: #endif