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
34
35namespace drumstick { namespace widgets {
36
37const QString FluidSettingsDialog::QSTR_PREFERENCES = QStringLiteral("FluidSynth");
38const QString FluidSettingsDialog::QSTR_INSTRUMENTSDEFINITION = QStringLiteral("InstrumentsDefinition");
39const QString FluidSettingsDialog::QSTR_DATADIR = QStringLiteral("soundfonts");
40const QString FluidSettingsDialog::QSTR_DATADIR2 = QStringLiteral("sounds/sf2");
41const QString FluidSettingsDialog::QSTR_SOUNDFONT = QStringLiteral("default.sf2");
42const QString FluidSettingsDialog::QSTR_AUDIODRIVER = QStringLiteral("AudioDriver");
43const QString FluidSettingsDialog::QSTR_PERIODSIZE = QStringLiteral("PeriodSize");
44const QString FluidSettingsDialog::QSTR_PERIODS = QStringLiteral("Periods");
45const QString FluidSettingsDialog::QSTR_SAMPLERATE = QStringLiteral("SampleRate");
46const QString FluidSettingsDialog::QSTR_CHORUS = QStringLiteral("Chorus");
47const QString FluidSettingsDialog::QSTR_REVERB = QStringLiteral("Reverb");
48const QString FluidSettingsDialog::QSTR_GAIN = QStringLiteral("Gain");
49const QString FluidSettingsDialog::QSTR_POLYPHONY = QStringLiteral("Polyphony");
50const double FluidSettingsDialog::DEFAULT_SAMPLERATE = 48000.0;
51const double FluidSettingsDialog::DEFAULT_GAIN = .5;
52
53FluidSettingsDialog::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
68FluidSettingsDialog::~FluidSettingsDialog()
69{
70 delete ui;
71}
72
73void FluidSettingsDialog::accept()
74{
75 writeSettings();
76 QDialog::accept();
77}
78
79void FluidSettingsDialog::showEvent(QShowEvent *event)
80{
81 readSettings();
82 event->accept();
83}
84
85QString 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
100void 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
139void 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
179void 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
192void 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
204void 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.
Drumstick Widgets library MIDI related widgets and functions.
Drumstick common.
SettingsFactory class declaration.