diff options
author | Chris Robinson <[email protected]> | 2013-06-23 22:47:51 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2013-06-23 22:47:51 -0700 |
commit | 144059b062bd357cdec27416010872f37ef69cba (patch) | |
tree | d88c0c5ef43975e5c9b61712dba5dacd25ebcab4 /utils | |
parent | 4017e4a96a41ce2e781bcd99695c7f9dfc503c5f (diff) |
Add a configuration UI application
Not complete, but it's a decent start. Some problems:
* Only some otions are handled (backend-specific options in particular aren't
handled).
* Does not warn when quitting with unsaved changes.
* Some options are missing tooltips.
Diffstat (limited to 'utils')
-rw-r--r-- | utils/alsoft-config/main.cpp | 11 | ||||
-rw-r--r-- | utils/alsoft-config/mainwindow.cpp | 573 | ||||
-rw-r--r-- | utils/alsoft-config/mainwindow.h | 54 | ||||
-rw-r--r-- | utils/alsoft-config/mainwindow.ui | 1396 |
4 files changed, 2034 insertions, 0 deletions
diff --git a/utils/alsoft-config/main.cpp b/utils/alsoft-config/main.cpp new file mode 100644 index 00000000..9e2d83c8 --- /dev/null +++ b/utils/alsoft-config/main.cpp @@ -0,0 +1,11 @@ +#include "mainwindow.h" +#include <QApplication> + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + + return a.exec(); +} diff --git a/utils/alsoft-config/mainwindow.cpp b/utils/alsoft-config/mainwindow.cpp new file mode 100644 index 00000000..e799c4fb --- /dev/null +++ b/utils/alsoft-config/mainwindow.cpp @@ -0,0 +1,573 @@ +#include <QFileDialog> +#include <QMessageBox> +#include <QSettings> +#include <QtGlobal> +#include "mainwindow.h" +#include "ui_mainwindow.h" + +namespace { +static const struct { + char backend_name[16]; + char menu_string[32]; +} backendMenuList[] = { +#ifdef Q_OS_WIN32 + { "mmdevapi", "Add MMDevAPI" }, + { "dsound", "Add DirectSound" }, + { "winmm", "Add Windows Multimedia" }, +#endif +#ifdef Q_OS_MAC + { "core", "Add CoreAudio" }, +#endif + { "pulse", "Add PulseAudio" }, +#ifdef Q_OS_UNIX + { "alsa", "Add ALSA" }, + { "oss", "Add OSS" }, + { "solaris", "Add Solaris" }, + { "sndio", "Add SndIO" }, + { "qsa", "Add QSA" }, +#endif + { "port", "Add PortAudio" }, + { "opensl", "Add OpenSL" }, + { "null", "Add Null Output" }, + { "wave", "Add Wave Writer" }, + { "", "" } +}; + +static QString getDefaultConfigName() +{ +#ifdef Q_OS_WIN32 + static const char fname[] = "alsoft.ini"; + QByteArray base = qgetenv("AppData"); +#else + static const char fname[] = "alsoft.conf"; + QByteArray base = qgetenv("XDG_CONFIG_HOME"); + if(base.isEmpty()) + { + base = qgetenv("HOME"); + if(base.isEmpty() == false) + base += "/.config"; + } +#endif + if(base.isEmpty() == false) + return base +'/'+ fname; + return fname; +} +} + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow), + mPeriodSizeValidator(NULL), + mPeriodCountValidator(NULL), + mSourceCountValidator(NULL), + mEffectSlotValidator(NULL), + mSourceSendValidator(NULL), + mSampleRateValidator(NULL), + mReverbBoostValidator(NULL) +{ + ui->setupUi(this); + + mPeriodSizeValidator = new QIntValidator(64, 8192, this); + ui->periodSizeEdit->setValidator(mPeriodSizeValidator); + mPeriodCountValidator = new QIntValidator(2, 16, this); + ui->periodCountEdit->setValidator(mPeriodCountValidator); + + mSourceCountValidator = new QIntValidator(0, 256, this); + ui->srcCountLineEdit->setValidator(mSourceCountValidator); + mEffectSlotValidator = new QIntValidator(0, 16, this); + ui->effectSlotLineEdit->setValidator(mEffectSlotValidator); + mSourceSendValidator = new QIntValidator(0, 4, this); + ui->srcSendLineEdit->setValidator(mSourceSendValidator); + mSampleRateValidator = new QIntValidator(8000, 192000, this); + ui->sampleRateCombo->lineEdit()->setValidator(mSampleRateValidator); + + mReverbBoostValidator = new QDoubleValidator(-12.0, +12.0, 1, this); + ui->reverbBoostEdit->setValidator(mReverbBoostValidator); + + connect(ui->actionLoad, SIGNAL(triggered()), this, SLOT(loadConfigFromFile())); + connect(ui->actionSave_As, SIGNAL(triggered()), this, SLOT(saveConfigAsFile())); + + connect(ui->applyButton, SIGNAL(clicked()), this, SLOT(saveCurrentConfig())); + + connect(ui->periodSizeSlider, SIGNAL(valueChanged(int)), this, SLOT(updatePeriodSizeEdit(int))); + connect(ui->periodSizeEdit, SIGNAL(editingFinished()), this, SLOT(updatePeriodSizeSlider())); + connect(ui->periodCountSlider, SIGNAL(valueChanged(int)), this, SLOT(updatePeriodCountEdit(int))); + connect(ui->periodCountEdit, SIGNAL(editingFinished()), this, SLOT(updatePeriodCountSlider())); + + connect(ui->hrtfAddButton, SIGNAL(clicked()), this, SLOT(addHrtfFile())); + connect(ui->hrtfRemoveButton, SIGNAL(clicked()), this, SLOT(removeHrtfFile())); + + ui->enabledBackendList->setContextMenuPolicy(Qt::CustomContextMenu); + connect(ui->enabledBackendList, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showEnabledBackendMenu(QPoint))); + + ui->disabledBackendList->setContextMenuPolicy(Qt::CustomContextMenu); + connect(ui->disabledBackendList, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showDisabledBackendMenu(QPoint))); + + connect(ui->reverbBoostSlider, SIGNAL(valueChanged(int)), this, SLOT(updateReverbBoostEdit(int))); + connect(ui->reverbBoostEdit, SIGNAL(textEdited(QString)), this, SLOT(updateReverbBoostSlider(QString))); + + loadConfig(getDefaultConfigName()); +} + +MainWindow::~MainWindow() +{ + delete ui; + delete mPeriodSizeValidator; + delete mPeriodCountValidator; + delete mSourceCountValidator; + delete mEffectSlotValidator; + delete mSourceSendValidator; + delete mSampleRateValidator; + delete mReverbBoostValidator; +} + +void MainWindow::loadConfigFromFile() +{ + QString fname = QFileDialog::getOpenFileName(this, tr("Select Files")); + if(fname.isEmpty() == false) + loadConfig(fname); +} + +void MainWindow::loadConfig(const QString &fname) +{ + QSettings settings(fname, QSettings::IniFormat); + + QString sampletype = settings.value("sample-type").toString(); + ui->sampleFormatCombo->setCurrentIndex(0); + if(sampletype.isEmpty() == false) + { + for(int i = 1;i < ui->sampleFormatCombo->count();i++) + { + QString item = ui->sampleFormatCombo->itemText(i); + if(item.startsWith(sampletype)) + { + ui->sampleFormatCombo->setCurrentIndex(i); + break; + } + } + } + + QString channelconfig = settings.value("channels").toString(); + ui->channelConfigCombo->setCurrentIndex(0); + if(channelconfig.isEmpty() == false) + { + for(int i = 1;i < ui->channelConfigCombo->count();i++) + { + QString item = ui->channelConfigCombo->itemText(i); + if(item.startsWith(channelconfig)) + { + ui->channelConfigCombo->setCurrentIndex(i); + break; + } + } + } + + QString srate = settings.value("frequency").toString(); + if(srate.isEmpty()) + ui->sampleRateCombo->setCurrentIndex(0); + else + { + ui->sampleRateCombo->lineEdit()->clear(); + ui->sampleRateCombo->lineEdit()->insert(srate); + } + + ui->srcCountLineEdit->clear(); + ui->srcCountLineEdit->insert(settings.value("sources").toString()); + ui->effectSlotLineEdit->clear(); + ui->effectSlotLineEdit->insert(settings.value("slots").toString()); + ui->srcSendLineEdit->clear(); + ui->srcSendLineEdit->insert(settings.value("sends").toString()); + + QString resampler = settings.value("resampler").toString().trimmed(); + if(resampler.isEmpty()) + ui->resamplerComboBox->setCurrentIndex(0); + else + { + for(int i = 1;i < ui->resamplerComboBox->count();i++) + { + QString item = ui->resamplerComboBox->itemText(i); + int end = item.indexOf(' '); + if(end < 0) end = item.size(); + if(resampler.size() == end && resampler.compare(item.leftRef(end), Qt::CaseInsensitive) == 0) + { + ui->resamplerComboBox->setCurrentIndex(i); + break; + } + } + } + + int periodsize = settings.value("period_size").toInt(); + ui->periodSizeEdit->clear(); + if(periodsize >= 64) + ui->periodSizeEdit->insert(QString::number(periodsize)); + + int periodcount = settings.value("periods").toInt(); + ui->periodCountEdit->clear(); + if(periodcount >= 2) + ui->periodCountEdit->insert(QString::number(periodcount)); + + QStringList disabledCpuExts = settings.value("disable-cpu-exts").toStringList(); + if(disabledCpuExts.size() == 1) + disabledCpuExts = disabledCpuExts[0].split(QChar(',')); + std::transform(disabledCpuExts.begin(), disabledCpuExts.end(), + disabledCpuExts.begin(), std::mem_fun_ref(&QString::trimmed)); + ui->disableSSECheckBox->setChecked(disabledCpuExts.contains("sse", Qt::CaseInsensitive)); + ui->disableSSE2CheckBox->setChecked(disabledCpuExts.contains("sse2", Qt::CaseInsensitive)); + ui->disableNeonCheckBox->setChecked(disabledCpuExts.contains("neon", Qt::CaseInsensitive)); + + if(settings.value("hrtf").toString() == QString()) + ui->hrtfEnableButton->setChecked(true); + else + { + if(settings.value("hrtf", true).toBool()) + ui->hrtfForceButton->setChecked(true); + else + ui->hrtfDisableButton->setChecked(true); + } + + QStringList hrtf_tables = settings.value("hrtf_tables").toStringList(); + if(hrtf_tables.size() == 1) + hrtf_tables = hrtf_tables[0].split(QChar(',')); + std::transform(hrtf_tables.begin(), hrtf_tables.end(), + hrtf_tables.begin(), std::mem_fun_ref(&QString::trimmed)); + ui->hrtfFileList->clear(); + ui->hrtfFileList->addItems(hrtf_tables); + + ui->enabledBackendList->clear(); + ui->disabledBackendList->clear(); + QStringList drivers = settings.value("drivers").toStringList(); + if(drivers.size() == 0) + ui->backendCheckBox->setChecked(true); + else + { + if(drivers.size() == 1) + drivers = drivers[0].split(QChar(',')); + std::transform(drivers.begin(), drivers.end(), + drivers.begin(), std::mem_fun_ref(&QString::trimmed)); + + bool lastWasEmpty = false; + foreach(const QString &backend, drivers) + { + lastWasEmpty = backend.isEmpty(); + if(!backend.startsWith(QChar('-')) && !lastWasEmpty) + ui->enabledBackendList->addItem(backend); + else if(backend.size() > 1) + ui->disabledBackendList->addItem(backend.right(backend.size()-1)); + } + ui->backendCheckBox->setChecked(lastWasEmpty); + } + + QString defaultreverb = settings.value("default-reverb").toString().toLower(); + ui->defaultReverbComboBox->setCurrentIndex(0); + if(defaultreverb.isEmpty() == false) + { + for(int i = 0;i < ui->defaultReverbComboBox->count();i++) + { + if(defaultreverb.compare(ui->defaultReverbComboBox->itemText(i).toLower()) == 0) + { + ui->defaultReverbComboBox->setCurrentIndex(i); + break; + } + } + } + + ui->emulateEaxCheckBox->setChecked(settings.value("reverb/emulate-eax", false).toBool()); + ui->reverbBoostEdit->clear(); + ui->reverbBoostEdit->insert(settings.value("reverb/boost").toString()); + + QStringList excludefx = settings.value("excludefx").toStringList(); + if(excludefx.size() == 1) + excludefx = excludefx[0].split(QChar(',')); + std::transform(excludefx.begin(), excludefx.end(), + excludefx.begin(), std::mem_fun_ref(&QString::trimmed)); + ui->disableEaxReverbCheck->setChecked(excludefx.contains("eaxreverb", Qt::CaseInsensitive)); + ui->disableStdReverbCheck->setChecked(excludefx.contains("reverb", Qt::CaseInsensitive)); + ui->disableChorusCheck->setChecked(excludefx.contains("chorus", Qt::CaseInsensitive)); + ui->disableDistortionCheck->setChecked(excludefx.contains("distortion", Qt::CaseInsensitive)); + ui->disableEchoCheck->setChecked(excludefx.contains("echo", Qt::CaseInsensitive)); + ui->disableEqualizerCheck->setChecked(excludefx.contains("equalizer", Qt::CaseInsensitive)); + ui->disableFlangerCheck->setChecked(excludefx.contains("flanger", Qt::CaseInsensitive)); + ui->disableModulatorCheck->setChecked(excludefx.contains("modulator", Qt::CaseInsensitive)); + ui->disableDedicatedCheck->setChecked(excludefx.contains("dedicated", Qt::CaseInsensitive)); +} + +void MainWindow::saveCurrentConfig() +{ + saveConfig(getDefaultConfigName()); + QMessageBox::information(this, tr("Information"), + tr("Applications using OpenAL need to be restarted for changes to take effect.")); +} + +void MainWindow::saveConfigAsFile() +{ + QString fname = QFileDialog::getOpenFileName(this, tr("Select Files")); + if(fname.isEmpty() == false) + saveConfig(fname); +} + +void MainWindow::saveConfig(const QString &fname) const +{ + QSettings settings(fname, QSettings::IniFormat); + + /* HACK: Compound any stringlist values into a comma-separated string. */ + QStringList allkeys = settings.allKeys(); + foreach(const QString &key, allkeys) + { + QStringList vals = settings.value(key).toStringList(); + if(vals.size() > 1) + settings.setValue(key, vals.join(QChar(','))); + } + + QString str = ui->sampleFormatCombo->currentText(); + str.truncate(str.indexOf('-')); + settings.setValue("sample-type", str.trimmed()); + + str = ui->channelConfigCombo->currentText(); + str.truncate(str.indexOf('-')); + settings.setValue("channels", str.trimmed()); + + uint rate = ui->sampleRateCombo->currentText().toUInt(); + if(rate == 0) + settings.setValue("frequency", QString()); + else + settings.setValue("frequency", rate); + + settings.setValue("period_size", ui->periodSizeEdit->text()); + settings.setValue("periods", ui->periodCountEdit->text()); + + settings.setValue("sources", ui->srcCountLineEdit->text()); + settings.setValue("slots", ui->effectSlotLineEdit->text()); + + if(ui->resamplerComboBox->currentIndex() == 0) + settings.setValue("resampler", QString()); + else + { + str = ui->resamplerComboBox->currentText(); + settings.setValue("resampler", str.split(' ').first().toLower()); + } + + QStringList strlist; + if(ui->disableSSECheckBox->isChecked()) + strlist.append("sse"); + if(ui->disableSSE2CheckBox->isChecked()) + strlist.append("sse2"); + if(ui->disableNeonCheckBox->isChecked()) + strlist.append("neon"); + settings.setValue("disable-cpu-exts", strlist.join(QChar(','))); + + if(ui->hrtfForceButton->isChecked()) + settings.setValue("hrtf", "true"); + else if(ui->hrtfDisableButton->isChecked()) + settings.setValue("hrtf", "false"); + else + settings.setValue("hrtf", QString()); + + strlist.clear(); + QList<QListWidgetItem*> items = ui->hrtfFileList->findItems("*", Qt::MatchWildcard); + foreach(const QListWidgetItem *item, items) + strlist.append(item->text()); + settings.setValue("hrtf_tables", strlist.join(QChar(','))); + + strlist.clear(); + items = ui->enabledBackendList->findItems("*", Qt::MatchWildcard); + foreach(const QListWidgetItem *item, items) + strlist.append(item->text()); + items = ui->disabledBackendList->findItems("*", Qt::MatchWildcard); + foreach(const QListWidgetItem *item, items) + strlist.append(QChar('-')+item->text()); + if(strlist.size() == 0 && !ui->backendCheckBox->isChecked()) + strlist.append("-all"); + else if(ui->backendCheckBox->isChecked()) + strlist.append(QString()); + settings.setValue("drivers", strlist.join(QChar(','))); + + // TODO: Remove check when we can properly match global values. + if(ui->defaultReverbComboBox->currentIndex() == 0) + settings.setValue("default-reverb", QString()); + else + { + str = ui->defaultReverbComboBox->currentText().toLower(); + settings.setValue("default-reverb", str); + } + + if(ui->emulateEaxCheckBox->isChecked()) + settings.setValue("reverb/emulate-eax", "true"); + else + settings.setValue("reverb/emulate-eax", QString()/*"false"*/); + + // TODO: Remove check when we can properly match global values. + if(ui->reverbBoostSlider->sliderPosition() == 0) + settings.setValue("reverb/boost", QString()); + else + settings.setValue("reverb/boost", ui->reverbBoostEdit->text()); + + strlist.clear(); + if(ui->disableEaxReverbCheck->isChecked()) + strlist.append("eaxreverb"); + if(ui->disableStdReverbCheck->isChecked()) + strlist.append("reverb"); + if(ui->disableChorusCheck->isChecked()) + strlist.append("chorus"); + if(ui->disableDistortionCheck->isChecked()) + strlist.append("distortion"); + if(ui->disableEchoCheck->isChecked()) + strlist.append("echo"); + if(ui->disableEqualizerCheck->isChecked()) + strlist.append("equalizer"); + if(ui->disableFlangerCheck->isChecked()) + strlist.append("flanger"); + if(ui->disableModulatorCheck->isChecked()) + strlist.append("modulator"); + if(ui->disableDedicatedCheck->isChecked()) + strlist.append("dedicated"); + settings.setValue("excludefx", strlist.join(QChar(','))); + + /* Remove empty keys + * FIXME: Should only remove keys whose value matches the globally-specified value. + */ + allkeys = settings.allKeys(); + foreach(const QString &key, allkeys) + { + str = settings.value(key).toString(); + if(str == QString()) + settings.remove(key); + } +} + + +void MainWindow::updatePeriodSizeEdit(int size) +{ + ui->periodSizeEdit->clear(); + if(size >= 64) + { + size = (size+32)&~0x3f; + ui->periodSizeEdit->insert(QString::number(size)); + } +} + +void MainWindow::updatePeriodSizeSlider() +{ + int pos = ui->periodSizeEdit->text().toInt(); + if(pos >= 64) + { + if(pos > 8192) + pos = 8192; + ui->periodSizeSlider->setSliderPosition(pos); + } +} + +void MainWindow::updatePeriodCountEdit(int count) +{ + ui->periodCountEdit->clear(); + if(count >= 2) + ui->periodCountEdit->insert(QString::number(count)); +} + +void MainWindow::updatePeriodCountSlider() +{ + int pos = ui->periodCountEdit->text().toInt(); + if(pos < 2) + pos = 0; + else if(pos > 16) + pos = 16; + ui->periodCountSlider->setSliderPosition(pos); +} + + +void MainWindow::addHrtfFile() +{ + QStringList fnames = QFileDialog::getOpenFileNames(this, tr("Select Files"), QString(), + "HRTF Datasets(*.mhr);;All Files(*.*)"); + if(fnames.isEmpty() == false) + ui->hrtfFileList->addItems(fnames); +} + +void MainWindow::removeHrtfFile() +{ + QList<QListWidgetItem*> selected = ui->hrtfFileList->selectedItems(); + foreach(QListWidgetItem *item, selected) + delete item; +} + +void MainWindow::showEnabledBackendMenu(QPoint pt) +{ + QMap<QAction*,QString> actionMap; + + pt = ui->enabledBackendList->mapToGlobal(pt); + + QMenu ctxmenu; + QAction *removeAction = ctxmenu.addAction(QIcon::fromTheme("list-remove"), "Remove"); + if(ui->enabledBackendList->selectedItems().size() == 0) + removeAction->setEnabled(false); + ctxmenu.addSeparator(); + for(size_t i = 0;backendMenuList[i].backend_name[0];i++) + { + QAction *action = ctxmenu.addAction(backendMenuList[i].menu_string); + actionMap[action] = backendMenuList[i].backend_name; + if(ui->enabledBackendList->findItems(backendMenuList[i].backend_name, Qt::MatchFixedString).size() != 0 || + ui->disabledBackendList->findItems(backendMenuList[i].backend_name, Qt::MatchFixedString).size() != 0) + action->setEnabled(false); + } + + QAction *gotAction = ctxmenu.exec(pt); + if(gotAction == removeAction) + { + QList<QListWidgetItem*> selected = ui->enabledBackendList->selectedItems(); + foreach(QListWidgetItem *item, selected) + delete item; + } + else if(gotAction != NULL) + { + QMap<QAction*,QString>::const_iterator iter = actionMap.find(gotAction); + if(iter != actionMap.end()) + ui->enabledBackendList->addItem(iter.value()); + } +} + +void MainWindow::showDisabledBackendMenu(QPoint pt) +{ + QMap<QAction*,QString> actionMap; + + pt = ui->disabledBackendList->mapToGlobal(pt); + + QMenu ctxmenu; + QAction *removeAction = ctxmenu.addAction(QIcon::fromTheme("list-remove"), "Remove"); + if(ui->disabledBackendList->selectedItems().size() == 0) + removeAction->setEnabled(false); + ctxmenu.addSeparator(); + for(size_t i = 0;backendMenuList[i].backend_name[0];i++) + { + QAction *action = ctxmenu.addAction(backendMenuList[i].menu_string); + actionMap[action] = backendMenuList[i].backend_name; + if(ui->disabledBackendList->findItems(backendMenuList[i].backend_name, Qt::MatchFixedString).size() != 0 || + ui->enabledBackendList->findItems(backendMenuList[i].backend_name, Qt::MatchFixedString).size() != 0) + action->setEnabled(false); + } + + QAction *gotAction = ctxmenu.exec(pt); + if(gotAction == removeAction) + { + QList<QListWidgetItem*> selected = ui->disabledBackendList->selectedItems(); + foreach(QListWidgetItem *item, selected) + delete item; + } + else if(gotAction != NULL) + { + QMap<QAction*,QString>::const_iterator iter = actionMap.find(gotAction); + if(iter != actionMap.end()) + ui->disabledBackendList->addItem(iter.value()); + } +} + +void MainWindow::updateReverbBoostEdit(int value) +{ + ui->reverbBoostEdit->clear(); + if(value != 0) + ui->reverbBoostEdit->insert(QString::number(value/10.0, 'f', 1)); +} + +void MainWindow::updateReverbBoostSlider(QString value) +{ + int pos = int(value.toFloat()*10.0f); + ui->reverbBoostSlider->setSliderPosition(pos); +} diff --git a/utils/alsoft-config/mainwindow.h b/utils/alsoft-config/mainwindow.h new file mode 100644 index 00000000..28e109a2 --- /dev/null +++ b/utils/alsoft-config/mainwindow.h @@ -0,0 +1,54 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include <QMainWindow> +#include <QListWidget> + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + +private slots: + void saveCurrentConfig(); + + void saveConfigAsFile(); + void loadConfigFromFile(); + + void updatePeriodSizeEdit(int size); + void updatePeriodSizeSlider(); + void updatePeriodCountEdit(int size); + void updatePeriodCountSlider(); + + void addHrtfFile(); + void removeHrtfFile(); + + void showEnabledBackendMenu(QPoint pt); + void showDisabledBackendMenu(QPoint pt); + + void updateReverbBoostEdit(int size); + void updateReverbBoostSlider(QString value); + +private: + Ui::MainWindow *ui; + + QValidator *mPeriodSizeValidator; + QValidator *mPeriodCountValidator; + QValidator *mSourceCountValidator; + QValidator *mEffectSlotValidator; + QValidator *mSourceSendValidator; + QValidator *mSampleRateValidator; + QValidator *mReverbBoostValidator; + + void loadConfig(const QString &fname); + void saveConfig(const QString &fname) const; +}; + +#endif // MAINWINDOW_H diff --git a/utils/alsoft-config/mainwindow.ui b/utils/alsoft-config/mainwindow.ui new file mode 100644 index 00000000..1344554f --- /dev/null +++ b/utils/alsoft-config/mainwindow.ui @@ -0,0 +1,1396 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>MainWindow</class> + <widget class="QMainWindow" name="MainWindow"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>564</width> + <height>473</height> + </rect> + </property> + <property name="windowTitle"> + <string>OpenAL Soft Configuration</string> + </property> + <property name="windowIcon"> + <iconset theme="preferences-desktop-sound"/> + </property> + <widget class="QWidget" name="centralWidget"> + <widget class="QPushButton" name="applyButton"> + <property name="geometry"> + <rect> + <x>470</x> + <y>405</y> + <width>81</width> + <height>25</height> + </rect> + </property> + <property name="text"> + <string>Apply</string> + </property> + <property name="icon"> + <iconset theme="dialog-ok-apply"/> + </property> + </widget> + <widget class="QTabWidget" name="tabWidget"> + <property name="geometry"> + <rect> + <x>10</x> + <y>0</y> + <width>541</width> + <height>401</height> + </rect> + </property> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="tab_3"> + <attribute name="title"> + <string>Playback</string> + </attribute> + <widget class="QComboBox" name="sampleFormatCombo"> + <property name="geometry"> + <rect> + <x>120</x> + <y>20</y> + <width>206</width> + <height>23</height> + </rect> + </property> + <property name="toolTip"> + <string>The output sample type. Currently, all mixing is done with 32-bit +float and converted to the output sample type as needed.</string> + </property> + <property name="sizeAdjustPolicy"> + <enum>QComboBox::AdjustToContents</enum> + </property> + <item> + <property name="text"> + <string>- Autodetect -</string> + </property> + </item> + <item> + <property name="text"> + <string>int8 - signed 8-bit int</string> + </property> + </item> + <item> + <property name="text"> + <string>uint8 - unsigned 8-bit int</string> + </property> + </item> + <item> + <property name="text"> + <string>int16 - signed 16-bit int</string> + </property> + </item> + <item> + <property name="text"> + <string>uint16 - unsigned 16-bit int</string> + </property> + </item> + <item> + <property name="text"> + <string>int32 - signed 32-bit int</string> + </property> + </item> + <item> + <property name="text"> + <string>uint32 - unsigned 32-bit int</string> + </property> + </item> + <item> + <property name="text"> + <string>float32 - 32-bit float</string> + </property> + </item> + </widget> + <widget class="QLabel" name="label_5"> + <property name="geometry"> + <rect> + <x>10</x> + <y>20</y> + <width>101</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Sample Format:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + <widget class="QLabel" name="label_6"> + <property name="geometry"> + <rect> + <x>10</x> + <y>50</y> + <width>101</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Channels:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + <widget class="QComboBox" name="channelConfigCombo"> + <property name="geometry"> + <rect> + <x>120</x> + <y>50</y> + <width>247</width> + <height>23</height> + </rect> + </property> + <property name="toolTip"> + <string>The output channel configuration. Note that not all backends +can properly detect the channel configuration and may default +to stereo output.</string> + </property> + <property name="sizeAdjustPolicy"> + <enum>QComboBox::AdjustToContents</enum> + </property> + <item> + <property name="text"> + <string>- Autodetect -</string> + </property> + </item> + <item> + <property name="text"> + <string>mono - 1-channel Mono</string> + </property> + </item> + <item> + <property name="text"> + <string>stereo - 2-channel Stereo</string> + </property> + </item> + <item> + <property name="text"> + <string>quad - 4-channel Quadraphonic</string> + </property> + </item> + <item> + <property name="text"> + <string>surround51 - 5.1 Surround Sound</string> + </property> + </item> + <item> + <property name="text"> + <string>surround61 - 6.1 Surround Sound</string> + </property> + </item> + <item> + <property name="text"> + <string>surround71 - 7.1 Surround Sound</string> + </property> + </item> + </widget> + <widget class="QComboBox" name="sampleRateCombo"> + <property name="geometry"> + <rect> + <x>120</x> + <y>80</y> + <width>123</width> + <height>22</height> + </rect> + </property> + <property name="toolTip"> + <string>The playback/mixing sample rate.</string> + </property> + <property name="editable"> + <bool>true</bool> + </property> + <property name="insertPolicy"> + <enum>QComboBox::NoInsert</enum> + </property> + <property name="sizeAdjustPolicy"> + <enum>QComboBox::AdjustToContents</enum> + </property> + <item> + <property name="text"> + <string>- Autodetect -</string> + </property> + </item> + <item> + <property name="text"> + <string>96000</string> + </property> + </item> + <item> + <property name="text"> + <string>48000</string> + </property> + </item> + <item> + <property name="text"> + <string>44100</string> + </property> + </item> + <item> + <property name="text"> + <string>32000</string> + </property> + </item> + <item> + <property name="text"> + <string>22050</string> + </property> + </item> + <item> + <property name="text"> + <string>16000</string> + </property> + </item> + <item> + <property name="text"> + <string>11025</string> + </property> + </item> + <item> + <property name="text"> + <string>8000</string> + </property> + </item> + </widget> + <widget class="QLabel" name="label_7"> + <property name="geometry"> + <rect> + <x>10</x> + <y>80</y> + <width>101</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Sample Rate:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + <widget class="QGroupBox" name="groupBox"> + <property name="geometry"> + <rect> + <x>10</x> + <y>200</y> + <width>511</width> + <height>161</height> + </rect> + </property> + <property name="title"> + <string>HRTF (Stereo only)</string> + </property> + <widget class="QRadioButton" name="hrtfEnableButton"> + <property name="geometry"> + <rect> + <x>20</x> + <y>30</y> + <width>71</width> + <height>21</height> + </rect> + </property> + <property name="toolTip"> + <string>Allows applications to request HRTF mixing.</string> + </property> + <property name="text"> + <string>Enable</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QRadioButton" name="hrtfDisableButton"> + <property name="geometry"> + <rect> + <x>20</x> + <y>50</y> + <width>71</width> + <height>21</height> + </rect> + </property> + <property name="toolTip"> + <string>Does not allow HRTF mixing, even when requested.</string> + </property> + <property name="text"> + <string>Disable</string> + </property> + </widget> + <widget class="QRadioButton" name="hrtfForceButton"> + <property name="geometry"> + <rect> + <x>20</x> + <y>70</y> + <width>71</width> + <height>21</height> + </rect> + </property> + <property name="toolTip"> + <string>Attempts to force HRTF mixing, even if applications request not +to do it. This may override the channel configuration and +sample rate.</string> + </property> + <property name="text"> + <string>Force</string> + </property> + </widget> + <widget class="QListWidget" name="hrtfFileList"> + <property name="geometry"> + <rect> + <x>110</x> + <y>30</y> + <width>361</width> + <height>121</height> + </rect> + </property> + <property name="toolTip"> + <string>A list of files containing HRTF data sets. The listed data sets +are used in place of or in addiiton to the the built-in set. The +filenames may contain these markers, which will be replaced +as needed: +%r - Device sampling rate +%% - Percent sign (%)</string> + </property> + <property name="dragEnabled"> + <bool>false</bool> + </property> + <property name="dragDropMode"> + <enum>QAbstractItemView::InternalMove</enum> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + <property name="textElideMode"> + <enum>Qt::ElideNone</enum> + </property> + </widget> + <widget class="QPushButton" name="hrtfAddButton"> + <property name="geometry"> + <rect> + <x>475</x> + <y>30</y> + <width>25</width> + <height>25</height> + </rect> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset theme="list-add"> + <normaloff/> + </iconset> + </property> + <property name="flat"> + <bool>false</bool> + </property> + </widget> + <widget class="QPushButton" name="hrtfRemoveButton"> + <property name="geometry"> + <rect> + <x>475</x> + <y>60</y> + <width>25</width> + <height>25</height> + </rect> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset theme="list-remove"> + <normaloff/> + </iconset> + </property> + </widget> + </widget> + <widget class="QGroupBox" name="groupBox_3"> + <property name="geometry"> + <rect> + <x>10</x> + <y>110</y> + <width>511</width> + <height>91</height> + </rect> + </property> + <property name="title"> + <string>Buffer Metrics</string> + </property> + <widget class="QWidget" name="widget" native="true"> + <property name="geometry"> + <rect> + <x>260</x> + <y>20</y> + <width>241</width> + <height>51</height> + </rect> + </property> + <property name="toolTip"> + <string>The number of update periods. Higher values create a larger +mix ahead, which helps protect against skips when the CPU is +under load, but increases the delay between a sound getting +mixed and being heard.</string> + </property> + <widget class="QLabel" name="label_11"> + <property name="geometry"> + <rect> + <x>20</x> + <y>0</y> + <width>201</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Period Count</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + <widget class="QSlider" name="periodCountSlider"> + <property name="geometry"> + <rect> + <x>70</x> + <y>20</y> + <width>160</width> + <height>23</height> + </rect> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>16</number> + </property> + <property name="singleStep"> + <number>1</number> + </property> + <property name="pageStep"> + <number>2</number> + </property> + <property name="value"> + <number>1</number> + </property> + <property name="tracking"> + <bool>true</bool> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="tickPosition"> + <enum>QSlider::TicksBelow</enum> + </property> + <property name="tickInterval"> + <number>1</number> + </property> + </widget> + <widget class="QLineEdit" name="periodCountEdit"> + <property name="geometry"> + <rect> + <x>20</x> + <y>20</y> + <width>51</width> + <height>22</height> + </rect> + </property> + <property name="placeholderText"> + <string>4</string> + </property> + </widget> + </widget> + <widget class="QWidget" name="widget_2" native="true"> + <property name="geometry"> + <rect> + <x>10</x> + <y>20</y> + <width>241</width> + <height>51</height> + </rect> + </property> + <property name="toolTip"> + <string>The update period size, in sample frames. This is the number of +frames needed for each mixing update.</string> + </property> + <widget class="QSlider" name="periodSizeSlider"> + <property name="geometry"> + <rect> + <x>60</x> + <y>20</y> + <width>160</width> + <height>23</height> + </rect> + </property> + <property name="minimum"> + <number>0</number> + </property> + <property name="maximum"> + <number>8192</number> + </property> + <property name="singleStep"> + <number>64</number> + </property> + <property name="pageStep"> + <number>1024</number> + </property> + <property name="value"> + <number>0</number> + </property> + <property name="tracking"> + <bool>true</bool> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="tickPosition"> + <enum>QSlider::TicksBelow</enum> + </property> + <property name="tickInterval"> + <number>512</number> + </property> + </widget> + <widget class="QLabel" name="label_10"> + <property name="geometry"> + <rect> + <x>10</x> + <y>0</y> + <width>201</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Period Samples</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + <widget class="QLineEdit" name="periodSizeEdit"> + <property name="geometry"> + <rect> + <x>10</x> + <y>20</y> + <width>51</width> + <height>22</height> + </rect> + </property> + <property name="placeholderText"> + <string>1024</string> + </property> + </widget> + </widget> + </widget> + </widget> + <widget class="QWidget" name="tab_2"> + <attribute name="title"> + <string>Resources</string> + </attribute> + <widget class="QLineEdit" name="srcCountLineEdit"> + <property name="geometry"> + <rect> + <x>190</x> + <y>20</y> + <width>51</width> + <height>22</height> + </rect> + </property> + <property name="toolTip"> + <string>The maximum number of allocatable sources. Lower values may +help for systems with apps that try to play more sounds than +the CPU can handle.</string> + </property> + <property name="inputMask"> + <string/> + </property> + <property name="maxLength"> + <number>3</number> + </property> + <property name="frame"> + <bool>true</bool> + </property> + <property name="placeholderText"> + <string>256</string> + </property> + </widget> + <widget class="QLabel" name="label_3"> + <property name="geometry"> + <rect> + <x>10</x> + <y>20</y> + <width>171</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Number of Sound Sources:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + <widget class="QLabel" name="label_4"> + <property name="geometry"> + <rect> + <x>10</x> + <y>50</y> + <width>171</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Number of Effect Slots:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + <widget class="QLineEdit" name="effectSlotLineEdit"> + <property name="geometry"> + <rect> + <x>190</x> + <y>50</y> + <width>51</width> + <height>22</height> + </rect> + </property> + <property name="toolTip"> + <string>The maximum number of Auxiliary Effect Slots an app can +create. A slot can use a non-negligible amount of CPU time if +an effect is set on it even if no sources are feeding it, so this +may help when apps use more than the system can handle.</string> + </property> + <property name="inputMask"> + <string/> + </property> + <property name="maxLength"> + <number>1</number> + </property> + <property name="frame"> + <bool>true</bool> + </property> + <property name="placeholderText"> + <string>4</string> + </property> + </widget> + <widget class="QLabel" name="label_8"> + <property name="geometry"> + <rect> + <x>10</x> + <y>80</y> + <width>171</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Number of Source Sends:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + <widget class="QLineEdit" name="srcSendLineEdit"> + <property name="geometry"> + <rect> + <x>190</x> + <y>80</y> + <width>51</width> + <height>22</height> + </rect> + </property> + <property name="toolTip"> + <string>The number of auxiliary sends per source. When not specified, +it allows the app to request how many it wants. The maximum +value currently possible is 4.</string> + </property> + <property name="maxLength"> + <number>1</number> + </property> + <property name="placeholderText"> + <string>Auto</string> + </property> + </widget> + <widget class="QLabel" name="label_9"> + <property name="geometry"> + <rect> + <x>30</x> + <y>120</y> + <width>71</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Resampler:</string> + </property> + </widget> + <widget class="QComboBox" name="resamplerComboBox"> + <property name="geometry"> + <rect> + <x>110</x> + <y>120</y> + <width>203</width> + <height>23</height> + </rect> + </property> + <property name="toolTip"> + <string>The resampling method used when mixing sources.</string> + </property> + <property name="sizeAdjustPolicy"> + <enum>QComboBox::AdjustToContents</enum> + </property> + <item> + <property name="text"> + <string>- Default -</string> + </property> + </item> + <item> + <property name="text"> + <string>Point (low quality, fast)</string> + </property> + </item> + <item> + <property name="text"> + <string>Linear (basic quality, fast)</string> + </property> + </item> + <item> + <property name="text"> + <string>Cubic Spline (good quality)</string> + </property> + </item> + </widget> + <widget class="QGroupBox" name="groupBox_2"> + <property name="geometry"> + <rect> + <x>10</x> + <y>150</y> + <width>511</width> + <height>61</height> + </rect> + </property> + <property name="toolTip"> + <string>Disables use of specific CPU extensions. Certain methods may +utilize CPU extensions when detected, and this is useful for +preventing those extensions from being used.</string> + </property> + <property name="title"> + <string>CPU Extensions</string> + </property> + <widget class="QCheckBox" name="disableSSECheckBox"> + <property name="geometry"> + <rect> + <x>10</x> + <y>20</y> + <width>101</width> + <height>31</height> + </rect> + </property> + <property name="text"> + <string>Disable SSE</string> + </property> + </widget> + <widget class="QCheckBox" name="disableSSE2CheckBox"> + <property name="geometry"> + <rect> + <x>200</x> + <y>20</y> + <width>111</width> + <height>31</height> + </rect> + </property> + <property name="text"> + <string>Disable SSE2</string> + </property> + </widget> + <widget class="QCheckBox" name="disableNeonCheckBox"> + <property name="geometry"> + <rect> + <x>380</x> + <y>20</y> + <width>111</width> + <height>31</height> + </rect> + </property> + <property name="text"> + <string>Disable Neon</string> + </property> + </widget> + </widget> + </widget> + <widget class="QWidget" name="tab"> + <attribute name="title"> + <string>Backends</string> + </attribute> + <widget class="QCheckBox" name="backendCheckBox"> + <property name="geometry"> + <rect> + <x>170</x> + <y>200</y> + <width>161</width> + <height>21</height> + </rect> + </property> + <property name="toolTip"> + <string>When checked, allows all other available backends not listed in the priority or disabled lists.</string> + </property> + <property name="text"> + <string>Allow Other Backends</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QListWidget" name="enabledBackendList"> + <property name="geometry"> + <rect> + <x>40</x> + <y>40</y> + <width>191</width> + <height>151</height> + </rect> + </property> + <property name="toolTip"> + <string>The backend driver list order. Unknown backends and +duplicated names are ignored.</string> + </property> + <property name="dragDropMode"> + <enum>QAbstractItemView::InternalMove</enum> + </property> + </widget> + <widget class="QLabel" name="label"> + <property name="geometry"> + <rect> + <x>40</x> + <y>20</y> + <width>191</width> + <height>20</height> + </rect> + </property> + <property name="text"> + <string>Priority Backends:</string> + </property> + </widget> + <widget class="QListWidget" name="disabledBackendList"> + <property name="geometry"> + <rect> + <x>270</x> + <y>40</y> + <width>191</width> + <height>151</height> + </rect> + </property> + <property name="toolTip"> + <string>Disabled backend driver list.</string> + </property> + </widget> + <widget class="QLabel" name="label_2"> + <property name="geometry"> + <rect> + <x>270</x> + <y>20</y> + <width>191</width> + <height>20</height> + </rect> + </property> + <property name="text"> + <string>Disabled Backends:</string> + </property> + </widget> + </widget> + <widget class="QWidget" name="tab_4"> + <attribute name="title"> + <string>Effects</string> + </attribute> + <widget class="QCheckBox" name="emulateEaxCheckBox"> + <property name="geometry"> + <rect> + <x>10</x> + <y>60</y> + <width>161</width> + <height>21</height> + </rect> + </property> + <property name="toolTip"> + <string>Uses a simpler reverb method to emulate the EAX reverb +effect. This may slightly improve performance at the cost of +some quality.</string> + </property> + <property name="layoutDirection"> + <enum>Qt::RightToLeft</enum> + </property> + <property name="text"> + <string>Emulate EAX Reverb:</string> + </property> + </widget> + <widget class="QGroupBox" name="groupBox_4"> + <property name="geometry"> + <rect> + <x>10</x> + <y>100</y> + <width>511</width> + <height>61</height> + </rect> + </property> + <property name="toolTip"> + <string>Global amplification for reverb output, expressed in decibels. ++6 will be a scale of (approximately) 2x, +12 will be a scale of +4x, etc. Similarly, -6 will be about half, and -12 about 1/4th. A +value of 0 means no change.</string> + </property> + <property name="title"> + <string>Reverb Boost</string> + </property> + <widget class="QSlider" name="reverbBoostSlider"> + <property name="geometry"> + <rect> + <x>10</x> + <y>30</y> + <width>391</width> + <height>23</height> + </rect> + </property> + <property name="toolTip"> + <string/> + </property> + <property name="minimum"> + <number>-120</number> + </property> + <property name="maximum"> + <number>120</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="tickPosition"> + <enum>QSlider::TicksBelow</enum> + </property> + <property name="tickInterval"> + <number>10</number> + </property> + </widget> + <widget class="QLineEdit" name="reverbBoostEdit"> + <property name="geometry"> + <rect> + <x>410</x> + <y>30</y> + <width>51</width> + <height>22</height> + </rect> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + <property name="placeholderText"> + <string>0.0</string> + </property> + </widget> + <widget class="QLabel" name="label_12"> + <property name="geometry"> + <rect> + <x>460</x> + <y>30</y> + <width>31</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>dB</string> + </property> + </widget> + </widget> + <widget class="QGroupBox" name="groupBox_5"> + <property name="geometry"> + <rect> + <x>9</x> + <y>170</y> + <width>511</width> + <height>181</height> + </rect> + </property> + <property name="toolTip"> + <string>Disables effects, preventing apps from recognizing them. This +can help for apps that try to use effects which are too CPU +intensive for the system to handle.</string> + </property> + <property name="title"> + <string>Disabled Effects</string> + </property> + <widget class="QCheckBox" name="disableEaxReverbCheck"> + <property name="geometry"> + <rect> + <x>70</x> + <y>30</y> + <width>131</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>EAX Reverb</string> + </property> + </widget> + <widget class="QCheckBox" name="disableStdReverbCheck"> + <property name="geometry"> + <rect> + <x>70</x> + <y>60</y> + <width>131</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Standard Reverb</string> + </property> + </widget> + <widget class="QCheckBox" name="disableChorusCheck"> + <property name="geometry"> + <rect> + <x>70</x> + <y>90</y> + <width>131</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Chorus</string> + </property> + </widget> + <widget class="QCheckBox" name="disableDistortionCheck"> + <property name="geometry"> + <rect> + <x>70</x> + <y>120</y> + <width>131</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Distortion</string> + </property> + </widget> + <widget class="QCheckBox" name="disableEchoCheck"> + <property name="geometry"> + <rect> + <x>70</x> + <y>150</y> + <width>131</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Echo</string> + </property> + </widget> + <widget class="QCheckBox" name="disableEqualizerCheck"> + <property name="geometry"> + <rect> + <x>320</x> + <y>30</y> + <width>131</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Equalizer</string> + </property> + </widget> + <widget class="QCheckBox" name="disableFlangerCheck"> + <property name="geometry"> + <rect> + <x>320</x> + <y>60</y> + <width>131</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Flanger</string> + </property> + </widget> + <widget class="QCheckBox" name="disableModulatorCheck"> + <property name="geometry"> + <rect> + <x>320</x> + <y>90</y> + <width>131</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Ring Modulator</string> + </property> + </widget> + <widget class="QCheckBox" name="disableDedicatedCheck"> + <property name="geometry"> + <rect> + <x>320</x> + <y>120</y> + <width>131</width> + <height>21</height> + </rect> + </property> + <property name="toolTip"> + <string>Disables both the Dedicated Dialog and Dedicated LFE effects +added by the ALC_EXT_DEDICATED extension.</string> + </property> + <property name="text"> + <string>Dedicated ...</string> + </property> + </widget> + </widget> + <widget class="QLabel" name="label_13"> + <property name="geometry"> + <rect> + <x>10</x> + <y>20</y> + <width>141</width> + <height>21</height> + </rect> + </property> + <property name="text"> + <string>Default Reverb Effect:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + <widget class="QComboBox" name="defaultReverbComboBox"> + <property name="geometry"> + <rect> + <x>160</x> + <y>20</y> + <width>142</width> + <height>23</height> + </rect> + </property> + <property name="sizeAdjustPolicy"> + <enum>QComboBox::AdjustToContents</enum> + </property> + <item> + <property name="text"> + <string>None</string> + </property> + </item> + <item> + <property name="text"> + <string>Generic</string> + </property> + </item> + <item> + <property name="text"> + <string>PaddedCell</string> + </property> + </item> + <item> + <property name="text"> + <string>Room</string> + </property> + </item> + <item> + <property name="text"> + <string>Bathroom</string> + </property> + </item> + <item> + <property name="text"> + <string>Livingroom</string> + </property> + </item> + <item> + <property name="text"> + <string>Stoneroom</string> + </property> + </item> + <item> + <property name="text"> + <string>Auditorium</string> + </property> + </item> + <item> + <property name="text"> + <string>ConcertHall</string> + </property> + </item> + <item> + <property name="text"> + <string>Cave</string> + </property> + </item> + <item> + <property name="text"> + <string>Arena</string> + </property> + </item> + <item> + <property name="text"> + <string>Hangar</string> + </property> + </item> + <item> + <property name="text"> + <string>CarpetedHallway</string> + </property> + </item> + <item> + <property name="text"> + <string>Hallway</string> + </property> + </item> + <item> + <property name="text"> + <string>StoneCorridor</string> + </property> + </item> + <item> + <property name="text"> + <string>Alley</string> + </property> + </item> + <item> + <property name="text"> + <string>Forest</string> + </property> + </item> + <item> + <property name="text"> + <string>City</string> + </property> + </item> + <item> + <property name="text"> + <string>Mountains</string> + </property> + </item> + <item> + <property name="text"> + <string>Quarry</string> + </property> + </item> + <item> + <property name="text"> + <string>Plain</string> + </property> + </item> + <item> + <property name="text"> + <string>ParkingLot</string> + </property> + </item> + <item> + <property name="text"> + <string>SewerPipe</string> + </property> + </item> + <item> + <property name="text"> + <string>Underwater</string> + </property> + </item> + <item> + <property name="text"> + <string>Drugged</string> + </property> + </item> + <item> + <property name="text"> + <string>Dizzy</string> + </property> + </item> + <item> + <property name="text"> + <string>Psychotic</string> + </property> + </item> + </widget> + </widget> + </widget> + </widget> + <widget class="QMenuBar" name="menuBar"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>564</width> + <height>20</height> + </rect> + </property> + <widget class="QMenu" name="menuFile"> + <property name="title"> + <string>&File</string> + </property> + <addaction name="actionLoad"/> + <addaction name="actionSave_As"/> + <addaction name="separator"/> + <addaction name="actionQuit"/> + </widget> + <addaction name="menuFile"/> + </widget> + <widget class="QToolBar" name="mainToolBar"> + <attribute name="toolBarArea"> + <enum>TopToolBarArea</enum> + </attribute> + <attribute name="toolBarBreak"> + <bool>false</bool> + </attribute> + </widget> + <widget class="QStatusBar" name="statusBar"/> + <action name="actionQuit"> + <property name="icon"> + <iconset theme="application-exit"/> + </property> + <property name="text"> + <string>&Quit</string> + </property> + </action> + <action name="actionSave_As"> + <property name="icon"> + <iconset theme="document-save-as"/> + </property> + <property name="text"> + <string>Save &As...</string> + </property> + <property name="toolTip"> + <string>Save Configuration As</string> + </property> + </action> + <action name="actionLoad"> + <property name="icon"> + <iconset theme="document-open"/> + </property> + <property name="text"> + <string>&Load...</string> + </property> + <property name="toolTip"> + <string>Load Configuration File</string> + </property> + </action> + </widget> + <layoutdefault spacing="6" margin="11"/> + <resources/> + <connections> + <connection> + <sender>actionQuit</sender> + <signal>activated()</signal> + <receiver>MainWindow</receiver> + <slot>close()</slot> + <hints> + <hint type="sourcelabel"> + <x>-1</x> + <y>-1</y> + </hint> + <hint type="destinationlabel"> + <x>267</x> + <y>181</y> + </hint> + </hints> + </connection> + </connections> + <slots> + <slot>ShowHRTFContextMenu(QPoint)</slot> + </slots> +</ui> |