drumstick 2.11.1
C++ MIDI libraries using Qt objects, idioms, and style.
sonivoxsettingsdialog.cpp
Go to the documentation of this file.
1/*
2 Virtual Piano test using the MIDI Sequencer C++ library
3 Copyright (C) 2006-2026, 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 <QDialogButtonBox>
20#include <QPushButton>
21#include <QMessageBox>
22#include <QDir>
23#include <QStandardPaths>
24#include <QFileDialog>
25
27#include "ui_sonivoxsettingsdialog.h"
30
35
36namespace drumstick { namespace widgets {
37
38const QString SonivoxSettingsDialog::QSTR_PREFERENCES = QStringLiteral("SonivoxEAS");
39const QString SonivoxSettingsDialog::QSTR_BUFFERTIME = QStringLiteral("BufferTime");
40const QString SonivoxSettingsDialog::QSTR_REVERBTYPE = QStringLiteral("ReverbType");
41const QString SonivoxSettingsDialog::QSTR_REVERBAMT = QStringLiteral("ReverbAmt");
42const QString SonivoxSettingsDialog::QSTR_CHORUSTYPE = QStringLiteral("ChorusType");
43const QString SonivoxSettingsDialog::QSTR_CHORUSAMT = QStringLiteral("ChorusAmt");
44const QString SonivoxSettingsDialog::QSTR_SOUNDFONT = QStringLiteral("InstrumentsDefinition");
45const QString SonivoxSettingsDialog::QSTR_DATADIR = QStringLiteral("soundfonts");
46const QString SonivoxSettingsDialog::QSTR_DATADIR2 = QStringLiteral("sounds/sf2");
47const QString SonivoxSettingsDialog::QSTR_SYNTHLIB = QStringLiteral("SynthLib");
48const int SonivoxSettingsDialog::SYNTHLIB_WT = 1;
49const int SonivoxSettingsDialog::SYNTHLIB_FM = 2;
50
51SonivoxSettingsDialog::SonivoxSettingsDialog(QWidget *parent) :
52 QDialog(parent),
53 ui(new Ui::SonivoxSettingsDialog)
54{
55 ui->setupUi(this);
56 ui->combo_Reverb->addItem(QStringLiteral("Large Hall"), 0);
57 ui->combo_Reverb->addItem(QStringLiteral("Hall"), 1);
58 ui->combo_Reverb->addItem(QStringLiteral("Chamber"), 2);
59 ui->combo_Reverb->addItem(QStringLiteral("Room"), 3);
60 ui->combo_Reverb->addItem(QStringLiteral("None"), -1);
61 ui->combo_Reverb->setCurrentIndex(4);
62
63 ui->combo_Chorus->addItem(QStringLiteral("Preset 1"), 0);
64 ui->combo_Chorus->addItem(QStringLiteral("Preset 2"), 1);
65 ui->combo_Chorus->addItem(QStringLiteral("Preset 3"), 2);
66 ui->combo_Chorus->addItem(QStringLiteral("Preset 4"), 3);
67 ui->combo_Chorus->addItem(QStringLiteral("None"), -1);
68 ui->combo_Chorus->setCurrentIndex(4);
69 connect(ui->btn_soundfont, &QToolButton::clicked, this, &SonivoxSettingsDialog::showFileDialog);
70 connect(ui->buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::pressed,
71 this, &SonivoxSettingsDialog::restoreDefaults);
72
74 m_driver = man->outputBackendByName("SonivoxEAS");
75 //qDebug() << Q_FUNC_INFO;
76}
77
78SonivoxSettingsDialog::~SonivoxSettingsDialog()
79{
80 //qDebug() << Q_FUNC_INFO;
81 if (m_driver != nullptr) {
82 m_driver->close();
83 }
84 delete ui;
85}
86
87void SonivoxSettingsDialog::accept()
88{
89 //qDebug() << Q_FUNC_INFO;
90 writeSettings();
91 if (m_driver != nullptr) {
92 QString title;
93 QVariant varStatus = m_driver->property("status");
94 if (varStatus.isValid()) {
95 title = varStatus.toBool() ? tr("Sonivox Initialized") : tr("Sonivox Initialization Failed");
96 QVariant varDiag = m_driver->property("diagnostics");
97 if (varDiag.isValid()) {
98 QString text = varDiag.toStringList().join(QChar::LineFeed).trimmed();
99 if (varStatus.toBool()) {
100 if (!text.isEmpty()) {
101 QMessageBox::information(this, title, text);
102 }
103 } else {
104 QMessageBox::critical(this, title, text);
105 return;
106 }
107 }
108 }
109 }
110 QDialog::accept();
111}
112
113void SonivoxSettingsDialog::showEvent(QShowEvent *event)
114{
115 //qDebug() << Q_FUNC_INFO;
116 readSettings();
117 event->accept();
118}
119
120void SonivoxSettingsDialog::readSettings()
121{
122 //qDebug() << Q_FUNC_INFO;
123 SettingsFactory settings;
124 settings->beginGroup(QSTR_PREFERENCES);
125 int bufferTime = settings->value(QSTR_BUFFERTIME, 30).toInt();
126 int reverbType = settings->value(QSTR_REVERBTYPE, 1).toInt();
127 int reverbAmt = settings->value(QSTR_REVERBAMT, 25800).toInt();
128 int chorusType = settings->value(QSTR_CHORUSTYPE, -1).toInt();
129 int chorusAmt = settings->value(QSTR_CHORUSAMT, 0).toInt();
130 int synthLib = settings->value(QSTR_SYNTHLIB, SYNTHLIB_WT).toInt();
131 QString soundfont = settings->value(QSTR_SOUNDFONT, QString()).toString();
132 settings->endGroup();
133
134 if (qEnvironmentVariableIsSet("PULSE_LATENCY_MSEC")) {
135 bufferTime = qEnvironmentVariableIntValue("PULSE_LATENCY_MSEC");
136 }
137
138 ui->spnTime->setValue(bufferTime);
139 ui->soundfont_dls->setText(soundfont);
140 ui->dial_Reverb->setValue(reverbAmt);
141 ui->dial_Chorus->setValue(chorusAmt);
142 int reverbIndex = ui->combo_Reverb->findData(reverbType);
143 int chorusIndex = ui->combo_Chorus->findData(chorusType);
144 ui->combo_Reverb->setCurrentIndex(reverbIndex);
145 ui->combo_Chorus->setCurrentIndex(chorusIndex);
146 switch (synthLib) {
147 case 1:
148 ui->rbWT->setChecked(true);
149 break;
150 case 2:
151 ui->rbFM->setChecked(true);
152 break;
153 default:
154 break;
155 }
156 ui->btn_soundfont->setEnabled(synthLib == 1);
157 ui->soundfont_dls->setEnabled(synthLib == 1);
158
159 chkDriverProperties(settings.getQSettings());
160}
161
162void SonivoxSettingsDialog::writeSettings()
163{
164 //qDebug() << Q_FUNC_INFO;
165 SettingsFactory settings;
166 settings->beginGroup(QSTR_PREFERENCES);
167 settings->setValue(QSTR_BUFFERTIME, ui->spnTime->value());
168 settings->setValue(QSTR_REVERBTYPE, ui->combo_Reverb->currentData());
169 settings->setValue(QSTR_CHORUSTYPE, ui->combo_Chorus->currentData());
170 settings->setValue(QSTR_REVERBAMT, ui->dial_Reverb->value());
171 settings->setValue(QSTR_CHORUSAMT, ui->dial_Chorus->value());
172 settings->setValue(QSTR_SOUNDFONT, ui->soundfont_dls->text());
173 settings->setValue(QSTR_SYNTHLIB, ui->rbFM->isChecked() ? SYNTHLIB_FM : SYNTHLIB_WT);
174 settings->endGroup();
175 settings->sync();
176 qputenv("PULSE_LATENCY_MSEC", QByteArray::number( ui->spnTime->value() ));
177 chkDriverProperties(settings.getQSettings());
178}
179
180void SonivoxSettingsDialog::chkDriverProperties(QSettings *settings)
181{
182 //qDebug() << Q_FUNC_INFO;
183 if (m_driver != nullptr) {
184 //drumstick::rt::MIDIConnection conn;
185 m_driver->close();
186 m_driver->initialize(settings);
187 QVariant varVersion = m_driver->property("libversion");
188 if (varVersion.isValid()) {
189 ui->lblLibraryText->clear();
190 ui->lblLibraryText->setText(varVersion.toString());
191 }
192 QVariant varStatus = m_driver->property("status");
193 if (varStatus.isValid()) {
194 ui->lblStatusText->clear();
195 ui->lblStatusText->setText(varStatus.toBool() ? tr("Ready") : tr("Failed") );
196 ui->lblStatusIcon->setPixmap(varStatus.toBool() ? QPixmap(":/checked.png") : QPixmap(":/error.png") );
197 }
198 }
199}
200
201void SonivoxSettingsDialog::restoreDefaults()
202{
203 ui->spnTime->setValue(30);
204 ui->soundfont_dls->clear();
205 ui->combo_Reverb->setCurrentIndex(1);
206 ui->dial_Reverb->setValue(25800);
207 ui->combo_Chorus->setCurrentIndex(4);
208 ui->dial_Chorus->setValue(0);
209}
210
211void SonivoxSettingsDialog::showFileDialog()
212{
213 QDir dir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR, QStandardPaths::LocateDirectory));
214 if (!dir.exists()) {
215 dir = QDir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR2, QStandardPaths::LocateDirectory));
216 }
217 QString fileName = QFileDialog::getOpenFileName(this,
218 tr("Select SoundFont"),
219 dir.absolutePath(),
220 tr("SoundFont Files (*.dls *.sf2)"));
221 if (!fileName.isEmpty()) {
222 ui->soundfont_dls->setText(fileName);
223 }
224}
225
226void SonivoxSettingsDialog::changeSoundFont(const QString& fileName)
227{
228 readSettings();
229 ui->soundfont_dls->setText(fileName);
230 writeSettings();
231}
232
233} // namespace widgets
234} // namespace drumstick
235
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
BackendManager DRUMSTICK_RT_EXPORT * lastBackendManagerInstance()
lastBackendManagerInstance provides the latest BackendManager instance, or a new instance if needed.
Drumstick Widgets library MIDI related widgets and functions.
Drumstick common.
SettingsFactory class declaration.
Definition of the Sonivox Synth configuration dialog.