drumstick  2.2.0
fluidsettingsdialog.cpp
Go to the documentation of this file.
1 /*
2  Drumstick MIDI Sequencer C++ library
3  Copyright (C) 2006-2021, 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"
30 
36 namespace drumstick { namespace widgets {
37 
38 const QString FluidSettingsDialog::QSTR_PREFERENCES = QStringLiteral("FluidSynth");
39 const QString FluidSettingsDialog::QSTR_INSTRUMENTSDEFINITION = QStringLiteral("InstrumentsDefinition");
40 const QString FluidSettingsDialog::QSTR_DATADIR = QStringLiteral("soundfonts");
41 const QString FluidSettingsDialog::QSTR_DATADIR2 = QStringLiteral("sounds/sf2");
42 const QString FluidSettingsDialog::QSTR_SOUNDFONT = QStringLiteral("default.sf2");
43 const QString FluidSettingsDialog::QSTR_AUDIODRIVER = QStringLiteral("AudioDriver");
44 const QString FluidSettingsDialog::QSTR_PERIODSIZE = QStringLiteral("PeriodSize");
45 const QString FluidSettingsDialog::QSTR_PERIODS = QStringLiteral("Periods");
46 const QString FluidSettingsDialog::QSTR_SAMPLERATE = QStringLiteral("SampleRate");
47 const QString FluidSettingsDialog::QSTR_CHORUS = QStringLiteral("Chorus");
48 const QString FluidSettingsDialog::QSTR_REVERB = QStringLiteral("Reverb");
49 const QString FluidSettingsDialog::QSTR_GAIN = QStringLiteral("Gain");
50 const QString FluidSettingsDialog::QSTR_POLYPHONY = QStringLiteral("Polyphony");
51 const double FluidSettingsDialog::DEFAULT_SAMPLERATE = 48000.0;
52 const double FluidSettingsDialog::DEFAULT_GAIN = .5;
53 
54 FluidSettingsDialog::FluidSettingsDialog(QWidget *parent) :
55  QDialog(parent),
56  ui(new Ui::FluidSettingsDialog)
57 {
58  ui->setupUi(this);
59  connect(ui->btnFile, &QToolButton::clicked, this, &FluidSettingsDialog::showFileDialog);
60  connect(ui->buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked,
61  this, &FluidSettingsDialog::restoreDefaults);
62  ui->periodSize->setValidator(new QIntValidator(64, 8192, this));
63  ui->periods->setValidator(new QIntValidator(2, 64, this));
64  ui->sampleRate->setValidator(new QDoubleValidator(22050.0, 96000.0, 1, this));
65  ui->gain->setValidator(new QDoubleValidator(0.0, 10.0, 2, this));
66  ui->polyphony->setValidator(new QIntValidator(16, 4096, this));
67 
68  SettingsFactory settings;
70  m_driver = man.outputBackendByName("FluidSynth");
71  if (m_driver != nullptr) {
72  m_driver->initialize(settings.getQSettings());
73  }
74 }
75 
76 FluidSettingsDialog::~FluidSettingsDialog()
77 {
78  delete ui;
79 }
80 
81 void FluidSettingsDialog::accept()
82 {
83  writeSettings();
84  QDialog::accept();
85 }
86 
87 void FluidSettingsDialog::showEvent(QShowEvent *event)
88 {
89  readSettings();
90  event->accept();
91 }
92 
93 QString FluidSettingsDialog::defaultAudioDriver() const
94 {
95  const QString QSTR_DEFAULT_AUDIODRIVER =
96 #if defined(Q_OS_LINUX)
97  QLatin1Literal("pulseaudio");
98 #elif defined(Q_OS_WIN)
99  QLatin1Literal("dsound");
100 #elif defined(Q_OS_OSX)
101  QLatin1Literal("coreaudio");
102 #else
103  QLatin1Literal("oss");
104 #endif
105  return QSTR_DEFAULT_AUDIODRIVER;
106 }
107 
108 void FluidSettingsDialog::readSettings()
109 {
110  SettingsFactory settings;
111  QString fs_defSoundFont = QSTR_SOUNDFONT;
112  QDir dir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR, QStandardPaths::LocateDirectory));
113  if (!dir.exists()) {
114  dir = QDir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR2, QStandardPaths::LocateDirectory));
115  }
116  QFileInfo sf2(dir, QSTR_SOUNDFONT);
117  if (sf2.exists()) {
118  fs_defSoundFont = sf2.absoluteFilePath();
119  }
120 
121  if (m_driver != nullptr) {
122  QVariant drivers = m_driver->property("audiodrivers");
123  if (drivers.isValid()) {
124  ui->audioDriver->clear();
125  ui->audioDriver->addItems(drivers.toStringList());
126  }
127  }
128 
129  settings->beginGroup(QSTR_PREFERENCES);
130  ui->audioDriver->setCurrentText( settings->value(QSTR_AUDIODRIVER, defaultAudioDriver()).toString() );
131  ui->periodSize->setText( settings->value(QSTR_PERIODSIZE, DEFAULT_PERIODSIZE).toString() );
132  ui->periods->setText( settings->value(QSTR_PERIODS, DEFAULT_PERIODS).toString() );
133  ui->sampleRate->setText( settings->value(QSTR_SAMPLERATE, DEFAULT_SAMPLERATE).toString() );
134  ui->chorus->setChecked( settings->value(QSTR_CHORUS, DEFAULT_CHORUS).toInt() != 0 );
135  ui->reverb->setChecked( settings->value(QSTR_REVERB, DEFAULT_REVERB).toInt() != 0 );
136  ui->gain->setText( settings->value(QSTR_GAIN, DEFAULT_GAIN).toString() );
137  ui->polyphony->setText( settings->value(QSTR_POLYPHONY, DEFAULT_POLYPHONY).toString() );
138  ui->soundFont->setText( settings->value(QSTR_INSTRUMENTSDEFINITION, fs_defSoundFont).toString() );
139  settings->endGroup();
140 }
141 
142 void FluidSettingsDialog::writeSettings()
143 {
144  SettingsFactory settings;
145  QString audioDriver;
146  QString soundFont(QSTR_SOUNDFONT);
147  int periodSize(DEFAULT_PERIODSIZE);
148  int periods(DEFAULT_PERIODS);
149  double sampleRate(DEFAULT_SAMPLERATE);
150  int chorus(DEFAULT_CHORUS);
151  int reverb(DEFAULT_REVERB);
152  double gain(DEFAULT_GAIN);
153  int polyphony(DEFAULT_POLYPHONY);
154 
155  audioDriver = ui->audioDriver->currentText();
156  if (audioDriver.isEmpty()) {
157  audioDriver = defaultAudioDriver();
158  }
159  soundFont = ui->soundFont->text();
160  periodSize = ui->periodSize->text().toInt();
161  periods = ui->periods->text().toInt();
162  sampleRate = ui->sampleRate->text().toDouble();
163  chorus = (ui->chorus->isChecked() ? 1 : 0);
164  reverb = (ui->reverb->isChecked() ? 1 : 0);
165  gain = ui->gain->text().toDouble();
166  polyphony = ui->polyphony->text().toInt();
167 
168  settings->beginGroup(QSTR_PREFERENCES);
169  settings->setValue(QSTR_INSTRUMENTSDEFINITION, soundFont);
170  settings->setValue(QSTR_AUDIODRIVER, audioDriver);
171  settings->setValue(QSTR_PERIODSIZE, periodSize);
172  settings->setValue(QSTR_PERIODS, periods);
173  settings->setValue(QSTR_SAMPLERATE, sampleRate);
174  settings->setValue(QSTR_CHORUS, chorus);
175  settings->setValue(QSTR_REVERB, reverb);
176  settings->setValue(QSTR_GAIN, gain);
177  settings->setValue(QSTR_POLYPHONY, polyphony);
178  settings->endGroup();
179  settings->sync();
180 }
181 
182 void FluidSettingsDialog::restoreDefaults()
183 {
184  ui->audioDriver->setCurrentText( defaultAudioDriver() );
185  ui->periodSize->setText( QString::number( DEFAULT_PERIODSIZE ));
186  ui->periods->setText( QString::number( DEFAULT_PERIODS ));
187  ui->sampleRate->setText( QString::number( DEFAULT_SAMPLERATE ));
188  ui->chorus->setChecked( DEFAULT_CHORUS != 0 );
189  ui->reverb->setChecked( DEFAULT_REVERB != 0 );
190  ui->gain->setText( QString::number( DEFAULT_GAIN ) );
191  ui->polyphony->setText( QString::number( DEFAULT_POLYPHONY ));
192  ui->soundFont->setText( QSTR_SOUNDFONT );
193 }
194 
195 void FluidSettingsDialog::showFileDialog()
196 {
197  QDir dir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR, QStandardPaths::LocateDirectory));
198  if (!dir.exists()) {
199  dir = QDir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR2, QStandardPaths::LocateDirectory));
200  }
201  QString fileName = QFileDialog::getOpenFileName(this, tr("Select SoundFont"), dir.absolutePath(), tr("SoundFont Files (*.sf2)"));
202  if (!fileName.isEmpty()) {
203  ui->soundFont->setText(fileName);
204  }
205 }
206 
207 void FluidSettingsDialog::changeSoundFont(const QString& fileName)
208 {
209  readSettings();
210  ui->soundFont->setText(fileName);
211  writeSettings();
212 }
213 
214 } // namespace widgets
215 } // namespace drumstick
BackendManager class declaration.
The BackendManager class manages lists of dynamic and static backends for applications based on drums...
MIDIOutput * outputBackendByName(const QString name)
outputBackendByName
virtual void initialize(QSettings *settings)=0
initialize
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.