annotate base/Preferences.cpp @ 0:fc9323a41f5a

start base : Sonic Visualiser sv1-1.0rc1
author lbajardsilogic
date Fri, 11 May 2007 09:08:14 +0000
parents
children c5970f7af886
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 Chris Cannam and QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #include "Preferences.h"
lbajardsilogic@0 17
lbajardsilogic@0 18 #include "Exceptions.h"
lbajardsilogic@0 19
lbajardsilogic@0 20 #include "TempDirectory.h"
lbajardsilogic@0 21
lbajardsilogic@0 22 #include <QDir>
lbajardsilogic@0 23 #include <QFileInfo>
lbajardsilogic@0 24 #include <QMutex>
lbajardsilogic@0 25 #include <QSettings>
lbajardsilogic@0 26
lbajardsilogic@0 27 Preferences *
lbajardsilogic@0 28 Preferences::m_instance = 0;
lbajardsilogic@0 29
lbajardsilogic@0 30 Preferences *
lbajardsilogic@0 31 Preferences::getInstance()
lbajardsilogic@0 32 {
lbajardsilogic@0 33 if (!m_instance) m_instance = new Preferences();
lbajardsilogic@0 34 return m_instance;
lbajardsilogic@0 35 }
lbajardsilogic@0 36
lbajardsilogic@0 37 Preferences::Preferences() :
lbajardsilogic@0 38 m_spectrogramSmoothing(SpectrogramZeroPadded),
lbajardsilogic@0 39 m_tuningFrequency(440),
lbajardsilogic@0 40 m_propertyBoxLayout(VerticallyStacked),
lbajardsilogic@0 41 m_windowType(HanningWindow),
lbajardsilogic@0 42 m_resampleQuality(1)
lbajardsilogic@0 43 {
lbajardsilogic@0 44 QSettings settings;
lbajardsilogic@0 45 settings.beginGroup("Preferences");
lbajardsilogic@0 46 m_spectrogramSmoothing = SpectrogramSmoothing
lbajardsilogic@0 47 (settings.value("spectrogram-smoothing", int(m_spectrogramSmoothing)).toInt());
lbajardsilogic@0 48 m_tuningFrequency = settings.value("tuning-frequency", 440.f).toDouble();
lbajardsilogic@0 49 m_propertyBoxLayout = PropertyBoxLayout
lbajardsilogic@0 50 (settings.value("property-box-layout", int(VerticallyStacked)).toInt());
lbajardsilogic@0 51 m_windowType = WindowType
lbajardsilogic@0 52 (settings.value("window-type", int(HanningWindow)).toInt());
lbajardsilogic@0 53 m_resampleQuality = settings.value("resample-quality", 1).toInt();
lbajardsilogic@0 54 settings.endGroup();
lbajardsilogic@0 55 }
lbajardsilogic@0 56
lbajardsilogic@0 57 Preferences::~Preferences()
lbajardsilogic@0 58 {
lbajardsilogic@0 59 }
lbajardsilogic@0 60
lbajardsilogic@0 61 Preferences::PropertyList
lbajardsilogic@0 62 Preferences::getProperties() const
lbajardsilogic@0 63 {
lbajardsilogic@0 64 PropertyList props;
lbajardsilogic@0 65 props.push_back("Spectrogram Smoothing");
lbajardsilogic@0 66 props.push_back("Tuning Frequency");
lbajardsilogic@0 67 props.push_back("Property Box Layout");
lbajardsilogic@0 68 props.push_back("Window Type");
lbajardsilogic@0 69 props.push_back("Resample Quality");
lbajardsilogic@0 70 return props;
lbajardsilogic@0 71 }
lbajardsilogic@0 72
lbajardsilogic@0 73 QString
lbajardsilogic@0 74 Preferences::getPropertyLabel(const PropertyName &name) const
lbajardsilogic@0 75 {
lbajardsilogic@0 76 if (name == "Spectrogram Smoothing") {
lbajardsilogic@0 77 return tr("Spectrogram y-axis smoothing:");
lbajardsilogic@0 78 }
lbajardsilogic@0 79 if (name == "Tuning Frequency") {
lbajardsilogic@0 80 return tr("Frequency of concert A");
lbajardsilogic@0 81 }
lbajardsilogic@0 82 if (name == "Property Box Layout") {
lbajardsilogic@0 83 return tr("Property box layout");
lbajardsilogic@0 84 }
lbajardsilogic@0 85 if (name == "Window Type") {
lbajardsilogic@0 86 return tr("Spectral analysis window shape");
lbajardsilogic@0 87 }
lbajardsilogic@0 88 if (name == "Resample Quality") {
lbajardsilogic@0 89 return tr("Playback resampler type");
lbajardsilogic@0 90 }
lbajardsilogic@0 91 return name;
lbajardsilogic@0 92 }
lbajardsilogic@0 93
lbajardsilogic@0 94 Preferences::PropertyType
lbajardsilogic@0 95 Preferences::getPropertyType(const PropertyName &name) const
lbajardsilogic@0 96 {
lbajardsilogic@0 97 if (name == "Spectrogram Smoothing") {
lbajardsilogic@0 98 return ValueProperty;
lbajardsilogic@0 99 }
lbajardsilogic@0 100 if (name == "Tuning Frequency") {
lbajardsilogic@0 101 return RangeProperty;
lbajardsilogic@0 102 }
lbajardsilogic@0 103 if (name == "Property Box Layout") {
lbajardsilogic@0 104 return ValueProperty;
lbajardsilogic@0 105 }
lbajardsilogic@0 106 if (name == "Window Type") {
lbajardsilogic@0 107 return ValueProperty;
lbajardsilogic@0 108 }
lbajardsilogic@0 109 if (name == "Resample Quality") {
lbajardsilogic@0 110 return ValueProperty;
lbajardsilogic@0 111 }
lbajardsilogic@0 112 return InvalidProperty;
lbajardsilogic@0 113 }
lbajardsilogic@0 114
lbajardsilogic@0 115 int
lbajardsilogic@0 116 Preferences::getPropertyRangeAndValue(const PropertyName &name,
lbajardsilogic@0 117 int *min, int *max, int *deflt) const
lbajardsilogic@0 118 {
lbajardsilogic@0 119 if (name == "Spectrogram Smoothing") {
lbajardsilogic@0 120 if (min) *min = 0;
lbajardsilogic@0 121 if (max) *max = 2;
lbajardsilogic@0 122 if (deflt) *deflt = int(SpectrogramZeroPadded);
lbajardsilogic@0 123 return int(m_spectrogramSmoothing);
lbajardsilogic@0 124 }
lbajardsilogic@0 125
lbajardsilogic@0 126 //!!! freq mapping
lbajardsilogic@0 127
lbajardsilogic@0 128 if (name == "Property Box Layout") {
lbajardsilogic@0 129 if (min) *min = 0;
lbajardsilogic@0 130 if (max) *max = 1;
lbajardsilogic@0 131 if (deflt) *deflt = 0;
lbajardsilogic@0 132 return m_propertyBoxLayout == Layered ? 1 : 0;
lbajardsilogic@0 133 }
lbajardsilogic@0 134
lbajardsilogic@0 135 if (name == "Window Type") {
lbajardsilogic@0 136 if (min) *min = int(RectangularWindow);
lbajardsilogic@0 137 if (max) *max = int(BlackmanHarrisWindow);
lbajardsilogic@0 138 if (deflt) *deflt = int(HanningWindow);
lbajardsilogic@0 139 return int(m_windowType);
lbajardsilogic@0 140 }
lbajardsilogic@0 141
lbajardsilogic@0 142 if (name == "Resample Quality") {
lbajardsilogic@0 143 if (min) *min = 0;
lbajardsilogic@0 144 if (max) *max = 2;
lbajardsilogic@0 145 if (deflt) *deflt = 1;
lbajardsilogic@0 146 return m_resampleQuality;
lbajardsilogic@0 147 }
lbajardsilogic@0 148
lbajardsilogic@0 149 return 0;
lbajardsilogic@0 150 }
lbajardsilogic@0 151
lbajardsilogic@0 152 QString
lbajardsilogic@0 153 Preferences::getPropertyValueLabel(const PropertyName &name,
lbajardsilogic@0 154 int value) const
lbajardsilogic@0 155 {
lbajardsilogic@0 156 if (name == "Property Box Layout") {
lbajardsilogic@0 157 if (value == 0) return tr("Show boxes for all panes");
lbajardsilogic@0 158 else return tr("Show box for current pane only");
lbajardsilogic@0 159 }
lbajardsilogic@0 160 if (name == "Window Type") {
lbajardsilogic@0 161 switch (WindowType(value)) {
lbajardsilogic@0 162 case RectangularWindow: return tr("Rectangular");
lbajardsilogic@0 163 case BartlettWindow: return tr("Triangular");
lbajardsilogic@0 164 case HammingWindow: return tr("Hamming");
lbajardsilogic@0 165 case HanningWindow: return tr("Hanning");
lbajardsilogic@0 166 case BlackmanWindow: return tr("Blackman");
lbajardsilogic@0 167 case GaussianWindow: return tr("Gaussian");
lbajardsilogic@0 168 case ParzenWindow: return tr("Parzen");
lbajardsilogic@0 169 case NuttallWindow: return tr("Nuttall");
lbajardsilogic@0 170 case BlackmanHarrisWindow: return tr("Blackman-Harris");
lbajardsilogic@0 171 }
lbajardsilogic@0 172 }
lbajardsilogic@0 173 if (name == "Resample Quality") {
lbajardsilogic@0 174 switch (value) {
lbajardsilogic@0 175 case 0: return tr("Fastest");
lbajardsilogic@0 176 case 1: return tr("Standard");
lbajardsilogic@0 177 case 2: return tr("Highest quality");
lbajardsilogic@0 178 }
lbajardsilogic@0 179 }
lbajardsilogic@0 180 if (name == "Spectrogram Smoothing") {
lbajardsilogic@0 181 switch (value) {
lbajardsilogic@0 182 case NoSpectrogramSmoothing: return tr("None - blocky but accurate");
lbajardsilogic@0 183 case SpectrogramInterpolated: return tr("Interpolate - fast but fuzzy");
lbajardsilogic@0 184 case SpectrogramZeroPadded: return tr("Zero pad FFT - slow but clear");
lbajardsilogic@0 185 }
lbajardsilogic@0 186 }
lbajardsilogic@0 187
lbajardsilogic@0 188 return "";
lbajardsilogic@0 189 }
lbajardsilogic@0 190
lbajardsilogic@0 191 QString
lbajardsilogic@0 192 Preferences::getPropertyContainerName() const
lbajardsilogic@0 193 {
lbajardsilogic@0 194 return tr("Preferences");
lbajardsilogic@0 195 }
lbajardsilogic@0 196
lbajardsilogic@0 197 QString
lbajardsilogic@0 198 Preferences::getPropertyContainerIconName() const
lbajardsilogic@0 199 {
lbajardsilogic@0 200 return "preferences";
lbajardsilogic@0 201 }
lbajardsilogic@0 202
lbajardsilogic@0 203 void
lbajardsilogic@0 204 Preferences::setProperty(const PropertyName &name, int value)
lbajardsilogic@0 205 {
lbajardsilogic@0 206 if (name == "Spectrogram Smoothing") {
lbajardsilogic@0 207 setSpectrogramSmoothing(SpectrogramSmoothing(value));
lbajardsilogic@0 208 } else if (name == "Tuning Frequency") {
lbajardsilogic@0 209 //!!!
lbajardsilogic@0 210 } else if (name == "Property Box Layout") {
lbajardsilogic@0 211 setPropertyBoxLayout(value == 0 ? VerticallyStacked : Layered);
lbajardsilogic@0 212 } else if (name == "Window Type") {
lbajardsilogic@0 213 setWindowType(WindowType(value));
lbajardsilogic@0 214 } else if (name == "Resample Quality") {
lbajardsilogic@0 215 setResampleQuality(value);
lbajardsilogic@0 216 }
lbajardsilogic@0 217 }
lbajardsilogic@0 218
lbajardsilogic@0 219 void
lbajardsilogic@0 220 Preferences::setSpectrogramSmoothing(SpectrogramSmoothing smoothing)
lbajardsilogic@0 221 {
lbajardsilogic@0 222 if (m_spectrogramSmoothing != smoothing) {
lbajardsilogic@0 223
lbajardsilogic@0 224 // "smoothing" is one of those words that looks increasingly
lbajardsilogic@0 225 // ridiculous the more you see it. Smoothing smoothing smoothing.
lbajardsilogic@0 226 m_spectrogramSmoothing = smoothing;
lbajardsilogic@0 227
lbajardsilogic@0 228 QSettings settings;
lbajardsilogic@0 229 settings.beginGroup("Preferences");
lbajardsilogic@0 230 settings.setValue("spectrogram-smoothing", int(smoothing));
lbajardsilogic@0 231 settings.endGroup();
lbajardsilogic@0 232 emit propertyChanged("Spectrogram Smoothing");
lbajardsilogic@0 233 }
lbajardsilogic@0 234 }
lbajardsilogic@0 235
lbajardsilogic@0 236 void
lbajardsilogic@0 237 Preferences::setTuningFrequency(float freq)
lbajardsilogic@0 238 {
lbajardsilogic@0 239 if (m_tuningFrequency != freq) {
lbajardsilogic@0 240 m_tuningFrequency = freq;
lbajardsilogic@0 241 QSettings settings;
lbajardsilogic@0 242 settings.beginGroup("Preferences");
lbajardsilogic@0 243 settings.setValue("tuning-frequency", freq);
lbajardsilogic@0 244 settings.endGroup();
lbajardsilogic@0 245 emit propertyChanged("Tuning Frequency");
lbajardsilogic@0 246 }
lbajardsilogic@0 247 }
lbajardsilogic@0 248
lbajardsilogic@0 249 void
lbajardsilogic@0 250 Preferences::setPropertyBoxLayout(PropertyBoxLayout layout)
lbajardsilogic@0 251 {
lbajardsilogic@0 252 if (m_propertyBoxLayout != layout) {
lbajardsilogic@0 253 m_propertyBoxLayout = layout;
lbajardsilogic@0 254 QSettings settings;
lbajardsilogic@0 255 settings.beginGroup("Preferences");
lbajardsilogic@0 256 settings.setValue("property-box-layout", int(layout));
lbajardsilogic@0 257 settings.endGroup();
lbajardsilogic@0 258 emit propertyChanged("Property Box Layout");
lbajardsilogic@0 259 }
lbajardsilogic@0 260 }
lbajardsilogic@0 261
lbajardsilogic@0 262 void
lbajardsilogic@0 263 Preferences::setWindowType(WindowType type)
lbajardsilogic@0 264 {
lbajardsilogic@0 265 if (m_windowType != type) {
lbajardsilogic@0 266 m_windowType = type;
lbajardsilogic@0 267 QSettings settings;
lbajardsilogic@0 268 settings.beginGroup("Preferences");
lbajardsilogic@0 269 settings.setValue("window-type", int(type));
lbajardsilogic@0 270 settings.endGroup();
lbajardsilogic@0 271 emit propertyChanged("Window Type");
lbajardsilogic@0 272 }
lbajardsilogic@0 273 }
lbajardsilogic@0 274
lbajardsilogic@0 275 void
lbajardsilogic@0 276 Preferences::setResampleQuality(int q)
lbajardsilogic@0 277 {
lbajardsilogic@0 278 if (m_resampleQuality != q) {
lbajardsilogic@0 279 m_resampleQuality = q;
lbajardsilogic@0 280 QSettings settings;
lbajardsilogic@0 281 settings.beginGroup("Preferences");
lbajardsilogic@0 282 settings.setValue("resample-quality", q);
lbajardsilogic@0 283 settings.endGroup();
lbajardsilogic@0 284 emit propertyChanged("Resample Quality");
lbajardsilogic@0 285 }
lbajardsilogic@0 286 }