23#include <QStandardPaths>
28#include "ui_fluidsettingsdialog.h"
39const QString FluidSettingsDialog::QSTR_PREFERENCES = QStringLiteral(
"FluidSynth");
40const QString FluidSettingsDialog::QSTR_INSTRUMENTSDEFINITION = QStringLiteral(
"InstrumentsDefinition");
41const QString FluidSettingsDialog::QSTR_DATADIR = QStringLiteral(
"soundfonts");
42const QString FluidSettingsDialog::QSTR_DATADIR2 = QStringLiteral(
"sounds/sf2");
43const QString FluidSettingsDialog::QSTR_SOUNDFONT = QStringLiteral(
"default.sf2");
44const QString FluidSettingsDialog::QSTR_AUDIODRIVER = QStringLiteral(
"AudioDriver");
45const QString FluidSettingsDialog::QSTR_PERIODSIZE = QStringLiteral(
"PeriodSize");
46const QString FluidSettingsDialog::QSTR_PERIODS = QStringLiteral(
"Periods");
47const QString FluidSettingsDialog::QSTR_SAMPLERATE = QStringLiteral(
"SampleRate");
48const QString FluidSettingsDialog::QSTR_CHORUS = QStringLiteral(
"Chorus");
49const QString FluidSettingsDialog::QSTR_REVERB = QStringLiteral(
"Reverb");
50const QString FluidSettingsDialog::QSTR_GAIN = QStringLiteral(
"Gain");
51const QString FluidSettingsDialog::QSTR_POLYPHONY = QStringLiteral(
"Polyphony");
52const QString FluidSettingsDialog::QSTR_BUFFERTIME = QStringLiteral(
"BufferTime");
53const QString FluidSettingsDialog::QSTR_PULSEAUDIO = QStringLiteral(
"pulseaudio");
55FluidSettingsDialog::FluidSettingsDialog(QWidget *parent) :
57 ui(new Ui::FluidSettingsDialog)
60 connect(ui->audioDriver, &QComboBox::currentTextChanged,
this, &FluidSettingsDialog::audioDriverChanged);
61 connect(ui->bufferTime, QOverload<int>::of(&QSpinBox::valueChanged),
this, &FluidSettingsDialog::bufferTimeChanged);
62 connect(ui->periodSize, QOverload<int>::of(&QSpinBox::valueChanged),
this, &FluidSettingsDialog::bufferSizeChanged);
63 connect(ui->periods, QOverload<int>::of(&QSpinBox::valueChanged),
this, &FluidSettingsDialog::bufferSizeChanged);
64 connect(ui->btnFile, &QToolButton::clicked,
this, &FluidSettingsDialog::showFileDialog);
65 connect(ui->buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked,
66 this, &FluidSettingsDialog::restoreDefaults);
67 auto sampleRateValidator =
new QDoubleValidator(8000.0, 96000.0, 1,
this);
68 sampleRateValidator->setNotation(QDoubleValidator::StandardNotation);
69 sampleRateValidator->setLocale(QLocale::c());
70 ui->sampleRate->setValidator(sampleRateValidator);
71 auto gainValidator =
new QDoubleValidator(0.1, 10.0, 2,
this);
72 gainValidator->setNotation(QDoubleValidator::StandardNotation);
73 gainValidator->setLocale(QLocale::c());
74 ui->gain->setValidator(gainValidator);
75 auto polyphonyValidator =
new QIntValidator(1, 65535,
this);
76 ui->polyphony->setValidator(polyphonyValidator);
80 if (m_driver !=
nullptr) {
81 QVariant v = m_driver->property(
"audiodrivers");
83 ui->audioDriver->blockSignals(
true);
84 ui->audioDriver->clear();
85 ui->audioDriver->addItems(v.toStringList());
86 ui->audioDriver->blockSignals(
false);
89 ui->bufferTime->blockSignals(
true);
90 ui->periodSize->blockSignals(
true);
91 ui->periods->blockSignals(
true);
95FluidSettingsDialog::~FluidSettingsDialog()
98 if (m_driver !=
nullptr) {
104bool FluidSettingsDialog::checkRanges()
const
107 if (ui->gain->hasAcceptableInput()) {
108 ui->gain->deselect();
110 ui->gain->selectAll();
112 if (ui->polyphony->hasAcceptableInput()) {
113 ui->polyphony->deselect();
115 ui->polyphony->selectAll();
117 if (ui->sampleRate->hasAcceptableInput()) {
118 ui->sampleRate->deselect();
120 ui->sampleRate->selectAll();
123 ui->bufferTime->hasAcceptableInput() &&
124 ui->periodSize->hasAcceptableInput() &&
125 ui->periods->hasAcceptableInput() &&
126 ui->gain->hasAcceptableInput() &&
127 ui->polyphony->hasAcceptableInput() &&
128 ui->sampleRate->hasAcceptableInput();
131void FluidSettingsDialog::accept()
136 if (m_driver !=
nullptr) {
138 QVariant varStatus = m_driver->property(
"status");
139 if (varStatus.isValid()) {
140 title = varStatus.toBool() ? tr(
"FluidSynth Initialized") : tr(
"FluidSynth Initialization Failed");
141 QVariant varDiag = m_driver->property(
"diagnostics");
142 if (varDiag.isValid()) {
143 QString text = varDiag.toStringList().join(QChar::LineFeed).trimmed();
144 if (varStatus.toBool()) {
145 if (!text.isEmpty()) {
146 QMessageBox::information(
this, title, text);
149 QMessageBox::critical(
this, title, text);
159void FluidSettingsDialog::showEvent(QShowEvent *event)
165QString FluidSettingsDialog::defaultAudioDriver()
const
167 const QString QSTR_DEFAULT_AUDIODRIVER =
169 QLatin1String(
"wasapi");
170#elif defined(Q_OS_OSX)
171 QLatin1String(
"coreaudio");
172#elif defined(Q_OS_LINUX)
175 QLatin1String(
"oss");
177 return QSTR_DEFAULT_AUDIODRIVER;
180void FluidSettingsDialog::chkDriverProperties(
QSettings *settings)
183 if (m_driver !=
nullptr) {
186 m_driver->initialize(settings);
187 m_driver->open(conn);
189 QVariant drivers = m_driver->property(
"audiodrivers");
190 if (drivers.isValid()) {
191 auto text = ui->audioDriver->currentText();
192 ui->audioDriver->blockSignals(
true);
193 ui->audioDriver->clear();
194 ui->audioDriver->addItems(drivers.toStringList());
195 ui->audioDriver->setCurrentText(text);
196 ui->audioDriver->blockSignals(
false);
198 QVariant varVersion = m_driver->property(
"libversion");
199 if (varVersion.isValid()) {
200 ui->lblVersion->clear();
201 ui->lblVersion->setText(varVersion.toString());
203 QVariant varStatus = m_driver->property(
"status");
204 if (varStatus.isValid()) {
205 ui->lblStatus->clear();
206 ui->lblStatus->setText(varStatus.toBool() ? tr(
"Ready") : tr(
"Failed") );
207 ui->lblStatusIcon->setPixmap(varStatus.toBool() ? QPixmap(
":/checked.png") : QPixmap(
":/error.png") );
212void drumstick::widgets::FluidSettingsDialog::initBuffer()
214 if (ui->audioDriver->currentText() == QSTR_PULSEAUDIO) {
216 int bufferTime = ui->bufferTime->value();
217 int minBufTime = ui->bufferTime->minimum();
218 if (qEnvironmentVariableIsSet(
"PULSE_LATENCY_MSEC")) {
219 bufferTime = qEnvironmentVariableIntValue(
"PULSE_LATENCY_MSEC");
221 if (bufferTime < minBufTime) {
222 bufferTime = minBufTime;
224 ui->bufferTime->setValue( bufferTime );
225 bufferTimeChanged( bufferTime );
232void FluidSettingsDialog::readSettings()
235 SettingsFactory settings;
236 QString fs_defSoundFont = QSTR_SOUNDFONT;
237 QDir dir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR, QStandardPaths::LocateDirectory));
239 dir = QDir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR2, QStandardPaths::LocateDirectory));
241 QFileInfo sf2(dir, QSTR_SOUNDFONT);
243 fs_defSoundFont = sf2.absoluteFilePath();
246 settings->beginGroup(QSTR_PREFERENCES);
247 ui->audioDriver->setCurrentText( settings->value(QSTR_AUDIODRIVER, defaultAudioDriver()).toString() );
248 ui->bufferTime->setValue( settings->value(QSTR_BUFFERTIME, DEFAULT_BUFFERTIME).toInt() );
249 ui->periodSize->setValue( settings->value(QSTR_PERIODSIZE, DEFAULT_PERIODSIZE).toInt() );
250 ui->periods->setValue( settings->value(QSTR_PERIODS, DEFAULT_PERIODS).toInt() );
251 ui->sampleRate->setText( settings->value(QSTR_SAMPLERATE, DEFAULT_SAMPLERATE).toString() );
252 ui->chorus->setChecked( settings->value(QSTR_CHORUS, DEFAULT_CHORUS).toInt() != 0 );
253 ui->reverb->setChecked( settings->value(QSTR_REVERB, DEFAULT_REVERB).toInt() != 0 );
254 ui->gain->setText( settings->value(QSTR_GAIN, DEFAULT_GAIN).toString() );
255 ui->polyphony->setText( settings->value(QSTR_POLYPHONY, DEFAULT_POLYPHONY).toString() );
256 ui->soundFont->setText( settings->value(QSTR_INSTRUMENTSDEFINITION, fs_defSoundFont).toString() );
257 settings->endGroup();
259 audioDriverChanged( ui->audioDriver->currentText() );
260 chkDriverProperties(settings.getQSettings());
263void FluidSettingsDialog::writeSettings()
266 SettingsFactory settings;
268 QString soundFont(QSTR_SOUNDFONT);
269 int bufferTime(DEFAULT_BUFFERTIME);
270 int periodSize(DEFAULT_PERIODSIZE);
271 int periods(DEFAULT_PERIODS);
272 double sampleRate(DEFAULT_SAMPLERATE);
273 int chorus(DEFAULT_CHORUS);
274 int reverb(DEFAULT_REVERB);
275 double gain(DEFAULT_GAIN);
276 int polyphony(DEFAULT_POLYPHONY);
278 audioDriver = ui->audioDriver->currentText();
279 if (audioDriver.isEmpty()) {
280 audioDriver = defaultAudioDriver();
282 soundFont = ui->soundFont->text();
283 bufferTime = ui->bufferTime->value();
284 periodSize = ui->periodSize->value();
285 periods = ui->periods->value();
286 sampleRate = ui->sampleRate->text().toDouble();
287 chorus = (ui->chorus->isChecked() ? 1 : 0);
288 reverb = (ui->reverb->isChecked() ? 1 : 0);
289 gain = ui->gain->text().toDouble();
290 polyphony = ui->polyphony->text().toInt();
292 settings->beginGroup(QSTR_PREFERENCES);
293 settings->setValue(QSTR_INSTRUMENTSDEFINITION, soundFont);
294 settings->setValue(QSTR_AUDIODRIVER, audioDriver);
295 settings->setValue(QSTR_BUFFERTIME, bufferTime);
296 settings->setValue(QSTR_PERIODSIZE, periodSize);
297 settings->setValue(QSTR_PERIODS, periods);
298 settings->setValue(QSTR_SAMPLERATE, sampleRate);
299 settings->setValue(QSTR_CHORUS, chorus);
300 settings->setValue(QSTR_REVERB, reverb);
301 settings->setValue(QSTR_GAIN, gain);
302 settings->setValue(QSTR_POLYPHONY, polyphony);
303 settings->endGroup();
306 if ( audioDriver == QSTR_PULSEAUDIO ) {
307 qputenv(
"PULSE_LATENCY_MSEC", QByteArray::number( bufferTime ) );
309 chkDriverProperties(settings.getQSettings());
312void FluidSettingsDialog::restoreDefaults()
315 ui->audioDriver->setCurrentText( defaultAudioDriver() );
316 ui->bufferTime->setValue( DEFAULT_BUFFERTIME );
317 ui->periodSize->setValue( DEFAULT_PERIODSIZE );
318 ui->periods->setValue( DEFAULT_PERIODS );
319 ui->sampleRate->setText( QString::number( DEFAULT_SAMPLERATE ));
320 ui->chorus->setChecked( DEFAULT_CHORUS != 0 );
321 ui->reverb->setChecked( DEFAULT_REVERB != 0 );
322 ui->gain->setText( QString::number( DEFAULT_GAIN ) );
323 ui->polyphony->setText( QString::number( DEFAULT_POLYPHONY ));
324 ui->soundFont->setText( QSTR_SOUNDFONT );
328void FluidSettingsDialog::showFileDialog()
330 QDir dir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR, QStandardPaths::LocateDirectory));
332 dir = QDir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR2, QStandardPaths::LocateDirectory));
334 QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Select SoundFont"), dir.absolutePath(), tr(
"SoundFont Files (*.sf2 *.sf3 *.dls)"));
335 if (!fileName.isEmpty()) {
336 ui->soundFont->setText(fileName);
340void FluidSettingsDialog::audioDriverChanged(
const QString &text)
343 if (text == QSTR_PULSEAUDIO) {
344 ui->bufferTime->setDisabled(
false);
345 ui->bufferTime->blockSignals(
false);
346 ui->periodSize->setDisabled(
true);
347 ui->periodSize->blockSignals(
true);
348 ui->periods->setDisabled(
true);
349 ui->periods->blockSignals(
true);
351 ui->bufferTime->setDisabled(
true);
352 ui->bufferTime->blockSignals(
true);
353 ui->periodSize->setDisabled(
false);
354 ui->periodSize->blockSignals(
false);
355 ui->periods->setDisabled(
false);
356 ui->periods->blockSignals(
false);
361void FluidSettingsDialog::bufferTimeChanged(
int value)
363 double rate = ui->sampleRate->text().toDouble();
364 int size = qRound( value * rate / 1000.0 );
365 ui->periodSize->setValue( size );
366 ui->periods->setValue( ui->periods->minimum() );
370void FluidSettingsDialog::bufferSizeChanged()
372 QString audioDriver = ui->audioDriver->currentText();
373 double rate = ui->sampleRate->text().toDouble();
374 int size = ui->periodSize->value();
375 if (audioDriver != QSTR_PULSEAUDIO) {
376 size *= ui->periods->value();
378 int ms = qRound( 1000.0 * size / rate );
379 ui->bufferTime->setValue(ms);
383void FluidSettingsDialog::changeSoundFont(
const QString& fileName)
386 ui->soundFont->setText(fileName);
BackendManager class declaration.
The QSettings class provides persistent platform-independent application settings.
The BackendManager class manages lists of dynamic and static backends for applications based on drums...
MIDIOutput * outputBackendByName(const QString name)
outputBackendByName
virtual void close()=0
close the MIDI port
Declaration of the Fluidsynth configuration dialog.
QPair< QString, QVariant > MIDIConnection
MIDIConnection represents a connection identifier.
SettingsFactory class declaration.