drumstick  2.0.0
fluidsettingsdialog.cpp
Go to the documentation of this file.
1 /*
2  Drumstick MIDI Sequencer C++ library
3  Copyright (C) 2006-2020, Pedro Lopez-Cabanillas <plcl@users.sf.net>
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 3 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #include <QDir>
20 #include <QFileDialog>
21 #include <QFileInfo>
22 #include <QPushButton>
23 #include <QStandardPaths>
24 #include <QToolButton>
25 
26 #include "fluidsettingsdialog.h"
27 #include "ui_fluidsettingsdialog.h"
29 
35 namespace drumstick { namespace widgets {
36 
37 const QString FluidSettingsDialog::QSTR_PREFERENCES = QStringLiteral("FluidSynth");
38 const QString FluidSettingsDialog::QSTR_INSTRUMENTSDEFINITION = QStringLiteral("InstrumentsDefinition");
39 const QString FluidSettingsDialog::QSTR_DATADIR = QStringLiteral("soundfonts");
40 const QString FluidSettingsDialog::QSTR_DATADIR2 = QStringLiteral("sounds/sf2");
41 const QString FluidSettingsDialog::QSTR_SOUNDFONT = QStringLiteral("default.sf2");
42 const QString FluidSettingsDialog::QSTR_AUDIODRIVER = QStringLiteral("AudioDriver");
43 const QString FluidSettingsDialog::QSTR_PERIODSIZE = QStringLiteral("PeriodSize");
44 const QString FluidSettingsDialog::QSTR_PERIODS = QStringLiteral("Periods");
45 const QString FluidSettingsDialog::QSTR_SAMPLERATE = QStringLiteral("SampleRate");
46 const QString FluidSettingsDialog::QSTR_CHORUS = QStringLiteral("Chorus");
47 const QString FluidSettingsDialog::QSTR_REVERB = QStringLiteral("Reverb");
48 const QString FluidSettingsDialog::QSTR_GAIN = QStringLiteral("Gain");
49 const QString FluidSettingsDialog::QSTR_POLYPHONY = QStringLiteral("Polyphony");
50 const double FluidSettingsDialog::DEFAULT_SAMPLERATE = 48000.0;
51 const double FluidSettingsDialog::DEFAULT_GAIN = .5;
52 
53 FluidSettingsDialog::FluidSettingsDialog(QWidget *parent) :
54  QDialog(parent),
55  ui(new Ui::FluidSettingsDialog)
56 {
57  ui->setupUi(this);
58  connect(ui->btnFile, &QToolButton::clicked, this, &FluidSettingsDialog::showFileDialog);
59  connect(ui->buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked,
60  this, &FluidSettingsDialog::restoreDefaults);
61  ui->periodSize->setValidator(new QIntValidator(64, 8192, this));
62  ui->periods->setValidator(new QIntValidator(2, 64, this));
63  ui->sampleRate->setValidator(new QDoubleValidator(22050.0, 96000.0, 1, this));
64  ui->gain->setValidator(new QDoubleValidator(0.0, 10.0, 2, this));
65  ui->polyphony->setValidator(new QIntValidator(16, 4096, this));
66 }
67 
68 FluidSettingsDialog::~FluidSettingsDialog()
69 {
70  delete ui;
71 }
72 
73 void FluidSettingsDialog::accept()
74 {
75  writeSettings();
76  QDialog::accept();
77 }
78 
79 void FluidSettingsDialog::showEvent(QShowEvent *event)
80 {
81  readSettings();
82  event->accept();
83 }
84 
85 QString FluidSettingsDialog::defaultAudioDriver() const
86 {
87  const QString QSTR_DEFAULT_AUDIODRIVER =
88 #if defined(Q_OS_LINUX)
89  QLatin1Literal("pulseaudio");
90 #elif defined(Q_OS_WIN)
91  QLatin1Literal("dsound");
92 #elif defined(Q_OS_OSX)
93  QLatin1Literal("coreaudio");
94 #else
95  QLatin1Literal("oss");
96 #endif
97  return QSTR_DEFAULT_AUDIODRIVER;
98 }
99 
100 void FluidSettingsDialog::readSettings()
101 {
102  SettingsFactory settings;
103  QStringList drivers;
104  QString fs_defSoundFont = QSTR_SOUNDFONT;
105 #if defined(Q_OS_LINUX)
106  drivers << "alsa" << "pulseaudio" << "oss";
107 #elif defined(Q_OS_WIN)
108  drivers << "dsound";
109 #elif defined(Q_OS_OSX)
110  drivers << "coreaudio";
111 #else
112  drivers << "oss";
113 #endif
114 
115  QDir dir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR, QStandardPaths::LocateDirectory));
116  if (!dir.exists()) {
117  dir = QDir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR2, QStandardPaths::LocateDirectory));
118  }
119  QFileInfo sf2(dir, QSTR_SOUNDFONT);
120  if (sf2.exists()) {
121  fs_defSoundFont = sf2.absoluteFilePath();
122  }
123 
124  ui->audioDriver->addItems(drivers);
125 
126  settings->beginGroup(QSTR_PREFERENCES);
127  ui->audioDriver->setCurrentText( settings->value(QSTR_AUDIODRIVER, defaultAudioDriver()).toString() );
128  ui->periodSize->setText( settings->value(QSTR_PERIODSIZE, DEFAULT_PERIODSIZE).toString() );
129  ui->periods->setText( settings->value(QSTR_PERIODS, DEFAULT_PERIODS).toString() );
130  ui->sampleRate->setText( settings->value(QSTR_SAMPLERATE, DEFAULT_SAMPLERATE).toString() );
131  ui->chorus->setChecked( settings->value(QSTR_CHORUS, DEFAULT_CHORUS).toInt() != 0 );
132  ui->reverb->setChecked( settings->value(QSTR_REVERB, DEFAULT_REVERB).toInt() != 0 );
133  ui->gain->setText( settings->value(QSTR_GAIN, DEFAULT_GAIN).toString() );
134  ui->polyphony->setText( settings->value(QSTR_POLYPHONY, DEFAULT_POLYPHONY).toString() );
135  ui->soundFont->setText( settings->value(QSTR_INSTRUMENTSDEFINITION, fs_defSoundFont).toString() );
136  settings->endGroup();
137 }
138 
139 void FluidSettingsDialog::writeSettings()
140 {
141  SettingsFactory settings;
142  QString audioDriver;
143  QString soundFont(QSTR_SOUNDFONT);
144  int periodSize(DEFAULT_PERIODSIZE);
145  int periods(DEFAULT_PERIODS);
146  double sampleRate(DEFAULT_SAMPLERATE);
147  int chorus(DEFAULT_CHORUS);
148  int reverb(DEFAULT_REVERB);
149  double gain(DEFAULT_GAIN);
150  int polyphony(DEFAULT_POLYPHONY);
151 
152  audioDriver = ui->audioDriver->currentText();
153  if (audioDriver.isEmpty()) {
154  audioDriver = defaultAudioDriver();
155  }
156  soundFont = ui->soundFont->text();
157  periodSize = ui->periodSize->text().toInt();
158  periods = ui->periods->text().toInt();
159  sampleRate = ui->sampleRate->text().toDouble();
160  chorus = (ui->chorus->isChecked() ? 1 : 0);
161  reverb = (ui->reverb->isChecked() ? 1 : 0);
162  gain = ui->gain->text().toDouble();
163  polyphony = ui->polyphony->text().toInt();
164 
165  settings->beginGroup(QSTR_PREFERENCES);
166  settings->setValue(QSTR_INSTRUMENTSDEFINITION, soundFont);
167  settings->setValue(QSTR_AUDIODRIVER, audioDriver);
168  settings->setValue(QSTR_PERIODSIZE, periodSize);
169  settings->setValue(QSTR_PERIODS, periods);
170  settings->setValue(QSTR_SAMPLERATE, sampleRate);
171  settings->setValue(QSTR_CHORUS, chorus);
172  settings->setValue(QSTR_REVERB, reverb);
173  settings->setValue(QSTR_GAIN, gain);
174  settings->setValue(QSTR_POLYPHONY, polyphony);
175  settings->endGroup();
176  settings->sync();
177 }
178 
179 void FluidSettingsDialog::restoreDefaults()
180 {
181  ui->audioDriver->setCurrentText( defaultAudioDriver() );
182  ui->periodSize->setText( QString::number( DEFAULT_PERIODSIZE ));
183  ui->periods->setText( QString::number( DEFAULT_PERIODS ));
184  ui->sampleRate->setText( QString::number( DEFAULT_SAMPLERATE ));
185  ui->chorus->setChecked( DEFAULT_CHORUS != 0 );
186  ui->reverb->setChecked( DEFAULT_REVERB != 0 );
187  ui->gain->setText( QString::number( DEFAULT_GAIN ) );
188  ui->polyphony->setText( QString::number( DEFAULT_POLYPHONY ));
189  ui->soundFont->setText( QSTR_SOUNDFONT );
190 }
191 
192 void FluidSettingsDialog::showFileDialog()
193 {
194  QDir dir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR, QStandardPaths::LocateDirectory));
195  if (!dir.exists()) {
196  dir = QDir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR2, QStandardPaths::LocateDirectory));
197  }
198  QString fileName = QFileDialog::getOpenFileName(this, tr("Select SoundFont"), dir.absolutePath(), tr("SoundFont Files (*.sf2)"));
199  if (!fileName.isEmpty()) {
200  ui->soundFont->setText(fileName);
201  }
202 }
203 
204 void FluidSettingsDialog::changeSoundFont(const QString& fileName)
205 {
206  readSettings();
207  ui->soundFont->setText(fileName);
208  writeSettings();
209 }
210 
211 } // namespace widgets
212 } // namespace drumstick
Declaration of the Fluidsynth configuration dialog.
void DRUMSTICK_EXPORT changeSoundFont(const QString driver, const QString fileName, QWidget *parent=nullptr)
Changes the sound font configuration Some RT output drivers accept soundfonts.
Drumstick common.
Definition: alsaclient.cpp:68
SettingsFactory class declaration.