annotate layer/WaveformLayer.h @ 162:f32212631b9c

* Handle generator transforms (plugins whose channel count isn't dependent on number of audio inputs, as they have none) * Be less keen to suspend writing FFT data in spectrogram repaint -- only do it if we find we actually need to query the FFT data (i.e. we aren't repainting an area that hasn't been generated at all yet)
author Chris Cannam
date Tue, 10 Oct 2006 19:04:57 +0000
parents b32282fefccd
children 53b9c7656798
rev   line source
Chris@58 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@59 4 Sonic Visualiser
Chris@59 5 An audio file viewer and annotation editor.
Chris@59 6 Centre for Digital Music, Queen Mary, University of London.
Chris@59 7 This file copyright 2006 Chris Cannam.
Chris@0 8
Chris@59 9 This program is free software; you can redistribute it and/or
Chris@59 10 modify it under the terms of the GNU General Public License as
Chris@59 11 published by the Free Software Foundation; either version 2 of the
Chris@59 12 License, or (at your option) any later version. See the file
Chris@59 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@30 16 #ifndef _WAVEFORM_LAYER_H_
Chris@30 17 #define _WAVEFORM_LAYER_H_
Chris@0 18
Chris@0 19 #include <QRect>
Chris@0 20 #include <QColor>
Chris@0 21
Chris@128 22 #include "Layer.h"
Chris@0 23
Chris@128 24 #include "data/model/RangeSummarisableTimeValueModel.h"
Chris@0 25
Chris@0 26 class View;
Chris@0 27 class QPainter;
Chris@0 28 class QPixmap;
Chris@0 29
Chris@0 30 class WaveformLayer : public Layer
Chris@0 31 {
Chris@0 32 Q_OBJECT
Chris@0 33
Chris@0 34 public:
Chris@44 35 WaveformLayer();
Chris@0 36 ~WaveformLayer();
Chris@0 37
Chris@156 38 virtual const ZoomConstraint *getZoomConstraint() const {
Chris@156 39 return m_model ? m_model->getZoomConstraint() : 0;
Chris@156 40 }
Chris@0 41 virtual const Model *getModel() const { return m_model; }
Chris@44 42 virtual void paint(View *v, QPainter &paint, QRect rect) const;
Chris@0 43
Chris@44 44 virtual QString getFeatureDescription(View *v, QPoint &) const;
Chris@25 45
Chris@44 46 virtual int getVerticalScaleWidth(View *v, QPainter &) const;
Chris@44 47 virtual void paintVerticalScale(View *v, QPainter &paint, QRect rect) const;
Chris@0 48
Chris@0 49 void setModel(const RangeSummarisableTimeValueModel *model);
Chris@0 50
Chris@0 51 virtual PropertyList getProperties() const;
Chris@87 52 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@0 53 virtual PropertyType getPropertyType(const PropertyName &) const;
Chris@0 54 virtual QString getPropertyGroupName(const PropertyName &) const;
Chris@0 55 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@0 56 int *min, int *max) const;
Chris@0 57 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@0 58 int value) const;
Chris@0 59 virtual void setProperty(const PropertyName &, int value);
Chris@0 60
Chris@0 61 /**
Chris@0 62 * Set the gain multiplier for sample values in this view.
Chris@0 63 *
Chris@0 64 * The default is 1.0.
Chris@0 65 */
Chris@0 66 void setGain(float gain);
Chris@0 67 float getGain() const { return m_gain; }
Chris@0 68
Chris@0 69 /**
Chris@67 70 * Toggle automatic normalization of the currently visible waveform.
Chris@67 71 */
Chris@67 72 void setAutoNormalize(bool);
Chris@67 73 bool getAutoNormalize() const { return m_autoNormalize; }
Chris@67 74
Chris@67 75 /**
Chris@0 76 * Set the basic display colour for waveforms.
Chris@0 77 *
Chris@0 78 * The default is black.
Chris@0 79 *!!! NB should default to white if the associated View !hasLightBackground()
Chris@0 80 */
Chris@0 81 void setBaseColour(QColor);
Chris@0 82 QColor getBaseColour() const { return m_colour; }
Chris@0 83
Chris@0 84 /**
Chris@0 85 * Set whether to display mean values as a lighter-coloured area
Chris@0 86 * beneath the peaks. Rendering will be slightly faster without
Chris@0 87 * but arguably prettier with.
Chris@0 88 *
Chris@0 89 * The default is to display means.
Chris@0 90 */
Chris@0 91 void setShowMeans(bool);
Chris@0 92 bool getShowMeans() const { return m_showMeans; }
Chris@0 93
Chris@0 94 /**
Chris@0 95 * Set whether to use shades of grey (or of the base colour) to
Chris@0 96 * provide additional perceived vertical resolution (i.e. using
Chris@0 97 * half-filled pixels to represent levels that only just meet the
Chris@0 98 * pixel unit boundary). This provides a small improvement in
Chris@0 99 * waveform quality at a small cost in rendering speed.
Chris@0 100 *
Chris@0 101 * The default is to use greyscale.
Chris@0 102 */
Chris@0 103 void setUseGreyscale(bool);
Chris@0 104 bool getUseGreyscale() const { return m_greyscale; }
Chris@0 105
Chris@0 106
Chris@67 107 enum ChannelMode { SeparateChannels, MixChannels, MergeChannels };
Chris@0 108
Chris@0 109 /**
Chris@0 110 * Specify whether multi-channel audio data should be displayed
Chris@67 111 * with a separate axis per channel (SeparateChannels), with a
Chris@0 112 * single synthetic axis showing channel 0 above the axis and
Chris@67 113 * channel 1 below (MergeChannels), or with a single axis showing
Chris@67 114 * the average of the channels (MixChannels).
Chris@0 115 *
Chris@0 116 * MergeChannels does not work for files with more than 2
Chris@0 117 * channels.
Chris@0 118 *
Chris@0 119 * The default is SeparateChannels.
Chris@0 120 */
Chris@0 121 void setChannelMode(ChannelMode);
Chris@0 122 ChannelMode getChannelMode() const { return m_channelMode; }
Chris@0 123
Chris@0 124
Chris@0 125 /**
Chris@0 126 * Specify the channel to use from the source model. A value of
Chris@0 127 * -1 means to show all available channels (laid out to the
Chris@0 128 * channel mode). The default is -1.
Chris@0 129 */
Chris@0 130 void setChannel(int);
Chris@0 131 int getChannel() const { return m_channel; }
Chris@0 132
Chris@0 133
Chris@0 134 enum Scale { LinearScale, MeterScale, dBScale };
Chris@0 135
Chris@0 136 /**
Chris@0 137 * Specify the vertical scale for sample levels. With LinearScale,
Chris@0 138 * the scale is directly proportional to the raw [-1, +1)
Chris@0 139 * floating-point audio sample values. With dBScale the
Chris@0 140 * vertical scale is proportional to dB level (truncated at
Chris@0 141 * -50dB). MeterScale provides a hybrid variable scale based on
Chris@0 142 * IEC meter scale, intended to provide a clear overview at
Chris@0 143 * relatively small heights.
Chris@0 144 *
Chris@0 145 * Note that the effective gain (see setGain()) is applied before
Chris@0 146 * vertical scaling.
Chris@0 147 *
Chris@0 148 * The default is LinearScale.
Chris@0 149 */
Chris@0 150 void setScale(Scale);
Chris@0 151 Scale getScale() const { return m_scale; }
Chris@0 152
Chris@0 153 /**
Chris@0 154 * Enable or disable aggressive pixmap cacheing. If enabled,
Chris@0 155 * waveforms will be rendered to an off-screen pixmap and
Chris@0 156 * refreshed from there instead of being redrawn from the peak
Chris@0 157 * data each time. This may be faster if the data and zoom level
Chris@0 158 * do not change often, but it may be slower for frequently zoomed
Chris@0 159 * data and it will only work if the waveform is the "bottom"
Chris@0 160 * layer on the displayed widget, as each refresh will erase
Chris@0 161 * anything beneath the waveform.
Chris@0 162 *
Chris@0 163 * This is intended specifically for a panner widget display in
Chris@0 164 * which the waveform never moves, zooms, or changes, but some
Chris@0 165 * graphic such as a panner outline is frequently redrawn over the
Chris@0 166 * waveform. This situation would necessitate a lot of waveform
Chris@0 167 * refresh if the default cacheing strategy was used.
Chris@0 168 *
Chris@0 169 * The default is not to use aggressive cacheing.
Chris@0 170 */
Chris@0 171 void setAggressiveCacheing(bool);
Chris@0 172 bool getAggressiveCacheing() const { return m_aggressive; }
Chris@0 173
Chris@67 174 virtual bool isLayerScrollable(const View *) const;
Chris@67 175
Chris@115 176 virtual int getCompletion(View *) const;
Chris@0 177
Chris@101 178 virtual bool getValueExtents(float &min, float &max,
Chris@101 179 bool &log, QString &unit) const;
Chris@79 180
Chris@6 181 virtual QString toXmlString(QString indent = "",
Chris@6 182 QString extraAttributes = "") const;
Chris@6 183
Chris@11 184 void setProperties(const QXmlAttributes &attributes);
Chris@11 185
Chris@133 186 virtual int getVerticalZoomSteps(int &defaultStep) const;
Chris@133 187 virtual int getCurrentVerticalZoomStep() const;
Chris@133 188 virtual void setVerticalZoomStep(int);
Chris@133 189
Chris@0 190 protected:
Chris@0 191 int dBscale(float sample, int m) const;
Chris@0 192
Chris@0 193 const RangeSummarisableTimeValueModel *m_model; // I do not own this
Chris@0 194
Chris@0 195 /// Return value is number of channels displayed
Chris@67 196 size_t getChannelArrangement(size_t &min, size_t &max,
Chris@67 197 bool &merging, bool &mixing) const;
Chris@0 198
Chris@68 199 int getYForValue(View *v, Scale scale, float value, size_t channel,
Chris@68 200 size_t minChannel, size_t maxChannel) const;
Chris@68 201
Chris@6 202 float m_gain;
Chris@67 203 bool m_autoNormalize;
Chris@6 204 QColor m_colour;
Chris@6 205 bool m_showMeans;
Chris@6 206 bool m_greyscale;
Chris@6 207 ChannelMode m_channelMode;
Chris@6 208 int m_channel;
Chris@6 209 Scale m_scale;
Chris@6 210 bool m_aggressive;
Chris@0 211
Chris@67 212 mutable std::vector<float> m_effectiveGains;
Chris@67 213
Chris@0 214 mutable QPixmap *m_cache;
Chris@0 215 mutable bool m_cacheValid;
Chris@0 216 mutable int m_cacheZoomLevel;
Chris@0 217 };
Chris@0 218
Chris@0 219 #endif