drumstick 2.11.2
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 QString SonivoxSettingsDialog::QSTR_GAIN = QStringLiteral("Gain");
49const int SonivoxSettingsDialog::SYNTHLIB_WT = 1;
50const int SonivoxSettingsDialog::SYNTHLIB_FM = 2;
51
52SonivoxSettingsDialog::SonivoxSettingsDialog(QWidget *parent) :
53 QDialog(parent),
54 ui(new Ui::SonivoxSettingsDialog)
55{
56 ui->setupUi(this);
57 ui->combo_Reverb->addItem(QStringLiteral("Large Hall"), 0);
58 ui->combo_Reverb->addItem(QStringLiteral("Hall"), 1);
59 ui->combo_Reverb->addItem(QStringLiteral("Chamber"), 2);
60 ui->combo_Reverb->addItem(QStringLiteral("Room"), 3);
61 ui->combo_Reverb->addItem(QStringLiteral("None"), -1);
62 ui->combo_Reverb->setCurrentIndex(4);
63
64 ui->combo_Chorus->addItem(QStringLiteral("Preset 1"), 0);
65 ui->combo_Chorus->addItem(QStringLiteral("Preset 2"), 1);
66 ui->combo_Chorus->addItem(QStringLiteral("Preset 3"), 2);
67 ui->combo_Chorus->addItem(QStringLiteral("Preset 4"), 3);
68 ui->combo_Chorus->addItem(QStringLiteral("None"), -1);
69 ui->combo_Chorus->setCurrentIndex(4);
70 connect(ui->btn_soundfont, &QToolButton::clicked, this, &SonivoxSettingsDialog::showFileDialog);
71 connect(ui->buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::pressed,
72 this, &SonivoxSettingsDialog::restoreDefaults);
73 connect(ui->sliderGain,
74 &QSlider::valueChanged,
75 ui->lblGain,
76 QOverload<int>::of(&QLabel::setNum));
77
79 m_driver = man->outputBackendByName("SonivoxEAS");
80 //qDebug() << Q_FUNC_INFO;
81}
82
83SonivoxSettingsDialog::~SonivoxSettingsDialog()
84{
85 //qDebug() << Q_FUNC_INFO;
86 if (m_driver != nullptr) {
87 m_driver->close();
88 }
89 delete ui;
90}
91
92void SonivoxSettingsDialog::accept()
93{
94 //qDebug() << Q_FUNC_INFO;
95 writeSettings();
96 if (m_driver != nullptr) {
97 QString title;
98 QVariant varStatus = m_driver->property("status");
99 if (varStatus.isValid()) {
100 title = varStatus.toBool() ? tr("Sonivox Initialized") : tr("Sonivox Initialization Failed");
101 QVariant varDiag = m_driver->property("diagnostics");
102 if (varDiag.isValid()) {
103 QString text = varDiag.toStringList().join(QChar::LineFeed).trimmed();
104 if (varStatus.toBool()) {
105 if (!text.isEmpty()) {
106 QMessageBox::information(this, title, text);
107 }
108 } else {
109 QMessageBox::critical(this, title, text);
110 return;
111 }
112 }
113 }
114 }
115 QDialog::accept();
116}
117
118void SonivoxSettingsDialog::showEvent(QShowEvent *event)
119{
120 //qDebug() << Q_FUNC_INFO;
121 readSettings();
122 event->accept();
123}
124
125void SonivoxSettingsDialog::readSettings()
126{
127 //qDebug() << Q_FUNC_INFO;
128 SettingsFactory settings;
129 settings->beginGroup(QSTR_PREFERENCES);
130 int bufferTime = settings->value(QSTR_BUFFERTIME, 30).toInt();
131 int reverbType = settings->value(QSTR_REVERBTYPE, 1).toInt();
132 int reverbAmt = settings->value(QSTR_REVERBAMT, 25800).toInt();
133 int chorusType = settings->value(QSTR_CHORUSTYPE, -1).toInt();
134 int chorusAmt = settings->value(QSTR_CHORUSAMT, 0).toInt();
135 int synthLib = settings->value(QSTR_SYNTHLIB, SYNTHLIB_WT).toInt();
136 QString soundfont = settings->value(QSTR_SOUNDFONT, QString()).toString();
137 int gain = settings->value(QSTR_GAIN, m_driver ? m_driver->property("defaultGain") : 100).toInt();
138 settings->endGroup();
139
140 if (qEnvironmentVariableIsSet("PULSE_LATENCY_MSEC")) {
141 bufferTime = qEnvironmentVariableIntValue("PULSE_LATENCY_MSEC");
142 }
143
144 ui->spnTime->setValue(bufferTime);
145 ui->soundfont_dls->setText(soundfont);
146 ui->dial_Reverb->setValue(reverbAmt);
147 ui->dial_Chorus->setValue(chorusAmt);
148 int reverbIndex = ui->combo_Reverb->findData(reverbType);
149 int chorusIndex = ui->combo_Chorus->findData(chorusType);
150 ui->combo_Reverb->setCurrentIndex(reverbIndex);
151 ui->combo_Chorus->setCurrentIndex(chorusIndex);
152 switch (synthLib) {
153 case 1:
154 ui->rbWT->setChecked(true);
155 break;
156 case 2:
157 ui->rbFM->setChecked(true);
158 break;
159 default:
160 break;
161 }
162 ui->btn_soundfont->setEnabled(synthLib == 1);
163 ui->soundfont_dls->setEnabled(synthLib == 1);
164 ui->sliderGain->setValue(gain);
165
166 chkDriverProperties(settings.getQSettings());
167}
168
169void SonivoxSettingsDialog::writeSettings()
170{
171 //qDebug() << Q_FUNC_INFO;
172 SettingsFactory settings;
173 settings->beginGroup(QSTR_PREFERENCES);
174 settings->setValue(QSTR_BUFFERTIME, ui->spnTime->value());
175 settings->setValue(QSTR_REVERBTYPE, ui->combo_Reverb->currentData());
176 settings->setValue(QSTR_CHORUSTYPE, ui->combo_Chorus->currentData());
177 settings->setValue(QSTR_REVERBAMT, ui->dial_Reverb->value());
178 settings->setValue(QSTR_CHORUSAMT, ui->dial_Chorus->value());
179 settings->setValue(QSTR_SOUNDFONT, ui->soundfont_dls->text());
180 settings->setValue(QSTR_SYNTHLIB, ui->rbFM->isChecked() ? SYNTHLIB_FM : SYNTHLIB_WT);
181 settings->setValue(QSTR_GAIN, ui->sliderGain->value());
182 settings->endGroup();
183 settings->sync();
184 qputenv("PULSE_LATENCY_MSEC", QByteArray::number( ui->spnTime->value() ));
185 chkDriverProperties(settings.getQSettings());
186}
187
188void SonivoxSettingsDialog::chkDriverProperties(QSettings *settings)
189{
190 //qDebug() << Q_FUNC_INFO;
191 if (m_driver != nullptr) {
192 //drumstick::rt::MIDIConnection conn;
193 m_driver->close();
194 m_driver->initialize(settings);
195 QVariant varVersion = m_driver->property("libversion");
196 if (varVersion.isValid()) {
197 ui->lblLibraryText->clear();
198 ui->lblLibraryText->setText(varVersion.toString());
199 }
200 QVariant varStatus = m_driver->property("status");
201 if (varStatus.isValid()) {
202 ui->lblStatusText->clear();
203 ui->lblStatusText->setText(varStatus.toBool() ? tr("Ready") : tr("Failed") );
204 ui->lblStatusIcon->setPixmap(varStatus.toBool() ? QPixmap(":/checked.png") : QPixmap(":/error.png") );
205 }
206 }
207}
208
209void SonivoxSettingsDialog::restoreDefaults()
210{
211 ui->spnTime->setValue(30);
212 ui->soundfont_dls->clear();
213 ui->combo_Reverb->setCurrentIndex(1);
214 ui->dial_Reverb->setValue(25800);
215 ui->combo_Chorus->setCurrentIndex(4);
216 ui->dial_Chorus->setValue(0);
217 ui->sliderGain->setValue(m_driver ? m_driver->property("defaultGain").toInt() : 100);
218 ui->rbWT->setChecked(true);
219}
220
221void SonivoxSettingsDialog::showFileDialog()
222{
223 QDir dir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR, QStandardPaths::LocateDirectory));
224 if (!dir.exists()) {
225 dir = QDir(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QSTR_DATADIR2, QStandardPaths::LocateDirectory));
226 }
227 QString fileName = QFileDialog::getOpenFileName(this,
228 tr("Select SoundFont"),
229 dir.absolutePath(),
230 tr("SoundFont Files (*.dls *.sf2)"));
231 if (!fileName.isEmpty()) {
232 ui->soundfont_dls->setText(fileName);
233 }
234}
235
236void SonivoxSettingsDialog::changeSoundFont(const QString& fileName)
237{
238 readSettings();
239 ui->soundfont_dls->setText(fileName);
240 writeSettings();
241}
242
243} // namespace widgets
244} // namespace drumstick
245
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.