Preferences.cpp
Go to the documentation of this file.
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2 
3 /*
4  Sonic Visualiser
5  An audio file viewer and annotation editor.
6  Centre for Digital Music, Queen Mary, University of London.
7  This file copyright 2006 Chris Cannam and QMUL.
8 
9  This program is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License as
11  published by the Free Software Foundation; either version 2 of the
12  License, or (at your option) any later version. See the file
13  COPYING included with this distribution for more information.
14 */
15 
16 #include "Preferences.h"
17 
18 #include "Exceptions.h"
19 
20 #include "TempDirectory.h"
21 
22 #include <QDir>
23 #include <QFileInfo>
24 #include <QMutex>
25 #include <QSettings>
26 
28 Preferences::m_instance = nullptr;
29 
32 {
33  if (!m_instance) m_instance = new Preferences();
34  return m_instance;
35 }
36 
40  m_tuningFrequency(440),
44  m_omitRecentTemps(true),
45  m_tempDirRoot(""),
47  m_recordMono(false),
48  m_resampleOnLoad(false),
49  m_gapless(true),
50  m_normaliseAudio(false),
51  m_viewFontSize(10),
54  m_showHMS(true),
55  m_octave(4),
56  m_showSplash(true)
57 {
58  QSettings settings;
59  settings.beginGroup("Preferences");
61  (settings.value("spectrogram-y-smoothing", int(m_spectrogramSmoothing)).toInt());
63  (settings.value("spectrogram-x-smoothing", int(m_spectrogramXSmoothing)).toInt());
64  m_tuningFrequency = settings.value("tuning-frequency", 440.).toDouble();
66  (settings.value("property-box-layout", int(VerticallyStacked)).toInt());
68  (settings.value("window-type", int(HanningWindow)).toInt());
69  m_runPluginsInProcess = settings.value("run-vamp-plugins-in-process", true).toBool();
70  m_fixedSampleRate = settings.value("fixed-sample-rate", 0).toDouble();
71  m_recordMono = settings.value("record-mono", false).toBool();
72  m_resampleOnLoad = settings.value("resample-on-load", false).toBool();
73  m_gapless = settings.value("gapless", true).toBool();
74  m_normaliseAudio = settings.value("normalise-audio", false).toBool();
76  (settings.value("background-mode", int(BackgroundFromTheme)).toInt());
78  (settings.value("time-to-text-mode", int(TimeToTextMs)).toInt());
79  m_showHMS = (settings.value("show-hours-minutes-seconds", true)).toBool();
80  m_octave = (settings.value("octave-of-middle-c", 4)).toInt();
81  m_viewFontSize = settings.value("view-font-size", 10).toInt();
82  m_showSplash = settings.value("show-splash", true).toBool();
83  settings.endGroup();
84 
85  settings.beginGroup("TempDirectory");
86  m_tempDirRoot = settings.value("create-in", "$HOME").toString();
87  settings.endGroup();
88 }
89 
91 {
92 }
93 
96 {
97  PropertyList props;
98  props.push_back("Spectrogram Y Smoothing");
99  props.push_back("Spectrogram X Smoothing");
100  props.push_back("Tuning Frequency");
101  props.push_back("Property Box Layout");
102  props.push_back("Window Type");
103  props.push_back("Resample Quality");
104  props.push_back("Omit Temporaries from Recent Files");
105  props.push_back("Record Mono");
106  props.push_back("Resample On Load");
107  props.push_back("Use Gapless Mode");
108  props.push_back("Normalise Audio");
109  props.push_back("Fixed Sample Rate");
110  props.push_back("Temporary Directory Root");
111  props.push_back("Background Mode");
112  props.push_back("Time To Text Mode");
113  props.push_back("Show Hours And Minutes");
114  props.push_back("Octave Numbering System");
115  props.push_back("View Font Size");
116  props.push_back("Show Splash Screen");
117  return props;
118 }
119 
120 QString
122 {
123  if (name == "Spectrogram Y Smoothing") {
124  return tr("Spectrogram y-axis interpolation:");
125  }
126  if (name == "Spectrogram X Smoothing") {
127  return tr("Spectrogram x-axis interpolation:");
128  }
129  if (name == "Tuning Frequency") {
130  return tr("Frequency of concert A");
131  }
132  if (name == "Property Box Layout") {
133  return tr("Property box layout");
134  }
135  if (name == "Window Type") {
136  return tr("Spectral analysis window shape");
137  }
138  if (name == "Resample Quality") {
139  return tr("Playback resampler type");
140  }
141  if (name == "Normalise Audio") {
142  return tr("Normalise audio signal when reading from audio file");
143  }
144  if (name == "Omit Temporaries from Recent Files") {
145  return tr("Omit temporaries from Recent Files menu");
146  }
147  if (name == "Record Mono") {
148  return tr("Mix recorded channels to mono");
149  }
150  if (name == "Resample On Load") {
151  return tr("Resample mismatching files on import");
152  }
153  if (name == "Use Gapless Mode") {
154  return tr("Load mp3 files in gapless mode");
155  }
156  if (name == "Fixed Sample Rate") {
157  return tr("Single fixed sample rate to resample all files to");
158  }
159  if (name == "Temporary Directory Root") {
160  return tr("Location for cache file directory");
161  }
162  if (name == "Background Mode") {
163  return tr("Background colour preference");
164  }
165  if (name == "Time To Text Mode") {
166  return tr("Time display precision");
167  }
168  if (name == "Show Hours And Minutes") {
169  return tr("Use hours:minutes:seconds format");
170  }
171  if (name == "Octave Numbering System") {
172  return tr("Label middle C as");
173  }
174  if (name == "View Font Size") {
175  return tr("Font size for text overlays");
176  }
177  if (name == "Show Splash Screen") {
178  return tr("Show splash screen on startup");
179  }
180  return name;
181 }
182 
185 {
186  if (name == "Spectrogram Y Smoothing") {
187  return ValueProperty;
188  }
189  if (name == "Spectrogram X Smoothing") {
190  return ValueProperty;
191  }
192  if (name == "Tuning Frequency") {
193  return RangeProperty;
194  }
195  if (name == "Property Box Layout") {
196  return ValueProperty;
197  }
198  if (name == "Window Type") {
199  return ValueProperty;
200  }
201  if (name == "Resample Quality") {
202  return ValueProperty;
203  }
204  if (name == "Normalise Audio") {
205  return ToggleProperty;
206  }
207  if (name == "Omit Temporaries from Recent Files") {
208  return ToggleProperty;
209  }
210  if (name == "Record Mono") {
211  return ToggleProperty;
212  }
213  if (name == "Resample On Load") {
214  return ToggleProperty;
215  }
216  if (name == "Use Gapless Mode") {
217  return ToggleProperty;
218  }
219  if (name == "Fixed Sample Rate") {
220  return ValueProperty;
221  }
222  if (name == "Temporary Directory Root") {
223  // It's an arbitrary string, we don't have a set of values for this
224  return InvalidProperty;
225  }
226  if (name == "Background Mode") {
227  return ValueProperty;
228  }
229  if (name == "Time To Text Mode") {
230  return ValueProperty;
231  }
232  if (name == "Show Hours And Minutes") {
233  return ToggleProperty;
234  }
235  if (name == "Octave Numbering System") {
236  return ValueProperty;
237  }
238  if (name == "View Font Size") {
239  return RangeProperty;
240  }
241  if (name == "Show Splash Screen") {
242  return ToggleProperty;
243  }
244  return InvalidProperty;
245 }
246 
247 int
249  int *min, int *max, int *deflt) const
250 {
251  if (name == "Spectrogram Y Smoothing") {
252  if (min) *min = 0;
253  if (max) *max = 1;
254  if (deflt) *deflt = int(SpectrogramInterpolated);
255  return int(m_spectrogramSmoothing);
256  }
257  if (name == "Spectrogram X Smoothing") {
258  if (min) *min = 0;
259  if (max) *max = 1;
260  if (deflt) *deflt = int(SpectrogramXInterpolated);
261  return int(m_spectrogramXSmoothing);
262  }
263 
265 
266  if (name == "Property Box Layout") {
267  if (min) *min = 0;
268  if (max) *max = 1;
269  if (deflt) *deflt = 0;
270  return m_propertyBoxLayout == Layered ? 1 : 0;
271  }
272 
273  if (name == "Window Type") {
274  if (min) *min = int(RectangularWindow);
275  if (max) *max = int(BlackmanHarrisWindow);
276  if (deflt) *deflt = int(HanningWindow);
277  return int(m_windowType);
278  }
279 
280  if (name == "Run Vamp Plugins In Process") {
281  return m_runPluginsInProcess;
282  }
283 
284  if (name == "Omit Temporaries from Recent Files") {
285  if (deflt) *deflt = 1;
286  return m_omitRecentTemps ? 1 : 0;
287  }
288 
289  if (name == "Background Mode") {
290  if (min) *min = 0;
291  if (max) *max = 2;
292  if (deflt) *deflt = 0;
293  return int(m_backgroundMode);
294  }
295 
296  if (name == "Time To Text Mode") {
297  if (min) *min = 0;
298  if (max) *max = 6;
299  if (deflt) *deflt = 0;
300  return int(m_timeToTextMode);
301  }
302 
303  if (name == "Show Hours And Minutes") {
304  if (deflt) *deflt = 1;
305  return m_showHMS ? 1 : 0;
306  }
307 
308  if (name == "Octave Numbering System") {
309  // we don't support arbitrary octaves in the gui, because we
310  // want to be able to label what the octave system comes
311  // from. so we support 0, 3, 4 and 5.
312  if (min) *min = 0;
313  if (max) *max = 3;
314  if (deflt) *deflt = 2;
316  }
317 
318  if (name == "View Font Size") {
319  if (min) *min = 3;
320  if (max) *max = 48;
321  if (deflt) *deflt = 10;
322  return int(m_viewFontSize);
323  }
324 
325  if (name == "Show Splash Screen") {
326  if (deflt) *deflt = 1;
327  return m_showSplash ? 1 : 0;
328  }
329 
330  return 0;
331 }
332 
333 QString
335  int value) const
336 {
337  if (name == "Property Box Layout") {
338  if (value == 0) return tr("Show boxes for all panes");
339  else return tr("Show box for current pane only");
340  }
341  if (name == "Window Type") {
342  switch (WindowType(value)) {
343  case RectangularWindow: return tr("Rectangular");
344  case BartlettWindow: return tr("Triangular");
345  case HammingWindow: return tr("Hamming");
346  case HanningWindow: return tr("Hann");
347  case BlackmanWindow: return tr("Blackman");
348  case GaussianWindow: return tr("Gaussian");
349  case ParzenWindow: return tr("Parzen");
350  case NuttallWindow: return tr("Nuttall");
351  case BlackmanHarrisWindow: return tr("Blackman-Harris");
352  }
353  }
354  if (name == "Resample Quality") {
355  switch (value) {
356  case 0: return tr("Fastest");
357  case 1: return tr("Standard");
358  case 2: return tr("Highest quality");
359  }
360  }
361  if (name == "Spectrogram Y Smoothing") {
362  switch (value) {
363  case NoSpectrogramSmoothing: return tr("None");
364  case SpectrogramInterpolated: return tr("Linear interpolation");
365  }
366  }
367  if (name == "Spectrogram X Smoothing") {
368  switch (value) {
369  case NoSpectrogramXSmoothing: return tr("None");
370  case SpectrogramXInterpolated: return tr("Linear interpolation");
371  }
372  }
373  if (name == "Background Mode") {
374  switch (value) {
375  case BackgroundFromTheme: return tr("Follow desktop theme");
376  case DarkBackground: return tr("Dark background");
377  case LightBackground: return tr("Light background");
378  }
379  }
380  if (name == "Time To Text Mode") {
381  switch (value) {
382  case TimeToTextMs: return tr("Standard (to millisecond)");
383  case TimeToTextUs: return tr("High resolution (to microsecond)");
384  case TimeToText24Frame: return tr("24 FPS");
385  case TimeToText25Frame: return tr("25 FPS");
386  case TimeToText30Frame: return tr("30 FPS");
387  case TimeToText50Frame: return tr("50 FPS");
388  case TimeToText60Frame: return tr("60 FPS");
389  }
390  }
391  if (name == "Octave Numbering System") {
392  switch (value) {
393  case C0_Centre: return tr("C0 - middle of octave scale");
394  case C3_Logic: return tr("C3 - common MIDI sequencer convention");
395  case C4_ASA: return tr("C4 - ASA American standard");
396  case C5_Sonar: return tr("C5 - used in Cakewalk and others");
397  }
398  }
399 
400  return "";
401 }
402 
403 QString
405 {
406  return tr("Preferences");
407 }
408 
409 QString
411 {
412  return "preferences";
413 }
414 
415 void
416 Preferences::setProperty(const PropertyName &name, int value)
417 {
418  if (name == "Spectrogram Y Smoothing") {
420  } else if (name == "Spectrogram X Smoothing") {
422  } else if (name == "Tuning Frequency") {
424  } else if (name == "Property Box Layout") {
426  } else if (name == "Window Type") {
427  setWindowType(WindowType(value));
428  } else if (name == "Run Vamp Plugins In Process") {
429  setRunPluginsInProcess(value ? true : false);
430  } else if (name == "Omit Temporaries from Recent Files") {
431  setOmitTempsFromRecentFiles(value ? true : false);
432  } else if (name == "Background Mode") {
434  } else if (name == "Time To Text Mode") {
436  } else if (name == "Show Hours And Minutes") {
437  setShowHMS(value ? true : false);
438  } else if (name == "Octave Numbering System") {
440  (OctaveNumberingSystem(value)));
441  } else if (name == "View Font Size") {
442  setViewFontSize(value);
443  } else if (name == "Show Splash Screen") {
444  setShowSplash(value ? true : false);
445  }
446 }
447 
448 void
450 {
451  if (m_spectrogramSmoothing != smoothing) {
452 
453  // "smoothing" is one of those words that looks increasingly
454  // ridiculous the more you see it. Smoothing smoothing smoothing.
455  m_spectrogramSmoothing = smoothing;
456 
457  QSettings settings;
458  settings.beginGroup("Preferences");
459  settings.setValue("spectrogram-y-smoothing", int(smoothing));
460  settings.endGroup();
461  emit propertyChanged("Spectrogram Y Smoothing");
462  }
463 }
464 
465 void
467 {
468  if (m_spectrogramXSmoothing != smoothing) {
469 
470  // "smoothing" is one of those words that looks increasingly
471  // ridiculous the more you see it. Smoothing smoothing smoothing.
472  m_spectrogramXSmoothing = smoothing;
473 
474  QSettings settings;
475  settings.beginGroup("Preferences");
476  settings.setValue("spectrogram-x-smoothing", int(smoothing));
477  settings.endGroup();
478  emit propertyChanged("Spectrogram X Smoothing");
479  }
480 }
481 
482 void
484 {
485  if (m_tuningFrequency != freq) {
486  m_tuningFrequency = freq;
487  QSettings settings;
488  settings.beginGroup("Preferences");
489  settings.setValue("tuning-frequency", freq);
490  settings.endGroup();
491  emit propertyChanged("Tuning Frequency");
492  }
493 }
494 
495 void
497 {
498  if (m_propertyBoxLayout != layout) {
499  m_propertyBoxLayout = layout;
500  QSettings settings;
501  settings.beginGroup("Preferences");
502  settings.setValue("property-box-layout", int(layout));
503  settings.endGroup();
504  emit propertyChanged("Property Box Layout");
505  }
506 }
507 
508 void
510 {
511  if (m_windowType != type) {
512  m_windowType = type;
513  QSettings settings;
514  settings.beginGroup("Preferences");
515  settings.setValue("window-type", int(type));
516  settings.endGroup();
517  emit propertyChanged("Window Type");
518  }
519 }
520 
521 void
523 {
524  if (m_runPluginsInProcess != run) {
525  m_runPluginsInProcess = run;
526  QSettings settings;
527  settings.beginGroup("Preferences");
528  settings.setValue("run-vamp-plugins-in-process", run);
529  settings.endGroup();
530  emit propertyChanged("Run Vamp Plugins In Process");
531  }
532 }
533 
534 void
536 {
537  if (m_omitRecentTemps != omit) {
538  m_omitRecentTemps = omit;
539  QSettings settings;
540  settings.beginGroup("Preferences");
541  settings.setValue("omit-recent-temporaries", omit);
542  settings.endGroup();
543  emit propertyChanged("Omit Temporaries from Recent Files");
544  }
545 }
546 
547 void
549 {
550  if (root == QDir::home().absolutePath()) {
551  root = "$HOME";
552  }
553  if (m_tempDirRoot != root) {
554  m_tempDirRoot = root;
555  QSettings settings;
556  settings.beginGroup("TempDirectory");
557  settings.setValue("create-in", root);
558  settings.endGroup();
559  emit propertyChanged("Temporary Directory Root");
560  }
561 }
562 
563 void
565 {
566  if (m_recordMono != mono) {
567  m_recordMono = mono;
568  QSettings settings;
569  settings.beginGroup("Preferences");
570  settings.setValue("record-mono", mono);
571  settings.endGroup();
572  emit propertyChanged("Record Mono");
573  }
574 }
575 
576 void
578 {
579  if (m_resampleOnLoad != resample) {
580  m_resampleOnLoad = resample;
581  QSettings settings;
582  settings.beginGroup("Preferences");
583  settings.setValue("resample-on-load", resample);
584  settings.endGroup();
585  emit propertyChanged("Resample On Load");
586  }
587 }
588 
589 void
591 {
592  if (m_gapless != gapless) {
593  m_gapless = gapless;
594  QSettings settings;
595  settings.beginGroup("Preferences");
596  settings.setValue("gapless", gapless);
597  settings.endGroup();
598  emit propertyChanged("Use Gapless Mode");
599  }
600 }
601 
602 void
604 {
605  if (m_fixedSampleRate != rate) {
606  m_fixedSampleRate = rate;
607  QSettings settings;
608  settings.beginGroup("Preferences");
609  settings.setValue("fixed-sample-rate", rate);
610  settings.endGroup();
611  emit propertyChanged("Fixed Sample Rate");
612  }
613 }
614 
615 void
617 {
618  if (m_normaliseAudio != norm) {
619  m_normaliseAudio = norm;
620  QSettings settings;
621  settings.beginGroup("Preferences");
622  settings.setValue("normalise-audio", norm);
623  settings.endGroup();
624  emit propertyChanged("Normalise Audio");
625  }
626 }
627 
628 void
630 {
631  if (m_backgroundMode != mode) {
632 
633  m_backgroundMode = mode;
634 
635  QSettings settings;
636  settings.beginGroup("Preferences");
637  settings.setValue("background-mode", int(mode));
638  settings.endGroup();
639  emit propertyChanged("Background Mode");
640  }
641 }
642 
643 void
645 {
646  if (m_timeToTextMode != mode) {
647 
648  m_timeToTextMode = mode;
649 
650  QSettings settings;
651  settings.beginGroup("Preferences");
652  settings.setValue("time-to-text-mode", int(mode));
653  settings.endGroup();
654  emit propertyChanged("Time To Text Mode");
655  }
656 }
657 
658 void
660 {
661  if (m_showHMS != show) {
662 
663  m_showHMS = show;
664 
665  QSettings settings;
666  settings.beginGroup("Preferences");
667  settings.setValue("show-hours-minutes-seconds", show);
668  settings.endGroup();
669  emit propertyChanged("Show Hours And Minutes");
670  }
671 }
672 
673 void
675 {
676  if (m_octave != oct) {
677 
678  m_octave = oct;
679 
680  QSettings settings;
681  settings.beginGroup("Preferences");
682  settings.setValue("octave-of-middle-c", int(oct));
683  settings.endGroup();
684  emit propertyChanged("Octave Numbering System");
685  }
686 }
687 
688 int
690 {
691  switch (s) {
692  case C0_Centre: return 0;
693  case C3_Logic: return 3;
694  case C4_ASA: return 4;
695  case C5_Sonar: return 5;
696  default: return 4;
697  }
698 }
699 
702 {
703  switch (o) {
704  case 0: return C0_Centre;
705  case 3: return C3_Logic;
706  case 4: return C4_ASA;
707  case 5: return C5_Sonar;
708  default: return C4_ASA;
709  }
710 }
711 
712 void
714 {
715  if (m_viewFontSize != size) {
716 
717  m_viewFontSize = size;
718 
719  QSettings settings;
720  settings.beginGroup("Preferences");
721  settings.setValue("view-font-size", size);
722  settings.endGroup();
723  emit propertyChanged("View Font Size");
724  }
725 }
726 
727 void
729 {
730  if (m_showSplash != show) {
731 
732  m_showSplash = show;
733 
734  QSettings settings;
735  settings.beginGroup("Preferences");
736  settings.setValue("show-splash", show);
737  settings.endGroup();
738  emit propertyChanged("Show Splash Screen");
739  }
740 }
741 
int m_viewFontSize
Definition: Preferences.h:169
double sv_samplerate_t
Sample rate.
Definition: BaseTypes.h:51
void setOctaveOfMiddleC(int oct)
void setResampleOnLoad(bool)
bool m_gapless
Definition: Preferences.h:167
SpectrogramSmoothing m_spectrogramSmoothing
Definition: Preferences.h:156
void setFixedSampleRate(sv_samplerate_t)
PropertyList getProperties() const override
Get a list of the names of all the supported properties on this container.
Definition: Preferences.cpp:95
virtual ~Preferences()
Definition: Preferences.cpp:90
void propertyChanged(PropertyContainer::PropertyName)
PropertyBoxLayout m_propertyBoxLayout
Definition: Preferences.h:159
QString getPropertyValueLabel(const PropertyName &, int value) const override
If the given property is a ValueProperty, return the display label to be used for the given value for...
int getPropertyRangeAndValue(const PropertyName &, int *, int *, int *) const override
Return the minimum and maximum values for the given property and its current value in this container...
bool m_resampleOnLoad
Definition: Preferences.h:166
void setSpectrogramXSmoothing(SpectrogramXSmoothing smoothing)
QString getPropertyContainerIconName() const override
void setRecordMono(bool)
bool m_showSplash
Definition: Preferences.h:174
static Preferences * getInstance()
Definition: Preferences.cpp:31
void setShowSplash(bool)
bool m_omitRecentTemps
Definition: Preferences.h:162
void setUseGaplessMode(bool)
sv_samplerate_t m_fixedSampleRate
Definition: Preferences.h:164
WindowType
Definition: Window.h:30
void setTimeToTextMode(TimeToTextMode mode)
void setNormaliseAudio(bool)
void setWindowType(WindowType type)
SpectrogramXSmoothing m_spectrogramXSmoothing
Definition: Preferences.h:157
static int getOctaveOfMiddleCInSystem(OctaveNumberingSystem s)
void setSpectrogramSmoothing(SpectrogramSmoothing smoothing)
WindowType m_windowType
Definition: Preferences.h:160
void setOmitTempsFromRecentFiles(bool omit)
BackgroundMode m_backgroundMode
Definition: Preferences.h:170
PropertyBoxLayout
!! harmonise with PaneStack
Definition: Preferences.h:56
void setProperty(const PropertyName &, int) override
static Preferences * m_instance
Definition: Preferences.h:141
void setPropertyBoxLayout(PropertyBoxLayout layout)
void setTemporaryDirectoryRoot(QString tempDirRoot)
QString getPropertyContainerName() const override
PropertyType getPropertyType(const PropertyName &) const override
Return the type of the given property, or InvalidProperty if the property is not supported on this co...
static OctaveNumberingSystem getSystemWithMiddleCInOctave(int o)
void setShowHMS(bool show)
bool m_showHMS
Definition: Preferences.h:172
void setViewFontSize(int size)
double m_tuningFrequency
Definition: Preferences.h:158
bool m_normaliseAudio
Definition: Preferences.h:168
std::vector< PropertyName > PropertyList
void setRunPluginsInProcess(bool r)
TimeToTextMode m_timeToTextMode
Definition: Preferences.h:171
QString m_tempDirRoot
Definition: Preferences.h:163
bool m_runPluginsInProcess
Definition: Preferences.h:161
QString getPropertyLabel(const PropertyName &) const override
Return the human-readable (and i18n&#39;ised) name of a property.
void setBackgroundMode(BackgroundMode mode)
void setTuningFrequency(double freq)
bool m_recordMono
Definition: Preferences.h:165