/* 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 2 * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "gui/fluidsynth-dialog.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 { kOverrideChorusCmd = 'ocho', kChorusVoiceCountChangedCmd = 'cvcc', kChorusLevelChangedCmd = 'clec', kChorusSpeedChangedCmd = 'cspc', kChorusDepthChangedCmd = 'cdec', kOverrideReverbCmd = 'orev', kReverbRoomSizeChangedCmd = 'rrsc', kReverbDampingChangedCmd = 'rdac', kReverbWidthChangedCmd = 'rwic', kReverbLevelChangedCmd = 'rlec' }; 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(_("Chorus")); _chorusOverride = new CheckboxWidget(_tabWidget, "FluidSynthSettings_Chorus.EnableTabCheckbox", _("Override chorus settings"), 0, kOverrideChorusCmd); _chorusVoiceCountDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.VoiceCountText", _("Voice count:")); _chorusVoiceCountSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.VoiceCountSlider", 0, kChorusVoiceCountChangedCmd); _chorusVoiceCountSlider->setMinValue(0); _chorusVoiceCountSlider->setMaxValue(99); _chorusVoiceCountLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.VoiceCountLabel", "3"); _chorusLevelDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.LevelText", _("Level:")); _chorusLevelSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.LevelSlider", 0, kChorusLevelChangedCmd); _chorusLevelSlider->setMinValue(0); _chorusLevelSlider->setMaxValue(1000); _chorusLevelLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.LevelLabel", "2.00"); _chorusSpeedDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.SpeedText", _("Speed (Hz):")); _chorusSpeedSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.SpeedSlider", 0, kChorusSpeedChangedCmd); _chorusSpeedSlider->setMinValue(29); _chorusSpeedSlider->setMaxValue(500); _chorusSpeedSlider->setValue(29); _chorusSpeedLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.SpeedLabel", "0.30"); _chorusDepthDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.DepthText", _("Depth:")); _chorusDepthSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Chorus.DepthSlider", 0, kChorusDepthChangedCmd); _chorusDepthSlider->setMinValue(0); _chorusDepthSlider->setMaxValue(2100); _chorusDepthLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.DepthLabel", "8.00"); _chorusWaveFormTypePopUpDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Chorus.WaveFormTypeText", _("Waveform type:")); _chorusWaveFormTypePopUp = new PopUpWidget(_tabWidget, "FluidSynthSettings_Chorus.WaveFormType"); _chorusWaveFormTypePopUp->appendEntry(_("Sine"), kWaveFormTypeSine); _chorusWaveFormTypePopUp->appendEntry(_("Triangle"), kWaveFormTypeTriangle); _tabWidget->addTab(_("Reverb")); _reverbOverride = new CheckboxWidget(_tabWidget, "FluidSynthSettings_Reverb.EnableTabCheckbox", _("Override reverb settings"), 0, kOverrideReverbCmd); _reverbRoomSizeDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.RoomSizeText", _("Room size:")); _reverbRoomSizeSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.RoomSizeSlider", 0, kReverbRoomSizeChangedCmd); _reverbRoomSizeSlider->setMinValue(0); _reverbRoomSizeSlider->setMaxValue(120); _reverbRoomSizeLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.RoomSizeLabel", "0.20"); _reverbDampingDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.DampingText", _("Damping:")); _reverbDampingSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.DampingSlider", 0, kReverbDampingChangedCmd); _reverbDampingSlider->setMinValue(0); _reverbDampingSlider->setMaxValue(100); _reverbDampingLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.DampingLabel", "0.00"); _reverbWidthDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.WidthText", _("Width:")); _reverbWidthSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.WidthSlider", 0, kReverbWidthChangedCmd); _reverbWidthSlider->setMinValue(0); _reverbWidthSlider->setMaxValue(1000); _reverbWidthLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.WidthLabel", "0.5"); _reverbLevelDesc = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.LevelText", _("Level:")); _reverbLevelSlider = new SliderWidget(_tabWidget, "FluidSynthSettings_Reverb.LevelSlider", 0, kReverbLevelChangedCmd); _reverbLevelSlider->setMinValue(0); _reverbLevelSlider->setMaxValue(100); _reverbLevelLabel = new StaticTextWidget(_tabWidget, "FluidSynthSettings_Reverb.LevelLabel", "0.90"); _tabWidget->addTab(_("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.Cancel", _("Cancel"), 0, kCloseCmd); new ButtonWidget(this, "FluidSynthSettings.Ok", _("OK"), 0, kOKCmd); } FluidSynthSettingsDialog::~FluidSynthSettingsDialog() { } void FluidSynthSettingsDialog::open() { Dialog::open(); // Reset result value setResult(0); bool e; e = ConfMan.hasKey("fluidsynth_chorus_nr", _domain) || ConfMan.hasKey("fluidsynth_chorus_level", _domain) || ConfMan.hasKey("fluidsynth_chorus_speed", _domain) || ConfMan.hasKey("fluidsynth_chorus_depth", _domain) || ConfMan.hasKey("fluidsynth_chorus_waveform", _domain); _chorusOverride->setState(e); e = ConfMan.hasKey("fluidsynth_reverb_roomsize", _domain) || ConfMan.hasKey("fluidsynth_reverb_damping", _domain) || ConfMan.hasKey("fluidsynth_reverb_width", _domain) || ConfMan.hasKey("fluidsynth_reverb_level", _domain); _reverbOverride->setState(e); _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("%.2f", (double)_chorusLevelSlider->getValue() / 100.0)); _chorusSpeedSlider->setValue(ConfMan.getInt("fluidsynth_chorus_speed", _domain)); _chorusSpeedLabel->setLabel(Common::String::format("%.2f", (double)_chorusSpeedSlider->getValue() / 100.0)); _chorusDepthSlider->setValue(ConfMan.getInt("fluidsynth_chorus_depth", _domain)); _chorusDepthLabel->setLabel(Common::String::format("%.2f", (double)_chorusDepthSlider->getValue() / 100.0)); 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("%.2f", (double)_reverbRoomSizeSlider->getValue() / 100.0)); _reverbDampingSlider->setValue(ConfMan.getInt("fluidsynth_reverb_damping", _domain)); _reverbDampingLabel->setLabel(Common::String::format("%.2f", (double)_reverbDampingSlider->getValue() / 100.0)); _reverbWidthSlider->setValue(ConfMan.getInt("fluidsynth_reverb_width", _domain)); _reverbWidthLabel->setLabel(Common::String::format("%.2f", (double)_reverbWidthSlider->getValue() / 10.0)); _reverbLevelSlider->setValue(ConfMan.getInt("fluidsynth_reverb_level", _domain)); _reverbLevelLabel->setLabel(Common::String::format("%.2f", (double)_reverbLevelSlider->getValue() / 100.0)); 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); } } void FluidSynthSettingsDialog::close() { if (getResult()) { if (_chorusOverride->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); } } else { 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); } if (_reverbOverride->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); } else { ConfMan.removeKey("fluidsynth_reverb_roomsize", _domain); ConfMan.removeKey("fluidsynth_reverb_damping", _domain); ConfMan.removeKey("fluidsynth_reverb_width", _domain); ConfMan.removeKey("fluidsynth_reverb_level", _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. } Dialog::close(); } void FluidSynthSettingsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { switch (cmd) { case kOverrideChorusCmd: setChorusSettingsState(data); break; case kChorusVoiceCountChangedCmd: _chorusVoiceCountLabel->setLabel(Common::String::format("%d", _chorusVoiceCountSlider->getValue())); _chorusVoiceCountLabel->draw(); break; case kChorusLevelChangedCmd: _chorusLevelLabel->setLabel(Common::String::format("%.2f", (double)_chorusLevelSlider->getValue() / 100.0)); _chorusLevelLabel->draw(); break; case kChorusSpeedChangedCmd: _chorusSpeedLabel->setLabel(Common::String::format("%.2f", (double)_chorusSpeedSlider->getValue() / 100.0)); _chorusSpeedLabel->draw(); break; case kChorusDepthChangedCmd: _chorusDepthLabel->setLabel(Common::String::format("%.2f", (double)_chorusDepthSlider->getValue() / 100.0)); _chorusDepthLabel->draw(); break; case kOverrideReverbCmd: setReverbSettingsState(data); break; case kReverbRoomSizeChangedCmd: _reverbRoomSizeLabel->setLabel(Common::String::format("%.2f", (double)_reverbRoomSizeSlider->getValue() / 100.0)); _reverbRoomSizeLabel->draw(); break; case kReverbDampingChangedCmd: _reverbDampingLabel->setLabel(Common::String::format("%.2f", (double)_reverbDampingSlider->getValue() / 100.0)); _reverbDampingLabel->draw(); break; case kReverbWidthChangedCmd: _reverbWidthLabel->setLabel(Common::String::format("%.1f", (double)_reverbWidthSlider->getValue() / 10.0)); _reverbWidthLabel->draw(); break; case kReverbLevelChangedCmd: _reverbLevelLabel->setLabel(Common::String::format("%.2f", (double)_reverbLevelSlider->getValue() / 100.0)); _reverbLevelLabel->draw(); 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); } } // End of namespace GUI