annotate layer/WaveformLayer.h @ 101:0f36cdf407a6 sv1-v0.9rc1

* Make vertical scale alignment modes work in note layer as well as time-value layer, and several significant fixes to it * Make it possible to draw notes properly on the note layer * Show units (and frequencies etc in note layer's case) in the time-value and note layer description boxes * Minor fix to item edit dialog layout * Some minor menu rearrangement * Comment out a lot of debug output * Add SV website and reference URLs to Help menu, and add code to (attempt to) open them in the user's preferred browser
author Chris Cannam
date Fri, 12 May 2006 14:40:43 +0000
parents 4b98bda7e94d
children 47cb32bb35ab
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@0 22 #include "base/Layer.h"
Chris@0 23
Chris@0 24 #include "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@0 38 virtual const ZoomConstraint *getZoomConstraint() const { return m_model; }
Chris@0 39 virtual const Model *getModel() const { return m_model; }
Chris@44 40 virtual void paint(View *v, QPainter &paint, QRect rect) const;
Chris@0 41
Chris@44 42 virtual QString getFeatureDescription(View *v, QPoint &) const;
Chris@25 43
Chris@44 44 virtual int getVerticalScaleWidth(View *v, QPainter &) const;
Chris@44 45 virtual void paintVerticalScale(View *v, QPainter &paint, QRect rect) const;
Chris@0 46
Chris@0 47 void setModel(const RangeSummarisableTimeValueModel *model);
Chris@0 48
Chris@0 49 virtual PropertyList getProperties() const;
Chris@87 50 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@0 51 virtual PropertyType getPropertyType(const PropertyName &) const;
Chris@0 52 virtual QString getPropertyGroupName(const PropertyName &) const;
Chris@0 53 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@0 54 int *min, int *max) const;
Chris@0 55 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@0 56 int value) const;
Chris@0 57 virtual void setProperty(const PropertyName &, int value);
Chris@0 58
Chris@0 59 /**
Chris@0 60 * Set the gain multiplier for sample values in this view.
Chris@0 61 *
Chris@0 62 * The default is 1.0.
Chris@0 63 */
Chris@0 64 void setGain(float gain);
Chris@0 65 float getGain() const { return m_gain; }
Chris@0 66
Chris@0 67 /**
Chris@67 68 * Toggle automatic normalization of the currently visible waveform.
Chris@67 69 */
Chris@67 70 void setAutoNormalize(bool);
Chris@67 71 bool getAutoNormalize() const { return m_autoNormalize; }
Chris@67 72
Chris@67 73 /**
Chris@0 74 * Set the basic display colour for waveforms.
Chris@0 75 *
Chris@0 76 * The default is black.
Chris@0 77 *!!! NB should default to white if the associated View !hasLightBackground()
Chris@0 78 */
Chris@0 79 void setBaseColour(QColor);
Chris@0 80 QColor getBaseColour() const { return m_colour; }
Chris@0 81
Chris@0 82 /**
Chris@0 83 * Set whether to display mean values as a lighter-coloured area
Chris@0 84 * beneath the peaks. Rendering will be slightly faster without
Chris@0 85 * but arguably prettier with.
Chris@0 86 *
Chris@0 87 * The default is to display means.
Chris@0 88 */
Chris@0 89 void setShowMeans(bool);
Chris@0 90 bool getShowMeans() const { return m_showMeans; }
Chris@0 91
Chris@0 92 /**
Chris@0 93 * Set whether to use shades of grey (or of the base colour) to
Chris@0 94 * provide additional perceived vertical resolution (i.e. using
Chris@0 95 * half-filled pixels to represent levels that only just meet the
Chris@0 96 * pixel unit boundary). This provides a small improvement in
Chris@0 97 * waveform quality at a small cost in rendering speed.
Chris@0 98 *
Chris@0 99 * The default is to use greyscale.
Chris@0 100 */
Chris@0 101 void setUseGreyscale(bool);
Chris@0 102 bool getUseGreyscale() const { return m_greyscale; }
Chris@0 103
Chris@0 104
Chris@67 105 enum ChannelMode { SeparateChannels, MixChannels, MergeChannels };
Chris@0 106
Chris@0 107 /**
Chris@0 108 * Specify whether multi-channel audio data should be displayed
Chris@67 109 * with a separate axis per channel (SeparateChannels), with a
Chris@0 110 * single synthetic axis showing channel 0 above the axis and
Chris@67 111 * channel 1 below (MergeChannels), or with a single axis showing
Chris@67 112 * the average of the channels (MixChannels).
Chris@0 113 *
Chris@0 114 * MergeChannels does not work for files with more than 2
Chris@0 115 * channels.
Chris@0 116 *
Chris@0 117 * The default is SeparateChannels.
Chris@0 118 */
Chris@0 119 void setChannelMode(ChannelMode);
Chris@0 120 ChannelMode getChannelMode() const { return m_channelMode; }
Chris@0 121
Chris@0 122
Chris@0 123 /**
Chris@0 124 * Specify the channel to use from the source model. A value of
Chris@0 125 * -1 means to show all available channels (laid out to the
Chris@0 126 * channel mode). The default is -1.
Chris@0 127 */
Chris@0 128 void setChannel(int);
Chris@0 129 int getChannel() const { return m_channel; }
Chris@0 130
Chris@0 131
Chris@0 132 enum Scale { LinearScale, MeterScale, dBScale };
Chris@0 133
Chris@0 134 /**
Chris@0 135 * Specify the vertical scale for sample levels. With LinearScale,
Chris@0 136 * the scale is directly proportional to the raw [-1, +1)
Chris@0 137 * floating-point audio sample values. With dBScale the
Chris@0 138 * vertical scale is proportional to dB level (truncated at
Chris@0 139 * -50dB). MeterScale provides a hybrid variable scale based on
Chris@0 140 * IEC meter scale, intended to provide a clear overview at
Chris@0 141 * relatively small heights.
Chris@0 142 *
Chris@0 143 * Note that the effective gain (see setGain()) is applied before
Chris@0 144 * vertical scaling.
Chris@0 145 *
Chris@0 146 * The default is LinearScale.
Chris@0 147 */
Chris@0 148 void setScale(Scale);
Chris@0 149 Scale getScale() const { return m_scale; }
Chris@0 150
Chris@0 151 /**
Chris@0 152 * Enable or disable aggressive pixmap cacheing. If enabled,
Chris@0 153 * waveforms will be rendered to an off-screen pixmap and
Chris@0 154 * refreshed from there instead of being redrawn from the peak
Chris@0 155 * data each time. This may be faster if the data and zoom level
Chris@0 156 * do not change often, but it may be slower for frequently zoomed
Chris@0 157 * data and it will only work if the waveform is the "bottom"
Chris@0 158 * layer on the displayed widget, as each refresh will erase
Chris@0 159 * anything beneath the waveform.
Chris@0 160 *
Chris@0 161 * This is intended specifically for a panner widget display in
Chris@0 162 * which the waveform never moves, zooms, or changes, but some
Chris@0 163 * graphic such as a panner outline is frequently redrawn over the
Chris@0 164 * waveform. This situation would necessitate a lot of waveform
Chris@0 165 * refresh if the default cacheing strategy was used.
Chris@0 166 *
Chris@0 167 * The default is not to use aggressive cacheing.
Chris@0 168 */
Chris@0 169 void setAggressiveCacheing(bool);
Chris@0 170 bool getAggressiveCacheing() const { return m_aggressive; }
Chris@0 171
Chris@67 172 virtual bool isLayerScrollable(const View *) const;
Chris@67 173
Chris@0 174 virtual int getCompletion() const;
Chris@0 175
Chris@101 176 virtual bool getValueExtents(float &min, float &max,
Chris@101 177 bool &log, QString &unit) const;
Chris@79 178
Chris@6 179 virtual QString toXmlString(QString indent = "",
Chris@6 180 QString extraAttributes = "") const;
Chris@6 181
Chris@11 182 void setProperties(const QXmlAttributes &attributes);
Chris@11 183
Chris@0 184 protected:
Chris@0 185 int dBscale(float sample, int m) const;
Chris@0 186
Chris@0 187 const RangeSummarisableTimeValueModel *m_model; // I do not own this
Chris@0 188
Chris@0 189 /// Return value is number of channels displayed
Chris@67 190 size_t getChannelArrangement(size_t &min, size_t &max,
Chris@67 191 bool &merging, bool &mixing) const;
Chris@0 192
Chris@68 193 int getYForValue(View *v, Scale scale, float value, size_t channel,
Chris@68 194 size_t minChannel, size_t maxChannel) const;
Chris@68 195
Chris@6 196 float m_gain;
Chris@67 197 bool m_autoNormalize;
Chris@6 198 QColor m_colour;
Chris@6 199 bool m_showMeans;
Chris@6 200 bool m_greyscale;
Chris@6 201 ChannelMode m_channelMode;
Chris@6 202 int m_channel;
Chris@6 203 Scale m_scale;
Chris@6 204 bool m_aggressive;
Chris@0 205
Chris@67 206 mutable std::vector<float> m_effectiveGains;
Chris@67 207
Chris@0 208 mutable QPixmap *m_cache;
Chris@0 209 mutable bool m_cacheValid;
Chris@0 210 mutable int m_cacheZoomLevel;
Chris@0 211 };
Chris@0 212
Chris@0 213 #endif