openMSX
GlobalSettings.cc
Go to the documentation of this file.
1 #include "GlobalSettings.hh"
2 #include "SettingsConfig.hh"
4 #include "strCat.hh"
5 #include "view.hh"
6 #include "xrange.hh"
7 #include "build-info.hh"
8 #include <memory>
9 #include <SDL.h>
10 
11 namespace openmsx {
12 
14  : commandController(commandController_)
15  , speedSetting(commandController, "speed",
16  "controls the emulation speed: higher is faster, 100 is normal",
17  100, 1, 1000000)
18  , pauseSetting(commandController, "pause",
19  "pauses the emulation", false, Setting::DONT_SAVE)
20  , powerSetting(commandController, "power",
21  "turn power on/off", false, Setting::DONT_SAVE)
22  , autoSaveSetting(commandController, "save_settings_on_exit",
23  "automatically save settings when openMSX exits", true)
24  , umrCallBackSetting(commandController, "umr_callback",
25  "Tcl proc to call when an UMR is detected", {})
26  , invalidPsgDirectionsSetting(commandController,
27  "invalid_psg_directions_callback",
28  "Tcl proc called when the MSX program has set invalid PSG port directions",
29  {})
30  , resampleSetting(commandController, "resampler", "Resample algorithm",
31 #if PLATFORM_DINGUX
32  // For Dingux, LQ is good compromise between quality and performance
34 #elif PLATFORM_ANDROID
35  // For Android, BLIP is good compromise between quality and performance
37 #else
38  // For other platforms, default setting may be changed in future
39  ResampledSoundDevice::RESAMPLE_BLIP,
40 #endif
43  {"fast", ResampledSoundDevice::RESAMPLE_LQ},
44  {"blip", ResampledSoundDevice::RESAMPLE_BLIP}})
45  , throttleManager(commandController)
46 {
47  deadzoneSettings = to_vector(
48  view::transform(xrange(SDL_NumJoysticks()), [&](auto i) {
49  return std::make_unique<IntegerSetting>(
50  commandController,
51  strCat("joystick", i + 1, "_deadzone"),
52  "size (as a percentage) of the dead center zone",
53  25, 0, 100);
54  }));
55  getPowerSetting().attach(*this);
56 }
57 
59 {
60  getPowerSetting().detach(*this);
61  commandController.getSettingsConfig().setSaveSettings(
62  autoSaveSetting.getBoolean());
63 }
64 
65 // Observer<Setting>
66 void GlobalSettings::update(const Setting& setting)
67 {
68  if (&setting == &getPowerSetting()) { // either on or off
69  // automatically unpause after a power off/on cycle
70  // this solved a bug, but apart from that this behaviour also
71  // makes more sense
72  getPauseSetting().setBoolean(false);
73  }
74 }
75 
76 } // namespace openmsx
auto transform(Range &&range, UnaryOp op)
Definition: view.hh:312
auto xrange(T e)
Definition: xrange.hh:170
BooleanSetting & getPauseSetting()
BooleanSetting & getPowerSetting()
void setSaveSettings(bool save)
void attach(Observer< T > &observer)
Definition: Subject.hh:49
GlobalSettings(GlobalCommandController &commandController)
bool getBoolean() const noexcept
Thanks to enen for testing this on a real cartridge:
Definition: Autofire.cc:5
void detach(Observer< T > &observer)
Definition: Subject.hh:55
std::string strCat(Ts &&...ts)
Definition: strCat.hh:577
auto to_vector(Range &&range) -> std::vector< detail::ToVectorType< T, decltype(std::begin(range))>>
Definition: stl.hh:325