5 #include "mainwindow.h"
6 #include "ui_mainwindow.h"
10 char backend_name
[16];
12 } backendMenuList
[] = {
14 { "mmdevapi", "Add MMDevAPI" },
15 { "dsound", "Add DirectSound" },
16 { "winmm", "Add Windows Multimedia" },
19 { "core", "Add CoreAudio" },
21 { "pulse", "Add PulseAudio" },
23 { "alsa", "Add ALSA" },
25 { "solaris", "Add Solaris" },
26 { "sndio", "Add SndIO" },
29 { "port", "Add PortAudio" },
30 { "opensl", "Add OpenSL" },
31 { "null", "Add Null Output" },
32 { "wave", "Add Wave Writer" },
36 static QString
getDefaultConfigName()
39 static const char fname
[] = "alsoft.ini";
40 QByteArray base
= qgetenv("AppData");
42 static const char fname
[] = "alsoft.conf";
43 QByteArray base
= qgetenv("XDG_CONFIG_HOME");
46 base
= qgetenv("HOME");
47 if(base
.isEmpty() == false)
51 if(base
.isEmpty() == false)
52 return base
+'/'+ fname
;
56 static QString
getBaseDataPath()
59 QByteArray base
= qgetenv("AppData");
61 QByteArray base
= qgetenv("XDG_DATA_HOME");
64 base
= qgetenv("HOME");
66 base
+= "/.local/share";
72 static QStringList
getAllDataPaths(QString append
=QString())
75 list
.append(getBaseDataPath());
77 // TODO: Common AppData path
79 QString paths
= qgetenv("XDG_DATA_DIRS");
81 paths
= "/usr/local/share/:/usr/share/";
82 list
+= paths
.split(QChar(':'), QString::SkipEmptyParts
);
84 QStringList::iterator iter
= list
.begin();
85 while(iter
!= list
.end())
88 iter
= list
.erase(iter
);
99 MainWindow::MainWindow(QWidget
*parent
) :
101 ui(new Ui::MainWindow
),
102 mPeriodSizeValidator(NULL
),
103 mPeriodCountValidator(NULL
),
104 mSourceCountValidator(NULL
),
105 mEffectSlotValidator(NULL
),
106 mSourceSendValidator(NULL
),
107 mSampleRateValidator(NULL
),
108 mReverbBoostValidator(NULL
)
112 mPeriodSizeValidator
= new QIntValidator(64, 8192, this);
113 ui
->periodSizeEdit
->setValidator(mPeriodSizeValidator
);
114 mPeriodCountValidator
= new QIntValidator(2, 16, this);
115 ui
->periodCountEdit
->setValidator(mPeriodCountValidator
);
117 mSourceCountValidator
= new QIntValidator(0, 256, this);
118 ui
->srcCountLineEdit
->setValidator(mSourceCountValidator
);
119 mEffectSlotValidator
= new QIntValidator(0, 16, this);
120 ui
->effectSlotLineEdit
->setValidator(mEffectSlotValidator
);
121 mSourceSendValidator
= new QIntValidator(0, 4, this);
122 ui
->srcSendLineEdit
->setValidator(mSourceSendValidator
);
123 mSampleRateValidator
= new QIntValidator(8000, 192000, this);
124 ui
->sampleRateCombo
->lineEdit()->setValidator(mSampleRateValidator
);
126 mReverbBoostValidator
= new QDoubleValidator(-12.0, +12.0, 1, this);
127 ui
->reverbBoostEdit
->setValidator(mReverbBoostValidator
);
129 connect(ui
->actionLoad
, SIGNAL(triggered()), this, SLOT(loadConfigFromFile()));
130 connect(ui
->actionSave_As
, SIGNAL(triggered()), this, SLOT(saveConfigAsFile()));
132 connect(ui
->applyButton
, SIGNAL(clicked()), this, SLOT(saveCurrentConfig()));
134 connect(ui
->periodSizeSlider
, SIGNAL(valueChanged(int)), this, SLOT(updatePeriodSizeEdit(int)));
135 connect(ui
->periodSizeEdit
, SIGNAL(editingFinished()), this, SLOT(updatePeriodSizeSlider()));
136 connect(ui
->periodCountSlider
, SIGNAL(valueChanged(int)), this, SLOT(updatePeriodCountEdit(int)));
137 connect(ui
->periodCountEdit
, SIGNAL(editingFinished()), this, SLOT(updatePeriodCountSlider()));
139 connect(ui
->hrtfAddButton
, SIGNAL(clicked()), this, SLOT(addHrtfFile()));
140 connect(ui
->hrtfRemoveButton
, SIGNAL(clicked()), this, SLOT(removeHrtfFile()));
141 connect(ui
->hrtfFileList
, SIGNAL(itemSelectionChanged()), this, SLOT(updateHrtfRemoveButton()));
143 ui
->enabledBackendList
->setContextMenuPolicy(Qt::CustomContextMenu
);
144 connect(ui
->enabledBackendList
, SIGNAL(customContextMenuRequested(QPoint
)), this, SLOT(showEnabledBackendMenu(QPoint
)));
146 ui
->disabledBackendList
->setContextMenuPolicy(Qt::CustomContextMenu
);
147 connect(ui
->disabledBackendList
, SIGNAL(customContextMenuRequested(QPoint
)), this, SLOT(showDisabledBackendMenu(QPoint
)));
149 connect(ui
->reverbBoostSlider
, SIGNAL(valueChanged(int)), this, SLOT(updateReverbBoostEdit(int)));
150 connect(ui
->reverbBoostEdit
, SIGNAL(textEdited(QString
)), this, SLOT(updateReverbBoostSlider(QString
)));
152 loadConfig(getDefaultConfigName());
155 MainWindow::~MainWindow()
158 delete mPeriodSizeValidator
;
159 delete mPeriodCountValidator
;
160 delete mSourceCountValidator
;
161 delete mEffectSlotValidator
;
162 delete mSourceSendValidator
;
163 delete mSampleRateValidator
;
164 delete mReverbBoostValidator
;
167 void MainWindow::loadConfigFromFile()
169 QString fname
= QFileDialog::getOpenFileName(this, tr("Select Files"));
170 if(fname
.isEmpty() == false)
174 void MainWindow::loadConfig(const QString
&fname
)
176 QSettings
settings(fname
, QSettings::IniFormat
);
178 QString sampletype
= settings
.value("sample-type").toString();
179 ui
->sampleFormatCombo
->setCurrentIndex(0);
180 if(sampletype
.isEmpty() == false)
182 for(int i
= 1;i
< ui
->sampleFormatCombo
->count();i
++)
184 QString item
= ui
->sampleFormatCombo
->itemText(i
);
185 if(item
.startsWith(sampletype
))
187 ui
->sampleFormatCombo
->setCurrentIndex(i
);
193 QString channelconfig
= settings
.value("channels").toString();
194 ui
->channelConfigCombo
->setCurrentIndex(0);
195 if(channelconfig
.isEmpty() == false)
197 for(int i
= 1;i
< ui
->channelConfigCombo
->count();i
++)
199 QString item
= ui
->channelConfigCombo
->itemText(i
);
200 if(item
.startsWith(channelconfig
))
202 ui
->channelConfigCombo
->setCurrentIndex(i
);
208 QString srate
= settings
.value("frequency").toString();
210 ui
->sampleRateCombo
->setCurrentIndex(0);
213 ui
->sampleRateCombo
->lineEdit()->clear();
214 ui
->sampleRateCombo
->lineEdit()->insert(srate
);
217 ui
->srcCountLineEdit
->clear();
218 ui
->srcCountLineEdit
->insert(settings
.value("sources").toString());
219 ui
->effectSlotLineEdit
->clear();
220 ui
->effectSlotLineEdit
->insert(settings
.value("slots").toString());
221 ui
->srcSendLineEdit
->clear();
222 ui
->srcSendLineEdit
->insert(settings
.value("sends").toString());
224 QString resampler
= settings
.value("resampler").toString().trimmed();
225 if(resampler
.isEmpty())
226 ui
->resamplerComboBox
->setCurrentIndex(0);
229 for(int i
= 1;i
< ui
->resamplerComboBox
->count();i
++)
231 QString item
= ui
->resamplerComboBox
->itemText(i
);
232 int end
= item
.indexOf(' ');
233 if(end
< 0) end
= item
.size();
234 if(resampler
.size() == end
&& resampler
.compare(item
.leftRef(end
), Qt::CaseInsensitive
) == 0)
236 ui
->resamplerComboBox
->setCurrentIndex(i
);
242 int periodsize
= settings
.value("period_size").toInt();
243 ui
->periodSizeEdit
->clear();
246 ui
->periodSizeEdit
->insert(QString::number(periodsize
));
247 updatePeriodSizeSlider();
250 int periodcount
= settings
.value("periods").toInt();
251 ui
->periodCountEdit
->clear();
254 ui
->periodCountEdit
->insert(QString::number(periodcount
));
255 updatePeriodCountSlider();
258 QStringList disabledCpuExts
= settings
.value("disable-cpu-exts").toStringList();
259 if(disabledCpuExts
.size() == 1)
260 disabledCpuExts
= disabledCpuExts
[0].split(QChar(','));
261 std::transform(disabledCpuExts
.begin(), disabledCpuExts
.end(),
262 disabledCpuExts
.begin(), std::mem_fun_ref(&QString::trimmed
));
263 ui
->disableSSECheckBox
->setChecked(disabledCpuExts
.contains("sse", Qt::CaseInsensitive
));
264 ui
->disableSSE2CheckBox
->setChecked(disabledCpuExts
.contains("sse2", Qt::CaseInsensitive
));
265 ui
->disableSSE41CheckBox
->setChecked(disabledCpuExts
.contains("sse4.1", Qt::CaseInsensitive
));
266 ui
->disableNeonCheckBox
->setChecked(disabledCpuExts
.contains("neon", Qt::CaseInsensitive
));
268 if(settings
.value("hrtf").toString() == QString())
269 ui
->hrtfEnableButton
->setChecked(true);
272 if(settings
.value("hrtf", true).toBool())
273 ui
->hrtfForceButton
->setChecked(true);
275 ui
->hrtfDisableButton
->setChecked(true);
278 QStringList hrtf_tables
= settings
.value("hrtf_tables").toStringList();
279 if(hrtf_tables
.size() == 1)
280 hrtf_tables
= hrtf_tables
[0].split(QChar(','));
281 std::transform(hrtf_tables
.begin(), hrtf_tables
.end(),
282 hrtf_tables
.begin(), std::mem_fun_ref(&QString::trimmed
));
283 ui
->hrtfFileList
->clear();
284 ui
->hrtfFileList
->addItems(hrtf_tables
);
285 updateHrtfRemoveButton();
287 ui
->enabledBackendList
->clear();
288 ui
->disabledBackendList
->clear();
289 QStringList drivers
= settings
.value("drivers").toStringList();
290 if(drivers
.size() == 0)
291 ui
->backendCheckBox
->setChecked(true);
294 if(drivers
.size() == 1)
295 drivers
= drivers
[0].split(QChar(','));
296 std::transform(drivers
.begin(), drivers
.end(),
297 drivers
.begin(), std::mem_fun_ref(&QString::trimmed
));
299 bool lastWasEmpty
= false;
300 foreach(const QString
&backend
, drivers
)
302 lastWasEmpty
= backend
.isEmpty();
303 if(!backend
.startsWith(QChar('-')) && !lastWasEmpty
)
304 ui
->enabledBackendList
->addItem(backend
);
305 else if(backend
.size() > 1)
306 ui
->disabledBackendList
->addItem(backend
.right(backend
.size()-1));
308 ui
->backendCheckBox
->setChecked(lastWasEmpty
);
311 QString defaultreverb
= settings
.value("default-reverb").toString().toLower();
312 ui
->defaultReverbComboBox
->setCurrentIndex(0);
313 if(defaultreverb
.isEmpty() == false)
315 for(int i
= 0;i
< ui
->defaultReverbComboBox
->count();i
++)
317 if(defaultreverb
.compare(ui
->defaultReverbComboBox
->itemText(i
).toLower()) == 0)
319 ui
->defaultReverbComboBox
->setCurrentIndex(i
);
325 ui
->emulateEaxCheckBox
->setChecked(settings
.value("reverb/emulate-eax", false).toBool());
326 ui
->reverbBoostEdit
->clear();
327 ui
->reverbBoostEdit
->insert(settings
.value("reverb/boost").toString());
329 QStringList excludefx
= settings
.value("excludefx").toStringList();
330 if(excludefx
.size() == 1)
331 excludefx
= excludefx
[0].split(QChar(','));
332 std::transform(excludefx
.begin(), excludefx
.end(),
333 excludefx
.begin(), std::mem_fun_ref(&QString::trimmed
));
334 ui
->disableEaxReverbCheck
->setChecked(excludefx
.contains("eaxreverb", Qt::CaseInsensitive
));
335 ui
->disableStdReverbCheck
->setChecked(excludefx
.contains("reverb", Qt::CaseInsensitive
));
336 ui
->disableChorusCheck
->setChecked(excludefx
.contains("chorus", Qt::CaseInsensitive
));
337 ui
->disableCompressorCheck
->setChecked(excludefx
.contains("compressor", Qt::CaseInsensitive
));
338 ui
->disableDistortionCheck
->setChecked(excludefx
.contains("distortion", Qt::CaseInsensitive
));
339 ui
->disableEchoCheck
->setChecked(excludefx
.contains("echo", Qt::CaseInsensitive
));
340 ui
->disableEqualizerCheck
->setChecked(excludefx
.contains("equalizer", Qt::CaseInsensitive
));
341 ui
->disableFlangerCheck
->setChecked(excludefx
.contains("flanger", Qt::CaseInsensitive
));
342 ui
->disableModulatorCheck
->setChecked(excludefx
.contains("modulator", Qt::CaseInsensitive
));
343 ui
->disableDedicatedCheck
->setChecked(excludefx
.contains("dedicated", Qt::CaseInsensitive
));
346 void MainWindow::saveCurrentConfig()
348 saveConfig(getDefaultConfigName());
349 QMessageBox::information(this, tr("Information"),
350 tr("Applications using OpenAL need to be restarted for changes to take effect."));
353 void MainWindow::saveConfigAsFile()
355 QString fname
= QFileDialog::getOpenFileName(this, tr("Select Files"));
356 if(fname
.isEmpty() == false)
360 void MainWindow::saveConfig(const QString
&fname
) const
362 QSettings
settings(fname
, QSettings::IniFormat
);
364 /* HACK: Compound any stringlist values into a comma-separated string. */
365 QStringList allkeys
= settings
.allKeys();
366 foreach(const QString
&key
, allkeys
)
368 QStringList vals
= settings
.value(key
).toStringList();
370 settings
.setValue(key
, vals
.join(QChar(',')));
373 QString str
= ui
->sampleFormatCombo
->currentText();
374 str
.truncate(str
.indexOf('-'));
375 settings
.setValue("sample-type", str
.trimmed());
377 str
= ui
->channelConfigCombo
->currentText();
378 str
.truncate(str
.indexOf('-'));
379 settings
.setValue("channels", str
.trimmed());
381 uint rate
= ui
->sampleRateCombo
->currentText().toUInt();
383 settings
.setValue("frequency", QString());
385 settings
.setValue("frequency", rate
);
387 settings
.setValue("period_size", ui
->periodSizeEdit
->text());
388 settings
.setValue("periods", ui
->periodCountEdit
->text());
390 settings
.setValue("sources", ui
->srcCountLineEdit
->text());
391 settings
.setValue("slots", ui
->effectSlotLineEdit
->text());
393 if(ui
->resamplerComboBox
->currentIndex() == 0)
394 settings
.setValue("resampler", QString());
397 str
= ui
->resamplerComboBox
->currentText();
398 settings
.setValue("resampler", str
.split(' ').first().toLower());
402 if(ui
->disableSSECheckBox
->isChecked())
403 strlist
.append("sse");
404 if(ui
->disableSSE2CheckBox
->isChecked())
405 strlist
.append("sse2");
406 if(ui
->disableSSE41CheckBox
->isChecked())
407 strlist
.append("sse4.1");
408 if(ui
->disableNeonCheckBox
->isChecked())
409 strlist
.append("neon");
410 settings
.setValue("disable-cpu-exts", strlist
.join(QChar(',')));
412 if(ui
->hrtfForceButton
->isChecked())
413 settings
.setValue("hrtf", "true");
414 else if(ui
->hrtfDisableButton
->isChecked())
415 settings
.setValue("hrtf", "false");
417 settings
.setValue("hrtf", QString());
420 QList
<QListWidgetItem
*> items
= ui
->hrtfFileList
->findItems("*", Qt::MatchWildcard
);
421 foreach(const QListWidgetItem
*item
, items
)
422 strlist
.append(item
->text());
423 settings
.setValue("hrtf_tables", strlist
.join(QChar(',')));
426 items
= ui
->enabledBackendList
->findItems("*", Qt::MatchWildcard
);
427 foreach(const QListWidgetItem
*item
, items
)
428 strlist
.append(item
->text());
429 items
= ui
->disabledBackendList
->findItems("*", Qt::MatchWildcard
);
430 foreach(const QListWidgetItem
*item
, items
)
431 strlist
.append(QChar('-')+item
->text());
432 if(strlist
.size() == 0 && !ui
->backendCheckBox
->isChecked())
433 strlist
.append("-all");
434 else if(ui
->backendCheckBox
->isChecked())
435 strlist
.append(QString());
436 settings
.setValue("drivers", strlist
.join(QChar(',')));
438 // TODO: Remove check when we can properly match global values.
439 if(ui
->defaultReverbComboBox
->currentIndex() == 0)
440 settings
.setValue("default-reverb", QString());
443 str
= ui
->defaultReverbComboBox
->currentText().toLower();
444 settings
.setValue("default-reverb", str
);
447 if(ui
->emulateEaxCheckBox
->isChecked())
448 settings
.setValue("reverb/emulate-eax", "true");
450 settings
.setValue("reverb/emulate-eax", QString()/*"false"*/);
452 // TODO: Remove check when we can properly match global values.
453 if(ui
->reverbBoostSlider
->sliderPosition() == 0)
454 settings
.setValue("reverb/boost", QString());
456 settings
.setValue("reverb/boost", ui
->reverbBoostEdit
->text());
459 if(ui
->disableEaxReverbCheck
->isChecked())
460 strlist
.append("eaxreverb");
461 if(ui
->disableStdReverbCheck
->isChecked())
462 strlist
.append("reverb");
463 if(ui
->disableChorusCheck
->isChecked())
464 strlist
.append("chorus");
465 if(ui
->disableDistortionCheck
->isChecked())
466 strlist
.append("distortion");
467 if(ui
->disableCompressorCheck
->isChecked())
468 strlist
.append("compressor");
469 if(ui
->disableEchoCheck
->isChecked())
470 strlist
.append("echo");
471 if(ui
->disableEqualizerCheck
->isChecked())
472 strlist
.append("equalizer");
473 if(ui
->disableFlangerCheck
->isChecked())
474 strlist
.append("flanger");
475 if(ui
->disableModulatorCheck
->isChecked())
476 strlist
.append("modulator");
477 if(ui
->disableDedicatedCheck
->isChecked())
478 strlist
.append("dedicated");
479 settings
.setValue("excludefx", strlist
.join(QChar(',')));
482 * FIXME: Should only remove keys whose value matches the globally-specified value.
484 allkeys
= settings
.allKeys();
485 foreach(const QString
&key
, allkeys
)
487 str
= settings
.value(key
).toString();
489 settings
.remove(key
);
494 void MainWindow::updatePeriodSizeEdit(int size
)
496 ui
->periodSizeEdit
->clear();
499 size
= (size
+32)&~0x3f;
500 ui
->periodSizeEdit
->insert(QString::number(size
));
504 void MainWindow::updatePeriodSizeSlider()
506 int pos
= ui
->periodSizeEdit
->text().toInt();
511 ui
->periodSizeSlider
->setSliderPosition(pos
);
515 void MainWindow::updatePeriodCountEdit(int count
)
517 ui
->periodCountEdit
->clear();
519 ui
->periodCountEdit
->insert(QString::number(count
));
522 void MainWindow::updatePeriodCountSlider()
524 int pos
= ui
->periodCountEdit
->text().toInt();
529 ui
->periodCountSlider
->setSliderPosition(pos
);
533 void MainWindow::addHrtfFile()
535 const QStringList datapaths
= getAllDataPaths("/openal/hrtf");
536 QStringList fnames
= QFileDialog::getOpenFileNames(this, tr("Select Files"),
537 datapaths
.empty() ? QString() : datapaths
[0],
538 "HRTF Datasets(*.mhr);;All Files(*.*)");
539 if(fnames
.isEmpty() == false)
541 for(QStringList::iterator iter
= fnames
.begin();iter
!= fnames
.end();iter
++)
543 QStringList::const_iterator path
= datapaths
.constBegin();
544 for(;path
!= datapaths
.constEnd();path
++)
547 if(!hrtfdir
.isAbsolute())
550 const QString relname
= hrtfdir
.relativeFilePath(*iter
);
551 if(!relname
.startsWith(".."))
553 // If filename is within this path, use the relative pathname
554 ui
->hrtfFileList
->addItem(relname
);
558 if(path
== datapaths
.constEnd())
560 // Filename is not within any data path, use the absolute pathname
561 ui
->hrtfFileList
->addItem(*iter
);
567 void MainWindow::removeHrtfFile()
569 QList
<QListWidgetItem
*> selected
= ui
->hrtfFileList
->selectedItems();
570 foreach(QListWidgetItem
*item
, selected
)
574 void MainWindow::updateHrtfRemoveButton()
576 ui
->hrtfRemoveButton
->setEnabled(ui
->hrtfFileList
->selectedItems().size() != 0);
579 void MainWindow::showEnabledBackendMenu(QPoint pt
)
581 QMap
<QAction
*,QString
> actionMap
;
583 pt
= ui
->enabledBackendList
->mapToGlobal(pt
);
586 QAction
*removeAction
= ctxmenu
.addAction(QIcon::fromTheme("list-remove"), "Remove");
587 if(ui
->enabledBackendList
->selectedItems().size() == 0)
588 removeAction
->setEnabled(false);
589 ctxmenu
.addSeparator();
590 for(size_t i
= 0;backendMenuList
[i
].backend_name
[0];i
++)
592 QAction
*action
= ctxmenu
.addAction(backendMenuList
[i
].menu_string
);
593 actionMap
[action
] = backendMenuList
[i
].backend_name
;
594 if(ui
->enabledBackendList
->findItems(backendMenuList
[i
].backend_name
, Qt::MatchFixedString
).size() != 0 ||
595 ui
->disabledBackendList
->findItems(backendMenuList
[i
].backend_name
, Qt::MatchFixedString
).size() != 0)
596 action
->setEnabled(false);
599 QAction
*gotAction
= ctxmenu
.exec(pt
);
600 if(gotAction
== removeAction
)
602 QList
<QListWidgetItem
*> selected
= ui
->enabledBackendList
->selectedItems();
603 foreach(QListWidgetItem
*item
, selected
)
606 else if(gotAction
!= NULL
)
608 QMap
<QAction
*,QString
>::const_iterator iter
= actionMap
.find(gotAction
);
609 if(iter
!= actionMap
.end())
610 ui
->enabledBackendList
->addItem(iter
.value());
614 void MainWindow::showDisabledBackendMenu(QPoint pt
)
616 QMap
<QAction
*,QString
> actionMap
;
618 pt
= ui
->disabledBackendList
->mapToGlobal(pt
);
621 QAction
*removeAction
= ctxmenu
.addAction(QIcon::fromTheme("list-remove"), "Remove");
622 if(ui
->disabledBackendList
->selectedItems().size() == 0)
623 removeAction
->setEnabled(false);
624 ctxmenu
.addSeparator();
625 for(size_t i
= 0;backendMenuList
[i
].backend_name
[0];i
++)
627 QAction
*action
= ctxmenu
.addAction(backendMenuList
[i
].menu_string
);
628 actionMap
[action
] = backendMenuList
[i
].backend_name
;
629 if(ui
->disabledBackendList
->findItems(backendMenuList
[i
].backend_name
, Qt::MatchFixedString
).size() != 0 ||
630 ui
->enabledBackendList
->findItems(backendMenuList
[i
].backend_name
, Qt::MatchFixedString
).size() != 0)
631 action
->setEnabled(false);
634 QAction
*gotAction
= ctxmenu
.exec(pt
);
635 if(gotAction
== removeAction
)
637 QList
<QListWidgetItem
*> selected
= ui
->disabledBackendList
->selectedItems();
638 foreach(QListWidgetItem
*item
, selected
)
641 else if(gotAction
!= NULL
)
643 QMap
<QAction
*,QString
>::const_iterator iter
= actionMap
.find(gotAction
);
644 if(iter
!= actionMap
.end())
645 ui
->disabledBackendList
->addItem(iter
.value());
649 void MainWindow::updateReverbBoostEdit(int value
)
651 ui
->reverbBoostEdit
->clear();
653 ui
->reverbBoostEdit
->insert(QString::number(value
/10.0, 'f', 1));
656 void MainWindow::updateReverbBoostSlider(QString value
)
658 int pos
= int(value
.toFloat()*10.0f
);
659 ui
->reverbBoostSlider
->setSliderPosition(pos
);