annotate layer/SpectrumLayer.h @ 590:241929c5d57c sonification

Check the scale width in the View (which has access to it); ask the layer to do something when the user clicks in the scale regardless of the edit mode, and continue with normal processing if the layer has nothing interesting to do
author Chris Cannam
date Fri, 24 Jun 2011 14:27:32 +0100
parents 369a197737c7
children a13aa5320221 5b72899d692b
rev   line source
Chris@133 1
Chris@133 2 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@133 3
Chris@133 4 /*
Chris@133 5 Sonic Visualiser
Chris@133 6 An audio file viewer and annotation editor.
Chris@133 7 Centre for Digital Music, Queen Mary, University of London.
Chris@182 8 This file copyright 2006 QMUL.
Chris@133 9
Chris@133 10 This program is free software; you can redistribute it and/or
Chris@133 11 modify it under the terms of the GNU General Public License as
Chris@133 12 published by the Free Software Foundation; either version 2 of the
Chris@133 13 License, or (at your option) any later version. See the file
Chris@133 14 COPYING included with this distribution for more information.
Chris@133 15 */
Chris@133 16
Chris@133 17 #ifndef _SPECTRUM_LAYER_H_
Chris@133 18 #define _SPECTRUM_LAYER_H_
Chris@133 19
Chris@193 20 #include "SliceLayer.h"
Chris@133 21
Chris@153 22 #include "base/Window.h"
Chris@153 23
Chris@133 24 #include "data/model/DenseTimeValueModel.h"
Chris@133 25
Chris@133 26 #include <QColor>
Chris@349 27 #include <QMutex>
Chris@133 28
Chris@133 29 class FFTModel;
Chris@133 30
Chris@193 31 class SpectrumLayer : public SliceLayer
Chris@133 32 {
Chris@133 33 Q_OBJECT
Chris@133 34
Chris@133 35 public:
Chris@133 36 SpectrumLayer();
Chris@133 37 ~SpectrumLayer();
Chris@133 38
Chris@133 39 void setModel(DenseTimeValueModel *model);
Chris@193 40 virtual const Model *getModel() const { return m_originModel; }
Chris@133 41
Chris@254 42 virtual bool getCrosshairExtents(View *, QPainter &, QPoint cursorPos,
Chris@254 43 std::vector<QRect> &extents) const;
Chris@254 44 virtual void paintCrosshairs(View *, QPainter &, QPoint) const;
Chris@254 45
Chris@199 46 virtual QString getFeatureDescription(View *v, QPoint &) const;
Chris@199 47
Chris@275 48 virtual void paint(View *v, QPainter &paint, QRect rect) const;
Chris@275 49
Chris@277 50 virtual VerticalPosition getPreferredFrameCountPosition() const {
Chris@277 51 return PositionTop;
Chris@277 52 }
Chris@277 53
Chris@153 54 virtual PropertyList getProperties() const;
Chris@153 55 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@335 56 virtual QString getPropertyIconName(const PropertyName &) const;
Chris@153 57 virtual PropertyType getPropertyType(const PropertyName &) const;
Chris@153 58 virtual QString getPropertyGroupName(const PropertyName &) const;
Chris@153 59 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@216 60 int *min, int *max, int *deflt) const;
Chris@153 61 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@153 62 int value) const;
Chris@167 63 virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const;
Chris@153 64 virtual void setProperty(const PropertyName &, int value);
Chris@133 65 virtual void setProperties(const QXmlAttributes &);
Chris@133 66
Chris@133 67 virtual bool getValueExtents(float &min, float &max,
Chris@133 68 bool &logarithmic, QString &unit) const;
Chris@133 69
Chris@267 70 virtual bool getXScaleValue(const View *v, int x,
Chris@260 71 float &value, QString &unit) const;
Chris@260 72
Chris@274 73 virtual bool getYScaleValue(const View *, int y,
Chris@274 74 float &value, QString &unit) const;
Chris@274 75
Chris@274 76 virtual bool getYScaleDifference(const View *, int y0, int y1,
Chris@274 77 float &diff, QString &unit) const;
Chris@274 78
Chris@248 79 virtual bool isLayerScrollable(const View *) const { return false; }
Chris@133 80
Chris@153 81 void setChannel(int);
Chris@153 82 int getChannel() const { return m_channel; }
Chris@153 83
Chris@153 84 void setWindowSize(size_t);
Chris@153 85 size_t getWindowSize() const { return m_windowSize; }
Chris@153 86
Chris@153 87 void setWindowHopLevel(size_t level);
Chris@153 88 size_t getWindowHopLevel() const { return m_windowHopLevel; }
Chris@153 89
Chris@153 90 void setWindowType(WindowType type);
Chris@153 91 WindowType getWindowType() const { return m_windowType; }
Chris@153 92
Chris@284 93 void setShowPeaks(bool);
Chris@284 94 bool getShowPeaks() const { return m_showPeaks; }
Chris@284 95
Chris@316 96 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 97 QString extraAttributes = "") const;
Chris@153 98
Chris@153 99 protected slots:
Chris@153 100 void preferenceChanged(PropertyContainer::PropertyName name);
Chris@133 101
Chris@133 102 protected:
Chris@193 103 // make this SliceLayer method unavailable to the general public
Chris@193 104 // virtual void setModel(DenseThreeDimensionalModel *model) {
Chris@193 105 // SliceLayer::setModel(model);
Chris@193 106 // }
Chris@193 107
Chris@193 108 DenseTimeValueModel *m_originModel;
Chris@153 109 int m_channel;
Chris@153 110 bool m_channelSet;
Chris@153 111 size_t m_windowSize;
Chris@153 112 WindowType m_windowType;
Chris@153 113 size_t m_windowHopLevel;
Chris@284 114 bool m_showPeaks;
Chris@275 115 mutable bool m_newFFTNeeded;
Chris@153 116
Chris@349 117 mutable QMutex m_fftMutex;
Chris@349 118
Chris@193 119 void setupFFT();
Chris@153 120
Chris@254 121 virtual void getBiasCurve(BiasCurve &) const;
Chris@254 122 BiasCurve m_biasCurve;
Chris@254 123
Chris@265 124 virtual float getXForBin(int bin, int totalBins, float w) const;
Chris@265 125 virtual int getBinForX(float x, int totalBins, float w) const;
Chris@265 126
Chris@254 127 float getFrequencyForX(float x, float w) const;
Chris@254 128 float getXForFrequency(float freq, float w) const;
Chris@254 129
Chris@153 130 size_t getWindowIncrement() const {
Chris@153 131 if (m_windowHopLevel == 0) return m_windowSize;
Chris@153 132 else if (m_windowHopLevel == 1) return (m_windowSize * 3) / 4;
Chris@153 133 else return m_windowSize / (1 << (m_windowHopLevel - 1));
Chris@153 134 }
Chris@133 135 };
Chris@133 136
Chris@133 137 #endif