annotate base/Preferences.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents c5970f7af886
children
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_windowType(HanningWindow),
lbajardsilogic@0 41 m_resampleQuality(1)
lbajardsilogic@0 42 {
lbajardsilogic@0 43 QSettings settings;
lbajardsilogic@0 44 settings.beginGroup("Preferences");
lbajardsilogic@0 45 m_spectrogramSmoothing = SpectrogramSmoothing
lbajardsilogic@0 46 (settings.value("spectrogram-smoothing", int(m_spectrogramSmoothing)).toInt());
lbajardsilogic@0 47 m_tuningFrequency = settings.value("tuning-frequency", 440.f).toDouble();
lbajardsilogic@0 48 m_windowType = WindowType
lbajardsilogic@0 49 (settings.value("window-type", int(HanningWindow)).toInt());
lbajardsilogic@0 50 m_resampleQuality = settings.value("resample-quality", 1).toInt();
lbajardsilogic@0 51 settings.endGroup();
lbajardsilogic@0 52 }
lbajardsilogic@0 53
lbajardsilogic@0 54 Preferences::~Preferences()
lbajardsilogic@0 55 {
lbajardsilogic@0 56 }
lbajardsilogic@0 57
lbajardsilogic@0 58 Preferences::PropertyList
lbajardsilogic@0 59 Preferences::getProperties() const
lbajardsilogic@0 60 {
lbajardsilogic@0 61 PropertyList props;
lbajardsilogic@0 62 props.push_back("Spectrogram Smoothing");
lbajardsilogic@0 63 props.push_back("Tuning Frequency");
lbajardsilogic@0 64 props.push_back("Window Type");
lbajardsilogic@0 65 props.push_back("Resample Quality");
lbajardsilogic@0 66 return props;
lbajardsilogic@0 67 }
lbajardsilogic@0 68
lbajardsilogic@0 69 QString
lbajardsilogic@0 70 Preferences::getPropertyLabel(const PropertyName &name) const
lbajardsilogic@0 71 {
lbajardsilogic@0 72 if (name == "Spectrogram Smoothing") {
lbajardsilogic@0 73 return tr("Spectrogram y-axis smoothing:");
lbajardsilogic@0 74 }
lbajardsilogic@0 75 if (name == "Tuning Frequency") {
lbajardsilogic@0 76 return tr("Frequency of concert A");
lbajardsilogic@0 77 }
lbajardsilogic@0 78 if (name == "Window Type") {
lbajardsilogic@0 79 return tr("Spectral analysis window shape");
lbajardsilogic@0 80 }
lbajardsilogic@0 81 if (name == "Resample Quality") {
lbajardsilogic@0 82 return tr("Playback resampler type");
lbajardsilogic@0 83 }
lbajardsilogic@0 84 return name;
lbajardsilogic@0 85 }
lbajardsilogic@0 86
lbajardsilogic@0 87 Preferences::PropertyType
lbajardsilogic@0 88 Preferences::getPropertyType(const PropertyName &name) const
lbajardsilogic@0 89 {
lbajardsilogic@0 90 if (name == "Spectrogram Smoothing") {
lbajardsilogic@0 91 return ValueProperty;
lbajardsilogic@0 92 }
lbajardsilogic@0 93 if (name == "Tuning Frequency") {
lbajardsilogic@0 94 return RangeProperty;
lbajardsilogic@0 95 }
lbajardsilogic@0 96 if (name == "Property Box Layout") {
lbajardsilogic@0 97 return ValueProperty;
lbajardsilogic@0 98 }
lbajardsilogic@0 99 if (name == "Window Type") {
lbajardsilogic@0 100 return ValueProperty;
lbajardsilogic@0 101 }
lbajardsilogic@0 102 if (name == "Resample Quality") {
lbajardsilogic@0 103 return ValueProperty;
lbajardsilogic@0 104 }
lbajardsilogic@0 105 return InvalidProperty;
lbajardsilogic@0 106 }
lbajardsilogic@0 107
lbajardsilogic@0 108 int
lbajardsilogic@0 109 Preferences::getPropertyRangeAndValue(const PropertyName &name,
lbajardsilogic@0 110 int *min, int *max, int *deflt) const
lbajardsilogic@0 111 {
lbajardsilogic@0 112 if (name == "Spectrogram Smoothing") {
lbajardsilogic@0 113 if (min) *min = 0;
lbajardsilogic@0 114 if (max) *max = 2;
lbajardsilogic@0 115 if (deflt) *deflt = int(SpectrogramZeroPadded);
lbajardsilogic@0 116 return int(m_spectrogramSmoothing);
lbajardsilogic@0 117 }
lbajardsilogic@0 118
lbajardsilogic@204 119 //!!! freq mapping
lbajardsilogic@0 120
lbajardsilogic@0 121 if (name == "Window Type") {
lbajardsilogic@0 122 if (min) *min = int(RectangularWindow);
lbajardsilogic@0 123 if (max) *max = int(BlackmanHarrisWindow);
lbajardsilogic@0 124 if (deflt) *deflt = int(HanningWindow);
lbajardsilogic@0 125 return int(m_windowType);
lbajardsilogic@0 126 }
lbajardsilogic@0 127
lbajardsilogic@0 128 if (name == "Resample Quality") {
lbajardsilogic@0 129 if (min) *min = 0;
lbajardsilogic@0 130 if (max) *max = 2;
lbajardsilogic@0 131 if (deflt) *deflt = 1;
lbajardsilogic@0 132 return m_resampleQuality;
lbajardsilogic@0 133 }
lbajardsilogic@0 134
lbajardsilogic@0 135 return 0;
lbajardsilogic@0 136 }
lbajardsilogic@0 137
lbajardsilogic@0 138 QString
lbajardsilogic@0 139 Preferences::getPropertyValueLabel(const PropertyName &name,
lbajardsilogic@0 140 int value) const
lbajardsilogic@0 141 {
lbajardsilogic@0 142 if (name == "Window Type") {
lbajardsilogic@0 143 switch (WindowType(value)) {
lbajardsilogic@0 144 case RectangularWindow: return tr("Rectangular");
lbajardsilogic@0 145 case BartlettWindow: return tr("Triangular");
lbajardsilogic@0 146 case HammingWindow: return tr("Hamming");
lbajardsilogic@0 147 case HanningWindow: return tr("Hanning");
lbajardsilogic@0 148 case BlackmanWindow: return tr("Blackman");
lbajardsilogic@0 149 case GaussianWindow: return tr("Gaussian");
lbajardsilogic@0 150 case ParzenWindow: return tr("Parzen");
lbajardsilogic@0 151 case NuttallWindow: return tr("Nuttall");
lbajardsilogic@0 152 case BlackmanHarrisWindow: return tr("Blackman-Harris");
lbajardsilogic@0 153 }
lbajardsilogic@0 154 }
lbajardsilogic@0 155 if (name == "Resample Quality") {
lbajardsilogic@0 156 switch (value) {
lbajardsilogic@0 157 case 0: return tr("Fastest");
lbajardsilogic@0 158 case 1: return tr("Standard");
lbajardsilogic@0 159 case 2: return tr("Highest quality");
lbajardsilogic@0 160 }
lbajardsilogic@0 161 }
lbajardsilogic@0 162 if (name == "Spectrogram Smoothing") {
lbajardsilogic@0 163 switch (value) {
lbajardsilogic@0 164 case NoSpectrogramSmoothing: return tr("None - blocky but accurate");
lbajardsilogic@0 165 case SpectrogramInterpolated: return tr("Interpolate - fast but fuzzy");
lbajardsilogic@0 166 case SpectrogramZeroPadded: return tr("Zero pad FFT - slow but clear");
lbajardsilogic@0 167 }
lbajardsilogic@0 168 }
lbajardsilogic@0 169
lbajardsilogic@0 170 return "";
lbajardsilogic@0 171 }
lbajardsilogic@0 172
lbajardsilogic@0 173 QString
lbajardsilogic@0 174 Preferences::getPropertyContainerName() const
lbajardsilogic@0 175 {
lbajardsilogic@0 176 return tr("Preferences");
lbajardsilogic@0 177 }
lbajardsilogic@0 178
lbajardsilogic@0 179 QString
lbajardsilogic@0 180 Preferences::getPropertyContainerIconName() const
lbajardsilogic@0 181 {
lbajardsilogic@0 182 return "preferences";
lbajardsilogic@0 183 }
lbajardsilogic@0 184
lbajardsilogic@0 185 void
lbajardsilogic@0 186 Preferences::setProperty(const PropertyName &name, int value)
lbajardsilogic@0 187 {
lbajardsilogic@0 188 if (name == "Spectrogram Smoothing") {
lbajardsilogic@0 189 setSpectrogramSmoothing(SpectrogramSmoothing(value));
lbajardsilogic@0 190 } else if (name == "Tuning Frequency") {
lbajardsilogic@0 191 //!!!
lbajardsilogic@0 192 } else if (name == "Window Type") {
lbajardsilogic@0 193 setWindowType(WindowType(value));
lbajardsilogic@0 194 } else if (name == "Resample Quality") {
lbajardsilogic@0 195 setResampleQuality(value);
lbajardsilogic@0 196 }
lbajardsilogic@0 197 }
lbajardsilogic@0 198
lbajardsilogic@0 199 void
lbajardsilogic@0 200 Preferences::setSpectrogramSmoothing(SpectrogramSmoothing smoothing)
lbajardsilogic@0 201 {
lbajardsilogic@0 202 if (m_spectrogramSmoothing != smoothing) {
lbajardsilogic@0 203
lbajardsilogic@0 204 // "smoothing" is one of those words that looks increasingly
lbajardsilogic@0 205 // ridiculous the more you see it. Smoothing smoothing smoothing.
lbajardsilogic@0 206 m_spectrogramSmoothing = smoothing;
lbajardsilogic@0 207
lbajardsilogic@0 208 QSettings settings;
lbajardsilogic@0 209 settings.beginGroup("Preferences");
lbajardsilogic@0 210 settings.setValue("spectrogram-smoothing", int(smoothing));
lbajardsilogic@0 211 settings.endGroup();
lbajardsilogic@0 212 emit propertyChanged("Spectrogram Smoothing");
lbajardsilogic@0 213 }
lbajardsilogic@0 214 }
lbajardsilogic@0 215
lbajardsilogic@0 216 void
lbajardsilogic@0 217 Preferences::setTuningFrequency(float freq)
lbajardsilogic@0 218 {
lbajardsilogic@0 219 if (m_tuningFrequency != freq) {
lbajardsilogic@0 220 m_tuningFrequency = freq;
lbajardsilogic@0 221 QSettings settings;
lbajardsilogic@0 222 settings.beginGroup("Preferences");
lbajardsilogic@0 223 settings.setValue("tuning-frequency", freq);
lbajardsilogic@0 224 settings.endGroup();
lbajardsilogic@0 225 emit propertyChanged("Tuning Frequency");
lbajardsilogic@0 226 }
lbajardsilogic@0 227 }
lbajardsilogic@0 228
lbajardsilogic@0 229 void
lbajardsilogic@0 230 Preferences::setWindowType(WindowType type)
lbajardsilogic@0 231 {
lbajardsilogic@0 232 if (m_windowType != type) {
lbajardsilogic@0 233 m_windowType = type;
lbajardsilogic@0 234 QSettings settings;
lbajardsilogic@0 235 settings.beginGroup("Preferences");
lbajardsilogic@0 236 settings.setValue("window-type", int(type));
lbajardsilogic@0 237 settings.endGroup();
lbajardsilogic@0 238 emit propertyChanged("Window Type");
lbajardsilogic@0 239 }
lbajardsilogic@0 240 }
lbajardsilogic@0 241
lbajardsilogic@0 242 void
lbajardsilogic@0 243 Preferences::setResampleQuality(int q)
lbajardsilogic@0 244 {
lbajardsilogic@0 245 if (m_resampleQuality != q) {
lbajardsilogic@0 246 m_resampleQuality = q;
lbajardsilogic@0 247 QSettings settings;
lbajardsilogic@0 248 settings.beginGroup("Preferences");
lbajardsilogic@0 249 settings.setValue("resample-quality", q);
lbajardsilogic@0 250 settings.endGroup();
lbajardsilogic@0 251 emit propertyChanged("Resample Quality");
lbajardsilogic@0 252 }
lbajardsilogic@0 253 }