fluidsynth-dialog.cpp
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "gui/fluidsynth-dialog.h"
#include "gui/gui-manager.h"
#include "gui/message.h"
#include "gui/widgets/tab.h"
#include "gui/widgets/popup.h"
#include "common/config-manager.h"
#include "common/translation.h"
#include "common/debug.h"
namespace GUI {
enum {
kActivateChorusCmd = 'acho',
kChorusVoiceCountChangedCmd = 'cvcc',
kChorusLevelChangedCmd = 'clec',
kChorusSpeedChangedCmd = 'cspc',
kChorusDepthChangedCmd = 'cdec',
kActivateReverbCmd = 'arev',
kReverbRoomSizeChangedCmd = 'rrsc',
kReverbDampingChangedCmd = 'rdac',
kReverbWidthChangedCmd = 'rwic',
kReverbLevelChangedCmd = 'rlec',
kResetSettingsCmd = 'rese'
};
enum {
kWaveFormTypeSine = 0,
kWaveFormTypeTriangle = 1
};
enum {
kInterpolationNone = 0,
kInterpolationLinear = 1,
kInterpolation4thOrder = 2,
kInterpolation7thOrder = 3
};
FluidSynthSettingsDialog::FluidSynthSettingsDialog()
: Dialog("FluidSynthSettings") {
_domain = Common::ConfigManager::kApplicationDomain;
_tabWidget = new TabWidget(this, "FluidSynthSettings.TabWidget");
_tabWidget->addTab(_("Reverb"), "FluidSynthSettings_Reverb");
_reverbActivate = new CheckboxWidget(_tabWidget, "FluidSynthSettings_Reverb.EnableTabCheckbox", _("Active"), Common::U32String(), kActivateReverbCmd);
_reverbRoomSizeDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.RoomSizeText", _("Room:"));
_reverbRoomSizeSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.RoomSizeSlider", Common::U32String(), kReverbRoomSizeChangedCmd);
// 0.00 - 1.00, Default: 0.20
_reverbRoomSizeSlider->setMinValue(0);
_reverbRoomSizeSlider->setMaxValue(100);
_reverbRoomSizeLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.RoomSizeLabel", Common::U32String("20"));
_reverbDampingDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.DampingText", _("Damp:"));
_reverbDampingSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.DampingSlider", Common::U32String(), kReverbDampingChangedCmd);
// 0.00 - 1.00, Default: 0.00
_reverbDampingSlider->setMinValue(0);
_reverbDampingSlider->setMaxValue(100);
_reverbDampingLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.DampingLabel", Common::U32String("0"));
_reverbWidthDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.WidthText", _("Width:"));
_reverbWidthSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.WidthSlider", Common::U32String(), kReverbWidthChangedCmd);
// 0.0 - 100.0, Default: 0.5
_reverbWidthSlider->setMinValue(0);
_reverbWidthSlider->setMaxValue(1000);
_reverbWidthLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.WidthLabel", Common::U32String("5"));
_reverbLevelDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.LevelText", _("Level:"));
_reverbLevelSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.LevelSlider", Common::U32String(), kReverbLevelChangedCmd);
// 0.00 - 1.00, Default: 0.90
_reverbLevelSlider->setMinValue(0);
_reverbLevelSlider->setMaxValue(100);
_reverbLevelLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.LevelLabel", Common::U32String("90"));
_tabWidget->addTab(_("Chorus"), "FluidSynthSettings_Chorus");
_chorusActivate = new CheckboxWidget(_tabWidget, "FluidSynthSettings_Chorus.EnableTabCheckbox", _("Active"), Common::U32String(), kActivateChorusCmd);
_chorusVoiceCountDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.VoiceCountText", _("N:"));
_chorusVoiceCountSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.VoiceCountSlider", Common::U32String(), kChorusVoiceCountChangedCmd);
// 0-99, Default: 3
_chorusVoiceCountSlider->setMinValue(0);
_chorusVoiceCountSlider->setMaxValue(99);
_chorusVoiceCountLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.VoiceCountLabel", Common::U32String("3"));
_chorusLevelDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.LevelText", _("Level:"));
_chorusLevelSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.LevelSlider", Common::U32String(), kChorusLevelChangedCmd);
// 0.00 - 10.00, Default: 2.00
_chorusLevelSlider->setMinValue(0);
_chorusLevelSlider->setMaxValue(1000);
_chorusLevelLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.LevelLabel", Common::U32String("200"));
_chorusSpeedDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.SpeedText", _("Speed:"));
_chorusSpeedSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.SpeedSlider", Common::U32String(), kChorusSpeedChangedCmd);
// 0.10 - 5.00, Default: 0.30
_chorusSpeedSlider->setMinValue(10);
_chorusSpeedSlider->setMaxValue(500);
_chorusSpeedLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.SpeedLabel", Common::U32String("30"));
_chorusDepthDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.DepthText", _("Depth:"));
_chorusDepthSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.DepthSlider", Common::U32String(), kChorusDepthChangedCmd);
// 0.0 - 256.0, Default: 8.0
_chorusDepthSlider->setMinValue(0);
_chorusDepthSlider->setMaxValue(2560);
_chorusDepthLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.DepthLabel", Common::U32String("80"));
_chorusWaveFormTypePopUpDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.WaveFormTypeText", _("Type:"));
_chorusWaveFormTypePopUp = new PopUpWidget(_tabWidget, "FluidSynthSettings_Chorus.WaveFormType");
_chorusWaveFormTypePopUp->appendEntry(_("Sine"), kWaveFormTypeSine);
_chorusWaveFormTypePopUp->appendEntry(_("Triangle"), kWaveFormTypeTriangle);
_tabWidget->addTab(_("Misc"), "FluidSynthSettings_Misc");
_miscInterpolationPopUpDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Misc.InterpolationText", _("Interpolation:"));
_miscInterpolationPopUp = new PopUpWidget(_tabWidget, "FluidSynthSettings_Misc.Interpolation");
_miscInterpolationPopUp->appendEntry(_("None (fastest)"), kInterpolationNone);
_miscInterpolationPopUp->appendEntry(_("Linear"), kInterpolationLinear);
_miscInterpolationPopUp->appendEntry(_("Fourth-order"), kInterpolation4thOrder);
_miscInterpolationPopUp->appendEntry(_("Seventh-order"), kInterpolation7thOrder);
_tabWidget->setActiveTab(0);
new ButtonWidget(this, "FluidSynthSettings.ResetSettings", _("Reset"), _("Reset all FluidSynth settings to their default values."), kResetSettingsCmd);
new ButtonWidget(this, "FluidSynthSettings.Cancel", _("Cancel"), Common::U32String(), kCloseCmd);
new ButtonWidget(this, "FluidSynthSettings.Ok", _("OK"), Common::U32String(), kOKCmd);
}
FluidSynthSettingsDialog::~FluidSynthSettingsDialog() {
}
void FluidSynthSettingsDialog::open() {
Dialog::open();
// Reset result value
setResult(0);
readSettings();
}
void FluidSynthSettingsDialog::close() {
if (getResult()) {
writeSettings();
}
Dialog::close();
}
void FluidSynthSettingsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
switch (cmd) {
case kActivateChorusCmd:
setChorusSettingsState(data);
break;
case kChorusVoiceCountChangedCmd:
_chorusVoiceCountLabel->setLabel(Common::String::format("%d", _chorusVoiceCountSlider->getValue()));
break;
case kChorusLevelChangedCmd:
_chorusLevelLabel->setLabel(Common::String::format("%d", _chorusLevelSlider->getValue()));
break;
case kChorusSpeedChangedCmd:
_chorusSpeedLabel->setLabel(Common::String::format("%d", _chorusSpeedSlider->getValue()));
break;
case kChorusDepthChangedCmd:
_chorusDepthLabel->setLabel(Common::String::format("%d", _chorusDepthSlider->getValue()));
break;
case kActivateReverbCmd:
setReverbSettingsState(data);
break;
case kReverbRoomSizeChangedCmd:
_reverbRoomSizeLabel->setLabel(Common::String::format("%d", _reverbRoomSizeSlider->getValue()));
break;
case kReverbDampingChangedCmd:
_reverbDampingLabel->setLabel(Common::String::format("%d", _reverbDampingSlider->getValue()));
break;
case kReverbWidthChangedCmd:
_reverbWidthLabel->setLabel(Common::String::format("%d", _reverbWidthSlider->getValue()));
break;
case kReverbLevelChangedCmd:
_reverbLevelLabel->setLabel(Common::String::format("%d", _reverbLevelSlider->getValue()));
break;
case kResetSettingsCmd: {
MessageDialog alert(_("Do you really want to reset all FluidSynth settings to their default values?"), _("Yes"), _("No"));
if (alert.runModal() == GUI::kMessageOK) {
resetSettings();
readSettings();
g_gui.scheduleTopDialogRedraw();
}
break;
}
case kOKCmd:
setResult(1);
close();
break;
default:
Dialog::handleCommand(sender, cmd, data);
break;
}
}
void FluidSynthSettingsDialog::setChorusSettingsState(bool enabled) {
_chorusVoiceCountDesc->setEnabled(enabled);
_chorusVoiceCountSlider->setEnabled(enabled);
_chorusVoiceCountLabel->setEnabled(enabled);
_chorusLevelDesc->setEnabled(enabled);
_chorusLevelSlider->setEnabled(enabled);
_chorusLevelLabel->setEnabled(enabled);
_chorusSpeedDesc->setEnabled(enabled);
_chorusSpeedSlider->setEnabled(enabled);
_chorusSpeedLabel->setEnabled(enabled);
_chorusDepthDesc->setEnabled(enabled);
_chorusDepthSlider->setEnabled(enabled);
_chorusDepthLabel->setEnabled(enabled);
_chorusWaveFormTypePopUpDesc->setEnabled(enabled);
_chorusWaveFormTypePopUp->setEnabled(enabled);
}
void FluidSynthSettingsDialog::setReverbSettingsState(bool enabled) {
_reverbRoomSizeDesc->setEnabled(enabled);
_reverbRoomSizeSlider->setEnabled(enabled);
_reverbRoomSizeLabel->setEnabled(enabled);
_reverbDampingDesc->setEnabled(enabled);
_reverbDampingSlider->setEnabled(enabled);
_reverbDampingLabel->setEnabled(enabled);
_reverbWidthDesc->setEnabled(enabled);
_reverbWidthSlider->setEnabled(enabled);
_reverbWidthLabel->setEnabled(enabled);
_reverbLevelDesc->setEnabled(enabled);
_reverbLevelSlider->setEnabled(enabled);
_reverbLevelLabel->setEnabled(enabled);
}
void FluidSynthSettingsDialog::readSettings() {
_chorusVoiceCountSlider->setValue(ConfMan.getInt("fluidsynth_chorus_nr", _domain));
_chorusVoiceCountLabel->setLabel(Common::String::format("%d", _chorusVoiceCountSlider->getValue()));
_chorusLevelSlider->setValue(ConfMan.getInt("fluidsynth_chorus_level", _domain));
_chorusLevelLabel->setLabel(Common::String::format("%d", _chorusLevelSlider->getValue()));
_chorusSpeedSlider->setValue(ConfMan.getInt("fluidsynth_chorus_speed", _domain));
_chorusSpeedLabel->setLabel(Common::String::format("%d", _chorusSpeedSlider->getValue()));
_chorusDepthSlider->setValue(ConfMan.getInt("fluidsynth_chorus_depth", _domain));
_chorusDepthLabel->setLabel(Common::String::format("%d", _chorusDepthSlider->getValue()));
Common::String waveForm = ConfMan.get("fluidsynth_chorus_waveform", _domain);
if (waveForm == "sine") {
_chorusWaveFormTypePopUp->setSelectedTag(kWaveFormTypeSine);
} else if (waveForm == "triangle") {
_chorusWaveFormTypePopUp->setSelectedTag(kWaveFormTypeTriangle);
}
_reverbRoomSizeSlider->setValue(ConfMan.getInt("fluidsynth_reverb_roomsize", _domain));
_reverbRoomSizeLabel->setLabel(Common::String::format("%d", _reverbRoomSizeSlider->getValue()));
_reverbDampingSlider->setValue(ConfMan.getInt("fluidsynth_reverb_damping", _domain));
_reverbDampingLabel->setLabel(Common::String::format("%d", _reverbDampingSlider->getValue()));
_reverbWidthSlider->setValue(ConfMan.getInt("fluidsynth_reverb_width", _domain));
_reverbWidthLabel->setLabel(Common::String::format("%d", _reverbWidthSlider->getValue()));
_reverbLevelSlider->setValue(ConfMan.getInt("fluidsynth_reverb_level", _domain));
_reverbLevelLabel->setLabel(Common::String::format("%d", _reverbLevelSlider->getValue()));
Common::String interpolation = ConfMan.get("fluidsynth_misc_interpolation", _domain);
if (interpolation == "none") {
_miscInterpolationPopUp->setSelectedTag(kInterpolationNone);
} else if (interpolation == "linear") {
_miscInterpolationPopUp->setSelectedTag(kInterpolationLinear);
} else if (interpolation == "4th") {
_miscInterpolationPopUp->setSelectedTag(kInterpolation4thOrder);
} else if (interpolation == "7th") {
_miscInterpolationPopUp->setSelectedTag(kInterpolation7thOrder);
}
// This may trigger redrawing, so don't do it until all sliders have
// their proper values. Otherwise, the dialog may crash because of
// invalid slider values.
_chorusActivate->setState(ConfMan.getBool("fluidsynth_chorus_activate", _domain));
_reverbActivate->setState(ConfMan.getBool("fluidsynth_reverb_activate", _domain));
}
void FluidSynthSettingsDialog::writeSettings() {
ConfMan.setBool("fluidsynth_chorus_activate", _chorusActivate->getState());
ConfMan.setInt("fluidsynth_chorus_nr", _chorusVoiceCountSlider->getValue(), _domain);
ConfMan.setInt("fluidsynth_chorus_level", _chorusLevelSlider->getValue(), _domain);
ConfMan.setInt("fluidsynth_chorus_speed", _chorusSpeedSlider->getValue(), _domain);
ConfMan.setInt("fluidsynth_chorus_depth", _chorusDepthSlider->getValue(), _domain);
uint32 waveForm = _chorusWaveFormTypePopUp->getSelectedTag();
if (waveForm == kWaveFormTypeSine) {
ConfMan.set("fluidsynth_chorus_waveform", "sine", _domain);
} else if (waveForm == kWaveFormTypeTriangle) {
ConfMan.set("fluidsynth_chorus_waveform", "triangle", _domain);
} else {
ConfMan.removeKey("fluidsynth_chorus_waveform", _domain);
}
ConfMan.setBool("fluidsynth_reverb_activate", _reverbActivate->getState());
ConfMan.setInt("fluidsynth_reverb_roomsize", _reverbRoomSizeSlider->getValue(), _domain);
ConfMan.setInt("fluidsynth_reverb_damping", _reverbDampingSlider->getValue(), _domain);
ConfMan.setInt("fluidsynth_reverb_width", _reverbWidthSlider->getValue(), _domain);
ConfMan.setInt("fluidsynth_reverb_level", _reverbLevelSlider->getValue(), _domain);
uint32 interpolation = _miscInterpolationPopUp->getSelectedTag();
if (interpolation == kInterpolationNone) {
ConfMan.set("fluidsynth_misc_interpolation", "none", _domain);
} else if (interpolation == kInterpolationLinear) {
ConfMan.set("fluidsynth_misc_interpolation", "linear", _domain);
} else if (interpolation == kInterpolation4thOrder) {
ConfMan.set("fluidsynth_misc_interpolation", "4th", _domain);
} else if (interpolation == kInterpolation7thOrder) {
ConfMan.set("fluidsynth_misc_interpolation", "7th", _domain);
} else {
ConfMan.removeKey("fluidsynth_misc_interpolation", _domain);
}
// The main options dialog is responsible for writing the config file.
// That's why we don't actually flush the settings to the file here.
}
void FluidSynthSettingsDialog::resetSettings() {
ConfMan.removeKey("fluidsynth_chorus_activate", _domain);
ConfMan.removeKey("fluidsynth_chorus_nr", _domain);
ConfMan.removeKey("fluidsynth_chorus_level", _domain);
ConfMan.removeKey("fluidsynth_chorus_speed", _domain);
ConfMan.removeKey("fluidsynth_chorus_depth", _domain);
ConfMan.removeKey("fluidsynth_chorus_waveform", _domain);
ConfMan.removeKey("fluidsynth_reverb_activate", _domain);
ConfMan.removeKey("fluidsynth_reverb_roomsize", _domain);
ConfMan.removeKey("fluidsynth_reverb_damping", _domain);
ConfMan.removeKey("fluidsynth_reverb_width", _domain);
ConfMan.removeKey("fluidsynth_reverb_level", _domain);
ConfMan.removeKey("fluidsynth_misc_interpolation", _domain);
}
} // End of namespace GUI