annotate layer/SpectrumLayer.h @ 607:5b72899d692b

Give a dedicated key to toggling the centre line, and move it out of the overlay level setting -- reducing number of overlay levels to 3. Introduce two distinct vertical scale types (so that we can hide the spectrogram colour scale part easily)
author Chris Cannam
date Mon, 30 Jan 2012 16:01:59 +0000
parents 369a197737c7
children 1d526ba11a24
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@607 96 virtual int getVerticalScaleWidth(View *, bool, QPainter &) const { return 0; }
Chris@607 97
Chris@316 98 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 99 QString extraAttributes = "") const;
Chris@153 100
Chris@153 101 protected slots:
Chris@153 102 void preferenceChanged(PropertyContainer::PropertyName name);
Chris@133 103
Chris@133 104 protected:
Chris@193 105 // make this SliceLayer method unavailable to the general public
Chris@193 106 // virtual void setModel(DenseThreeDimensionalModel *model) {
Chris@193 107 // SliceLayer::setModel(model);
Chris@193 108 // }
Chris@193 109
Chris@193 110 DenseTimeValueModel *m_originModel;
Chris@153 111 int m_channel;
Chris@153 112 bool m_channelSet;
Chris@153 113 size_t m_windowSize;
Chris@153 114 WindowType m_windowType;
Chris@153 115 size_t m_windowHopLevel;
Chris@284 116 bool m_showPeaks;
Chris@275 117 mutable bool m_newFFTNeeded;
Chris@153 118
Chris@349 119 mutable QMutex m_fftMutex;
Chris@349 120
Chris@193 121 void setupFFT();
Chris@153 122
Chris@254 123 virtual void getBiasCurve(BiasCurve &) const;
Chris@254 124 BiasCurve m_biasCurve;
Chris@254 125
Chris@265 126 virtual float getXForBin(int bin, int totalBins, float w) const;
Chris@265 127 virtual int getBinForX(float x, int totalBins, float w) const;
Chris@265 128
Chris@254 129 float getFrequencyForX(float x, float w) const;
Chris@254 130 float getXForFrequency(float freq, float w) const;
Chris@254 131
Chris@153 132 size_t getWindowIncrement() const {
Chris@153 133 if (m_windowHopLevel == 0) return m_windowSize;
Chris@153 134 else if (m_windowHopLevel == 1) return (m_windowSize * 3) / 4;
Chris@153 135 else return m_windowSize / (1 << (m_windowHopLevel - 1));
Chris@153 136 }
Chris@133 137 };
Chris@133 138
Chris@133 139 #endif