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