lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 Chris Cannam and QMUL. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #include "Preferences.h" lbajardsilogic@0: lbajardsilogic@0: #include "Exceptions.h" lbajardsilogic@0: lbajardsilogic@0: #include "TempDirectory.h" lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: Preferences * lbajardsilogic@0: Preferences::m_instance = 0; lbajardsilogic@0: lbajardsilogic@0: Preferences * lbajardsilogic@0: Preferences::getInstance() lbajardsilogic@0: { lbajardsilogic@0: if (!m_instance) m_instance = new Preferences(); lbajardsilogic@0: return m_instance; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: Preferences::Preferences() : lbajardsilogic@0: m_spectrogramSmoothing(SpectrogramZeroPadded), lbajardsilogic@0: m_tuningFrequency(440), lbajardsilogic@0: m_windowType(HanningWindow), lbajardsilogic@0: m_resampleQuality(1) lbajardsilogic@0: { lbajardsilogic@0: QSettings settings; lbajardsilogic@0: settings.beginGroup("Preferences"); lbajardsilogic@0: m_spectrogramSmoothing = SpectrogramSmoothing lbajardsilogic@0: (settings.value("spectrogram-smoothing", int(m_spectrogramSmoothing)).toInt()); lbajardsilogic@0: m_tuningFrequency = settings.value("tuning-frequency", 440.f).toDouble(); lbajardsilogic@0: m_windowType = WindowType lbajardsilogic@0: (settings.value("window-type", int(HanningWindow)).toInt()); lbajardsilogic@0: m_resampleQuality = settings.value("resample-quality", 1).toInt(); lbajardsilogic@0: settings.endGroup(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: Preferences::~Preferences() lbajardsilogic@0: { lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: Preferences::PropertyList lbajardsilogic@0: Preferences::getProperties() const lbajardsilogic@0: { lbajardsilogic@0: PropertyList props; lbajardsilogic@0: props.push_back("Spectrogram Smoothing"); lbajardsilogic@0: props.push_back("Tuning Frequency"); lbajardsilogic@0: props.push_back("Window Type"); lbajardsilogic@0: props.push_back("Resample Quality"); lbajardsilogic@0: return props; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QString lbajardsilogic@0: Preferences::getPropertyLabel(const PropertyName &name) const lbajardsilogic@0: { lbajardsilogic@0: if (name == "Spectrogram Smoothing") { lbajardsilogic@0: return tr("Spectrogram y-axis smoothing:"); lbajardsilogic@0: } lbajardsilogic@0: if (name == "Tuning Frequency") { lbajardsilogic@0: return tr("Frequency of concert A"); lbajardsilogic@0: } lbajardsilogic@0: if (name == "Window Type") { lbajardsilogic@0: return tr("Spectral analysis window shape"); lbajardsilogic@0: } lbajardsilogic@0: if (name == "Resample Quality") { lbajardsilogic@0: return tr("Playback resampler type"); lbajardsilogic@0: } lbajardsilogic@0: return name; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: Preferences::PropertyType lbajardsilogic@0: Preferences::getPropertyType(const PropertyName &name) const lbajardsilogic@0: { lbajardsilogic@0: if (name == "Spectrogram Smoothing") { lbajardsilogic@0: return ValueProperty; lbajardsilogic@0: } lbajardsilogic@0: if (name == "Tuning Frequency") { lbajardsilogic@0: return RangeProperty; lbajardsilogic@0: } lbajardsilogic@0: if (name == "Property Box Layout") { lbajardsilogic@0: return ValueProperty; lbajardsilogic@0: } lbajardsilogic@0: if (name == "Window Type") { lbajardsilogic@0: return ValueProperty; lbajardsilogic@0: } lbajardsilogic@0: if (name == "Resample Quality") { lbajardsilogic@0: return ValueProperty; lbajardsilogic@0: } lbajardsilogic@0: return InvalidProperty; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: int lbajardsilogic@0: Preferences::getPropertyRangeAndValue(const PropertyName &name, lbajardsilogic@0: int *min, int *max, int *deflt) const lbajardsilogic@0: { lbajardsilogic@0: if (name == "Spectrogram Smoothing") { lbajardsilogic@0: if (min) *min = 0; lbajardsilogic@0: if (max) *max = 2; lbajardsilogic@0: if (deflt) *deflt = int(SpectrogramZeroPadded); lbajardsilogic@0: return int(m_spectrogramSmoothing); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@204: //!!! freq mapping lbajardsilogic@0: lbajardsilogic@0: if (name == "Window Type") { lbajardsilogic@0: if (min) *min = int(RectangularWindow); lbajardsilogic@0: if (max) *max = int(BlackmanHarrisWindow); lbajardsilogic@0: if (deflt) *deflt = int(HanningWindow); lbajardsilogic@0: return int(m_windowType); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: if (name == "Resample Quality") { lbajardsilogic@0: if (min) *min = 0; lbajardsilogic@0: if (max) *max = 2; lbajardsilogic@0: if (deflt) *deflt = 1; lbajardsilogic@0: return m_resampleQuality; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: return 0; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QString lbajardsilogic@0: Preferences::getPropertyValueLabel(const PropertyName &name, lbajardsilogic@0: int value) const lbajardsilogic@0: { lbajardsilogic@0: if (name == "Window Type") { lbajardsilogic@0: switch (WindowType(value)) { lbajardsilogic@0: case RectangularWindow: return tr("Rectangular"); lbajardsilogic@0: case BartlettWindow: return tr("Triangular"); lbajardsilogic@0: case HammingWindow: return tr("Hamming"); lbajardsilogic@0: case HanningWindow: return tr("Hanning"); lbajardsilogic@0: case BlackmanWindow: return tr("Blackman"); lbajardsilogic@0: case GaussianWindow: return tr("Gaussian"); lbajardsilogic@0: case ParzenWindow: return tr("Parzen"); lbajardsilogic@0: case NuttallWindow: return tr("Nuttall"); lbajardsilogic@0: case BlackmanHarrisWindow: return tr("Blackman-Harris"); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: if (name == "Resample Quality") { lbajardsilogic@0: switch (value) { lbajardsilogic@0: case 0: return tr("Fastest"); lbajardsilogic@0: case 1: return tr("Standard"); lbajardsilogic@0: case 2: return tr("Highest quality"); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: if (name == "Spectrogram Smoothing") { lbajardsilogic@0: switch (value) { lbajardsilogic@0: case NoSpectrogramSmoothing: return tr("None - blocky but accurate"); lbajardsilogic@0: case SpectrogramInterpolated: return tr("Interpolate - fast but fuzzy"); lbajardsilogic@0: case SpectrogramZeroPadded: return tr("Zero pad FFT - slow but clear"); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: return ""; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QString lbajardsilogic@0: Preferences::getPropertyContainerName() const lbajardsilogic@0: { lbajardsilogic@0: return tr("Preferences"); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: QString lbajardsilogic@0: Preferences::getPropertyContainerIconName() const lbajardsilogic@0: { lbajardsilogic@0: return "preferences"; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Preferences::setProperty(const PropertyName &name, int value) lbajardsilogic@0: { lbajardsilogic@0: if (name == "Spectrogram Smoothing") { lbajardsilogic@0: setSpectrogramSmoothing(SpectrogramSmoothing(value)); lbajardsilogic@0: } else if (name == "Tuning Frequency") { lbajardsilogic@0: //!!! lbajardsilogic@0: } else if (name == "Window Type") { lbajardsilogic@0: setWindowType(WindowType(value)); lbajardsilogic@0: } else if (name == "Resample Quality") { lbajardsilogic@0: setResampleQuality(value); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Preferences::setSpectrogramSmoothing(SpectrogramSmoothing smoothing) lbajardsilogic@0: { lbajardsilogic@0: if (m_spectrogramSmoothing != smoothing) { lbajardsilogic@0: lbajardsilogic@0: // "smoothing" is one of those words that looks increasingly lbajardsilogic@0: // ridiculous the more you see it. Smoothing smoothing smoothing. lbajardsilogic@0: m_spectrogramSmoothing = smoothing; lbajardsilogic@0: lbajardsilogic@0: QSettings settings; lbajardsilogic@0: settings.beginGroup("Preferences"); lbajardsilogic@0: settings.setValue("spectrogram-smoothing", int(smoothing)); lbajardsilogic@0: settings.endGroup(); lbajardsilogic@0: emit propertyChanged("Spectrogram Smoothing"); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Preferences::setTuningFrequency(float freq) lbajardsilogic@0: { lbajardsilogic@0: if (m_tuningFrequency != freq) { lbajardsilogic@0: m_tuningFrequency = freq; lbajardsilogic@0: QSettings settings; lbajardsilogic@0: settings.beginGroup("Preferences"); lbajardsilogic@0: settings.setValue("tuning-frequency", freq); lbajardsilogic@0: settings.endGroup(); lbajardsilogic@0: emit propertyChanged("Tuning Frequency"); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Preferences::setWindowType(WindowType type) lbajardsilogic@0: { lbajardsilogic@0: if (m_windowType != type) { lbajardsilogic@0: m_windowType = type; lbajardsilogic@0: QSettings settings; lbajardsilogic@0: settings.beginGroup("Preferences"); lbajardsilogic@0: settings.setValue("window-type", int(type)); lbajardsilogic@0: settings.endGroup(); lbajardsilogic@0: emit propertyChanged("Window Type"); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: Preferences::setResampleQuality(int q) lbajardsilogic@0: { lbajardsilogic@0: if (m_resampleQuality != q) { lbajardsilogic@0: m_resampleQuality = q; lbajardsilogic@0: QSettings settings; lbajardsilogic@0: settings.beginGroup("Preferences"); lbajardsilogic@0: settings.setValue("resample-quality", q); lbajardsilogic@0: settings.endGroup(); lbajardsilogic@0: emit propertyChanged("Resample Quality"); lbajardsilogic@0: } lbajardsilogic@0: }