1 /* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 *
21 */
22
23 #include "gui/fluidsynth-dialog.h"
24 #include "gui/gui-manager.h"
25 #include "gui/message.h"
26 #include "gui/widgets/tab.h"
27 #include "gui/widgets/popup.h"
28
29 #include "common/config-manager.h"
30 #include "common/translation.h"
31 #include "common/debug.h"
32
33 namespace GUI {
34
35 enum {
36 kActivateChorusCmd = 'acho',
37 kChorusVoiceCountChangedCmd = 'cvcc',
38 kChorusLevelChangedCmd = 'clec',
39 kChorusSpeedChangedCmd = 'cspc',
40 kChorusDepthChangedCmd = 'cdec',
41
42 kActivateReverbCmd = 'arev',
43 kReverbRoomSizeChangedCmd = 'rrsc',
44 kReverbDampingChangedCmd = 'rdac',
45 kReverbWidthChangedCmd = 'rwic',
46 kReverbLevelChangedCmd = 'rlec',
47
48 kResetSettingsCmd = 'rese'
49 };
50
51 enum {
52 kWaveFormTypeSine = 0,
53 kWaveFormTypeTriangle = 1
54 };
55
56 enum {
57 kInterpolationNone = 0,
58 kInterpolationLinear = 1,
59 kInterpolation4thOrder = 2,
60 kInterpolation7thOrder = 3
61 };
62
FluidSynthSettingsDialog()63 FluidSynthSettingsDialog::FluidSynthSettingsDialog()
64 : Dialog("FluidSynthSettings") {
65 _domain = Common::ConfigManager::kApplicationDomain;
66
67 _tabWidget = new TabWidget(this, "FluidSynthSettings.TabWidget");
68
69 _tabWidget->addTab(_("Reverb"));
70
71 _reverbActivate = new CheckboxWidget(_tabWidget, "FluidSynthSettings_Reverb.EnableTabCheckbox", _("Active"), 0, kActivateReverbCmd);
72
73 _reverbRoomSizeDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.RoomSizeText", _("Room:"));
74 _reverbRoomSizeSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.RoomSizeSlider", 0, kReverbRoomSizeChangedCmd);
75 // 0.00 - 1.20, Default: 0.61
76 _reverbRoomSizeSlider->setMinValue(0);
77 _reverbRoomSizeSlider->setMaxValue(120);
78 _reverbRoomSizeLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.RoomSizeLabel", "61");
79
80 _reverbDampingDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.DampingText", _("Damp:"));
81 _reverbDampingSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.DampingSlider", 0, kReverbDampingChangedCmd);
82 // 0.00 - 1.00, Default: 0.23
83 _reverbDampingSlider->setMinValue(0);
84 _reverbDampingSlider->setMaxValue(100);
85 _reverbDampingLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.DampingLabel", "23");
86
87 _reverbWidthDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.WidthText", _("Width:"));
88 _reverbWidthSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.WidthSlider", 0, kReverbWidthChangedCmd);
89 // 0.00 - 1.00, Default: 0.76
90 _reverbWidthSlider->setMinValue(0);
91 _reverbWidthSlider->setMaxValue(100);
92 _reverbWidthLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.WidthLabel", "76");
93
94 _reverbLevelDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.LevelText", _("Level:"));
95 _reverbLevelSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.LevelSlider", 0, kReverbLevelChangedCmd);
96 // 0.00 - 1.00, Default: 0.57
97 _reverbLevelSlider->setMinValue(0);
98 _reverbLevelSlider->setMaxValue(100);
99 _reverbLevelLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.LevelLabel", "57");
100
101 _tabWidget->addTab(_("Chorus"));
102
103 _chorusActivate = new CheckboxWidget(_tabWidget, "FluidSynthSettings_Chorus.EnableTabCheckbox", _("Active"), 0, kActivateChorusCmd);
104
105 _chorusVoiceCountDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.VoiceCountText", _("N:"));
106 _chorusVoiceCountSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.VoiceCountSlider", 0, kChorusVoiceCountChangedCmd);
107 // 0-99, Default: 3
108 _chorusVoiceCountSlider->setMinValue(0);
109 _chorusVoiceCountSlider->setMaxValue(99);
110 _chorusVoiceCountLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.VoiceCountLabel", "3");
111
112 _chorusLevelDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.LevelText", _("Level:"));
113 _chorusLevelSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.LevelSlider", 0, kChorusLevelChangedCmd);
114 // 0.00 - 2.00, Default: 1.20
115 _chorusLevelSlider->setMinValue(0);
116 _chorusLevelSlider->setMaxValue(200);
117 _chorusLevelLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.LevelLabel", "120");
118
119 _chorusSpeedDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.SpeedText", _("Speed:"));
120 _chorusSpeedSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.SpeedSlider", 0, kChorusSpeedChangedCmd);
121 // 0.30 - 5.00, Default: 0.30
122 _chorusSpeedSlider->setMinValue(30);
123 _chorusSpeedSlider->setMaxValue(500);
124 _chorusSpeedLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.SpeedLabel", "30");
125
126 _chorusDepthDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.DepthText", _("Depth:"));
127 _chorusDepthSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.DepthSlider", 0, kChorusDepthChangedCmd);
128 // 0.00 - 21.00, Default: 8.00
129 _chorusDepthSlider->setMinValue(0);
130 _chorusDepthSlider->setMaxValue(210);
131 _chorusDepthLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.DepthLabel", "80");
132
133 _chorusWaveFormTypePopUpDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.WaveFormTypeText", _("Type:"));
134 _chorusWaveFormTypePopUp = new PopUpWidget(_tabWidget, "FluidSynthSettings_Chorus.WaveFormType");
135
136 _chorusWaveFormTypePopUp->appendEntry(_("Sine"), kWaveFormTypeSine);
137 _chorusWaveFormTypePopUp->appendEntry(_("Triangle"), kWaveFormTypeTriangle);
138
139 _tabWidget->addTab(_("Misc"));
140
141 _miscInterpolationPopUpDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Misc.InterpolationText", _("Interpolation:"));
142 _miscInterpolationPopUp = new PopUpWidget(_tabWidget, "FluidSynthSettings_Misc.Interpolation");
143
144 _miscInterpolationPopUp->appendEntry(_("None (fastest)"), kInterpolationNone);
145 _miscInterpolationPopUp->appendEntry(_("Linear"), kInterpolationLinear);
146 _miscInterpolationPopUp->appendEntry(_("Fourth-order"), kInterpolation4thOrder);
147 _miscInterpolationPopUp->appendEntry(_("Seventh-order"), kInterpolation7thOrder);
148
149 _tabWidget->setActiveTab(0);
150
151 new ButtonWidget(this, "FluidSynthSettings.ResetSettings", _("Reset"), _("Reset all FluidSynth settings to their default values."), kResetSettingsCmd);
152
153 new ButtonWidget(this, "FluidSynthSettings.Cancel", _("Cancel"), 0, kCloseCmd);
154 new ButtonWidget(this, "FluidSynthSettings.Ok", _("OK"), 0, kOKCmd);
155 }
156
~FluidSynthSettingsDialog()157 FluidSynthSettingsDialog::~FluidSynthSettingsDialog() {
158 }
159
open()160 void FluidSynthSettingsDialog::open() {
161 Dialog::open();
162
163 // Reset result value
164 setResult(0);
165
166 readSettings();
167 }
168
close()169 void FluidSynthSettingsDialog::close() {
170 if (getResult()) {
171 writeSettings();
172 }
173
174 Dialog::close();
175 }
176
handleCommand(CommandSender * sender,uint32 cmd,uint32 data)177 void FluidSynthSettingsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
178 switch (cmd) {
179 case kActivateChorusCmd:
180 setChorusSettingsState(data);
181 break;
182 case kChorusVoiceCountChangedCmd:
183 _chorusVoiceCountLabel->setLabel(Common::String::format("%d", _chorusVoiceCountSlider->getValue()));
184 _chorusVoiceCountLabel->markAsDirty();
185 break;
186 case kChorusLevelChangedCmd:
187 _chorusLevelLabel->setLabel(Common::String::format("%d", _chorusLevelSlider->getValue()));
188 _chorusLevelLabel->markAsDirty();
189 break;
190 case kChorusSpeedChangedCmd:
191 _chorusSpeedLabel->setLabel(Common::String::format("%d", _chorusSpeedSlider->getValue()));
192 _chorusSpeedLabel->markAsDirty();
193 break;
194 case kChorusDepthChangedCmd:
195 _chorusDepthLabel->setLabel(Common::String::format("%d", _chorusDepthSlider->getValue()));
196 _chorusDepthLabel->markAsDirty();
197 break;
198 case kActivateReverbCmd:
199 setReverbSettingsState(data);
200 break;
201 case kReverbRoomSizeChangedCmd:
202 _reverbRoomSizeLabel->setLabel(Common::String::format("%d", _reverbRoomSizeSlider->getValue()));
203 _reverbRoomSizeLabel->markAsDirty();
204 break;
205 case kReverbDampingChangedCmd:
206 _reverbDampingLabel->setLabel(Common::String::format("%d", _reverbDampingSlider->getValue()));
207 _reverbDampingLabel->markAsDirty();
208 break;
209 case kReverbWidthChangedCmd:
210 _reverbWidthLabel->setLabel(Common::String::format("%d", _reverbWidthSlider->getValue()));
211 _reverbWidthLabel->markAsDirty();
212 break;
213 case kReverbLevelChangedCmd:
214 _reverbLevelLabel->setLabel(Common::String::format("%d", _reverbLevelSlider->getValue()));
215 _reverbLevelLabel->markAsDirty();
216 break;
217 case kResetSettingsCmd: {
218 MessageDialog alert(_("Do you really want to reset all FluidSynth settings to their default values?"), _("Yes"), _("No"));
219 if (alert.runModal() == GUI::kMessageOK) {
220 resetSettings();
221 readSettings();
222 g_gui.scheduleTopDialogRedraw();
223 }
224 break;
225 }
226 case kOKCmd:
227 setResult(1);
228 close();
229 break;
230 default:
231 Dialog::handleCommand(sender, cmd, data);
232 break;
233 }
234 }
235
setChorusSettingsState(bool enabled)236 void FluidSynthSettingsDialog::setChorusSettingsState(bool enabled) {
237 _chorusVoiceCountDesc->setEnabled(enabled);
238 _chorusVoiceCountSlider->setEnabled(enabled);
239 _chorusVoiceCountLabel->setEnabled(enabled);
240 _chorusLevelDesc->setEnabled(enabled);
241 _chorusLevelSlider->setEnabled(enabled);
242 _chorusLevelLabel->setEnabled(enabled);
243 _chorusSpeedDesc->setEnabled(enabled);
244 _chorusSpeedSlider->setEnabled(enabled);
245 _chorusSpeedLabel->setEnabled(enabled);
246 _chorusDepthDesc->setEnabled(enabled);
247 _chorusDepthSlider->setEnabled(enabled);
248 _chorusDepthLabel->setEnabled(enabled);
249 _chorusWaveFormTypePopUpDesc->setEnabled(enabled);
250 _chorusWaveFormTypePopUp->setEnabled(enabled);
251 }
252
setReverbSettingsState(bool enabled)253 void FluidSynthSettingsDialog::setReverbSettingsState(bool enabled) {
254 _reverbRoomSizeDesc->setEnabled(enabled);
255 _reverbRoomSizeSlider->setEnabled(enabled);
256 _reverbRoomSizeLabel->setEnabled(enabled);
257 _reverbDampingDesc->setEnabled(enabled);
258 _reverbDampingSlider->setEnabled(enabled);
259 _reverbDampingLabel->setEnabled(enabled);
260 _reverbWidthDesc->setEnabled(enabled);
261 _reverbWidthSlider->setEnabled(enabled);
262 _reverbWidthLabel->setEnabled(enabled);
263 _reverbLevelDesc->setEnabled(enabled);
264 _reverbLevelSlider->setEnabled(enabled);
265 _reverbLevelLabel->setEnabled(enabled);
266 }
267
readSettings()268 void FluidSynthSettingsDialog::readSettings() {
269 _chorusVoiceCountSlider->setValue(ConfMan.getInt("fluidsynth_chorus_nr", _domain));
270 _chorusVoiceCountLabel->setLabel(Common::String::format("%d", _chorusVoiceCountSlider->getValue()));
271 _chorusLevelSlider->setValue(ConfMan.getInt("fluidsynth_chorus_level", _domain));
272 _chorusLevelLabel->setLabel(Common::String::format("%d", _chorusLevelSlider->getValue()));
273 _chorusSpeedSlider->setValue(ConfMan.getInt("fluidsynth_chorus_speed", _domain));
274 _chorusSpeedLabel->setLabel(Common::String::format("%d", _chorusSpeedSlider->getValue()));
275 _chorusDepthSlider->setValue(ConfMan.getInt("fluidsynth_chorus_depth", _domain));
276 _chorusDepthLabel->setLabel(Common::String::format("%d", _chorusDepthSlider->getValue()));
277
278 Common::String waveForm = ConfMan.get("fluidsynth_chorus_waveform", _domain);
279 if (waveForm == "sine") {
280 _chorusWaveFormTypePopUp->setSelectedTag(kWaveFormTypeSine);
281 } else if (waveForm == "triangle") {
282 _chorusWaveFormTypePopUp->setSelectedTag(kWaveFormTypeTriangle);
283 }
284
285 _reverbRoomSizeSlider->setValue(ConfMan.getInt("fluidsynth_reverb_roomsize", _domain));
286 _reverbRoomSizeLabel->setLabel(Common::String::format("%d", _reverbRoomSizeSlider->getValue()));
287 _reverbDampingSlider->setValue(ConfMan.getInt("fluidsynth_reverb_damping", _domain));
288 _reverbDampingLabel->setLabel(Common::String::format("%d", _reverbDampingSlider->getValue()));
289 _reverbWidthSlider->setValue(ConfMan.getInt("fluidsynth_reverb_width", _domain));
290 _reverbWidthLabel->setLabel(Common::String::format("%d", _reverbWidthSlider->getValue()));
291 _reverbLevelSlider->setValue(ConfMan.getInt("fluidsynth_reverb_level", _domain));
292 _reverbLevelLabel->setLabel(Common::String::format("%d", _reverbLevelSlider->getValue()));
293
294 Common::String interpolation = ConfMan.get("fluidsynth_misc_interpolation", _domain);
295 if (interpolation == "none") {
296 _miscInterpolationPopUp->setSelectedTag(kInterpolationNone);
297 } else if (interpolation == "linear") {
298 _miscInterpolationPopUp->setSelectedTag(kInterpolationLinear);
299 } else if (interpolation == "4th") {
300 _miscInterpolationPopUp->setSelectedTag(kInterpolation4thOrder);
301 } else if (interpolation == "7th") {
302 _miscInterpolationPopUp->setSelectedTag(kInterpolation7thOrder);
303 }
304
305 // This may trigger redrawing, so don't do it until all sliders have
306 // their proper values. Otherwise, the dialog may crash because of
307 // invalid slider values.
308 _chorusActivate->setState(ConfMan.getBool("fluidsynth_chorus_activate", _domain));
309 _reverbActivate->setState(ConfMan.getBool("fluidsynth_reverb_activate", _domain));
310 }
311
writeSettings()312 void FluidSynthSettingsDialog::writeSettings() {
313 ConfMan.setBool("fluidsynth_chorus_activate", _chorusActivate->getState());
314 ConfMan.setInt("fluidsynth_chorus_nr", _chorusVoiceCountSlider->getValue(), _domain);
315 ConfMan.setInt("fluidsynth_chorus_level", _chorusLevelSlider->getValue(), _domain);
316 ConfMan.setInt("fluidsynth_chorus_speed", _chorusSpeedSlider->getValue(), _domain);
317 ConfMan.setInt("fluidsynth_chorus_depth", _chorusDepthSlider->getValue(), _domain);
318
319 uint32 waveForm = _chorusWaveFormTypePopUp->getSelectedTag();
320 if (waveForm == kWaveFormTypeSine) {
321 ConfMan.set("fluidsynth_chorus_waveform", "sine", _domain);
322 } else if (waveForm == kWaveFormTypeTriangle) {
323 ConfMan.set("fluidsynth_chorus_waveform", "triangle", _domain);
324 } else {
325 ConfMan.removeKey("fluidsynth_chorus_waveform", _domain);
326 }
327
328 ConfMan.setBool("fluidsynth_reverb_activate", _reverbActivate->getState());
329 ConfMan.setInt("fluidsynth_reverb_roomsize", _reverbRoomSizeSlider->getValue(), _domain);
330 ConfMan.setInt("fluidsynth_reverb_damping", _reverbDampingSlider->getValue(), _domain);
331 ConfMan.setInt("fluidsynth_reverb_width", _reverbWidthSlider->getValue(), _domain);
332 ConfMan.setInt("fluidsynth_reverb_level", _reverbLevelSlider->getValue(), _domain);
333
334 uint32 interpolation = _miscInterpolationPopUp->getSelectedTag();
335 if (interpolation == kInterpolationNone) {
336 ConfMan.set("fluidsynth_misc_interpolation", "none", _domain);
337 } else if (interpolation == kInterpolationLinear) {
338 ConfMan.set("fluidsynth_misc_interpolation", "linear", _domain);
339 } else if (interpolation == kInterpolation4thOrder) {
340 ConfMan.set("fluidsynth_misc_interpolation", "4th", _domain);
341 } else if (interpolation == kInterpolation7thOrder) {
342 ConfMan.set("fluidsynth_misc_interpolation", "7th", _domain);
343 } else {
344 ConfMan.removeKey("fluidsynth_misc_interpolation", _domain);
345 }
346
347 // The main options dialog is responsible for writing the config file.
348 // That's why we don't actually flush the settings to the file here.
349 }
350
resetSettings()351 void FluidSynthSettingsDialog::resetSettings() {
352 ConfMan.removeKey("fluidsynth_chorus_activate", _domain);
353 ConfMan.removeKey("fluidsynth_chorus_nr", _domain);
354 ConfMan.removeKey("fluidsynth_chorus_level", _domain);
355 ConfMan.removeKey("fluidsynth_chorus_speed", _domain);
356 ConfMan.removeKey("fluidsynth_chorus_depth", _domain);
357 ConfMan.removeKey("fluidsynth_chorus_waveform", _domain);
358
359 ConfMan.removeKey("fluidsynth_reverb_activate", _domain);
360 ConfMan.removeKey("fluidsynth_reverb_roomsize", _domain);
361 ConfMan.removeKey("fluidsynth_reverb_damping", _domain);
362 ConfMan.removeKey("fluidsynth_reverb_width", _domain);
363 ConfMan.removeKey("fluidsynth_reverb_level", _domain);
364
365 ConfMan.removeKey("fluidsynth_misc_interpolation", _domain);
366 }
367
368 } // End of namespace GUI
369