123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977 |
- /*
- * TrackerSettings.h
- * -----------------
- * Purpose: Header file for application setting handling.
- * Notes : (currently none)
- * Authors: Olivier Lapicque
- * OpenMPT Devs
- * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
- */
- #pragma once
- #include "openmpt/all/BuildSettings.hpp"
- #include "mpt/uuid/uuid.hpp"
- #include "../common/Logging.h"
- #include "../common/version.h"
- #include "openmpt/soundbase/SampleFormat.hpp"
- #include "../soundlib/MixerSettings.h"
- #include "../soundlib/Resampler.h"
- #include "../sounddsp/EQ.h"
- #include "../sounddsp/DSP.h"
- #include "../sounddsp/Reverb.h"
- #include "openmpt/sounddevice/SoundDevice.hpp"
- #include "StreamEncoderSettings.h"
- #include "Settings.h"
- #include <array>
- #include <bitset>
- OPENMPT_NAMESPACE_BEGIN
- namespace SoundDevice {
- class Manager;
- } // namespace SoundDevice
- namespace Tuning {
- class CTuningCollection;
- } // namespace Tuning
- using CTuningCollection = Tuning::CTuningCollection;
- // User-defined colors
- enum ModColor : uint8
- {
- MODCOLOR_BACKNORMAL = 0,
- MODCOLOR_TEXTNORMAL,
- MODCOLOR_BACKCURROW,
- MODCOLOR_TEXTCURROW,
- MODCOLOR_BACKSELECTED,
- MODCOLOR_TEXTSELECTED,
- MODCOLOR_SAMPLE,
- MODCOLOR_BACKPLAYCURSOR,
- MODCOLOR_TEXTPLAYCURSOR,
- MODCOLOR_BACKHILIGHT,
- MODCOLOR_NOTE,
- MODCOLOR_INSTRUMENT,
- MODCOLOR_VOLUME,
- MODCOLOR_PANNING,
- MODCOLOR_PITCH,
- MODCOLOR_GLOBALS,
- MODCOLOR_ENVELOPES,
- MODCOLOR_VUMETER_LO,
- MODCOLOR_VUMETER_MED,
- MODCOLOR_VUMETER_HI,
- MODCOLOR_SEPSHADOW,
- MODCOLOR_SEPFACE,
- MODCOLOR_SEPHILITE,
- MODCOLOR_BLENDCOLOR,
- MODCOLOR_DODGY_COMMANDS,
- MODCOLOR_BACKSAMPLE,
- MODCOLOR_SAMPLESELECTED,
- MODCOLOR_BACKENV,
- MODCOLOR_VUMETER_LO_VST,
- MODCOLOR_VUMETER_MED_VST,
- MODCOLOR_VUMETER_HI_VST,
- MODCOLOR_ENVELOPE_RELEASE,
- MODCOLOR_SAMPLE_LOOPMARKER,
- MODCOLOR_SAMPLE_SUSTAINMARKER,
- MODCOLOR_SAMPLE_CUEPOINT,
- MAX_MODCOLORS,
- // Internal color codes (not saved to color preset files)
- MODCOLOR_2NDHIGHLIGHT,
- MODCOLOR_DEFAULTVOLUME,
- MODCOLOR_DUMMYCOMMAND,
- MAX_MODPALETTECOLORS
- };
- // Pattern Setup (contains also non-pattern related settings)
- // Feel free to replace the deprecated flags by new flags, but be sure to
- // update TrackerSettings::TrackerSettings() as well.
- #define PATTERN_PLAYNEWNOTE 0x01 // play new notes while recording
- #define PATTERN_SMOOTHSCROLL 0x02 // scroll tick by tick, not row by row
- #define PATTERN_STDHIGHLIGHT 0x04 // enable primary highlight (measures)
- #define PATTERN_NOFOLLOWONCLICK 0x08 // disable song follow when clicking into pattern
- #define PATTERN_CENTERROW 0x10 // always center active row
- #define PATTERN_WRAP 0x20 // wrap around cursor in editor
- #define PATTERN_EFFECTHILIGHT 0x40 // effect syntax highlighting
- #define PATTERN_HEXDISPLAY 0x80 // display row number in hex
- #define PATTERN_FLATBUTTONS 0x100 // flat toolbar buttons
- #define PATTERN_PLAYNAVIGATEROW 0x200 // play whole row when navigating
- #define PATTERN_SINGLEEXPAND 0x400 // single click to expand tree
- #define PATTERN_PLAYEDITROW 0x800 // play all notes on the current row while entering notes
- #define PATTERN_NOEXTRALOUD 0x1000 // no loud samples in sample editor
- #define PATTERN_DRAGNDROPEDIT 0x2000 // enable drag and drop editing
- #define PATTERN_2NDHIGHLIGHT 0x4000 // activate secondary highlight (beats)
- #define PATTERN_MUTECHNMODE 0x8000 // ignore muted channels
- #define PATTERN_SHOWPREVIOUS 0x10000 // show prev/next patterns
- #define PATTERN_CONTSCROLL 0x20000 // continous pattern scrolling
- #define PATTERN_KBDNOTEOFF 0x40000 // Record note-off events
- #define PATTERN_FOLLOWSONGOFF 0x80000 // follow song off by default
- #define PATTERN_PLAYTRANSPOSE 0x100000 // Preview note transposition
- #define PATTERN_NOCLOSEDIALOG 0x200000 // Don't use OpenMPT's custom close dialog with a list of saved files when closing the main window
- #define PATTERN_DBLCLICKSELECT 0x400000 // Double-clicking pattern selects whole channel
- #define PATTERN_OLDCTXMENUSTYLE 0x800000 // Hide pattern context menu entries instead of greying them out.
- #define PATTERN_SYNCMUTE 0x1000000 // maintain sample sync on mute
- #define PATTERN_AUTODELAY 0x2000000 // automatically insert delay commands in pattern when entering notes
- #define PATTERN_NOTEFADE 0x4000000 // alt. note fade behaviour when entering notes
- #define PATTERN_OVERFLOWPASTE 0x8000000 // continue paste in the next pattern instead of cutting off
- #define PATTERN_SHOWDEFAULTVOLUME 0x10000000 // if there is no volume command next to note+instr, display the sample's default volume.
- #define PATTERN_RESETCHANNELS 0x20000000 // reset channels when looping
- #define PATTERN_LIVEUPDATETREE 0x40000000 // update active sample / instr icons in treeview
- #define PATTERN_SYNCSAMPLEPOS 0x80000000 // sync sample positions when seeking
- #define PATTERNFONT_SMALL UL_("@1")
- #define PATTERNFONT_LARGE UL_("@2")
- // MIDI Setup
- #define MIDISETUP_RECORDVELOCITY 0x01 // Record MIDI velocity
- #define MIDISETUP_TRANSPOSEKEYBOARD 0x02 // Apply transpose value to MIDI Notes
- #define MIDISETUP_MIDITOPLUG 0x04 // Pass MIDI messages to plugins
- #define MIDISETUP_MIDIVOL_TO_NOTEVOL 0x08 // Combine MIDI volume to note velocity
- #define MIDISETUP_RECORDNOTEOFF 0x10 // Record MIDI Note Off to pattern
- #define MIDISETUP_RESPONDTOPLAYCONTROLMSGS 0x20 // Respond to Restart/Continue/Stop MIDI commands
- #define MIDISETUP_MIDIMACROCONTROL 0x80 // Record MIDI controller changes a MIDI macro changes in pattern
- #define MIDISETUP_PLAYPATTERNONMIDIIN 0x100 // Play pattern if MIDI Note is received and playback is paused
- #define MIDISETUP_ENABLE_RECORD_DEFAULT 0x200 // Enable MIDI recording by default
- #define MIDISETUP_MIDIMACROPITCHBEND 0x400 // Record MIDI pitch bend messages a MIDI macro changes in pattern
- #ifndef NO_EQ
- // EQ
- struct EQPresetPacked
- {
- char szName[12]; // locale encoding
- uint32le Gains[MAX_EQ_BANDS];
- uint32le Freqs[MAX_EQ_BANDS];
- };
- MPT_BINARY_STRUCT(EQPresetPacked, 60)
- struct EQPreset
- {
- char szName[12]; // locale encoding
- uint32 Gains[MAX_EQ_BANDS];
- uint32 Freqs[MAX_EQ_BANDS];
- };
- template<> inline SettingValue ToSettingValue(const EQPreset &val)
- {
- EQPresetPacked valpacked;
- std::memcpy(valpacked.szName, val.szName, std::size(valpacked.szName));
- std::copy(val.Gains, val.Gains + MAX_EQ_BANDS, valpacked.Gains);
- std::copy(val.Freqs, val.Freqs + MAX_EQ_BANDS, valpacked.Freqs);
- return SettingValue(EncodeBinarySetting<EQPresetPacked>(valpacked), "EQPreset");
- }
- template<> inline EQPreset FromSettingValue(const SettingValue &val)
- {
- ASSERT(val.GetTypeTag() == "EQPreset");
- EQPresetPacked valpacked = DecodeBinarySetting<EQPresetPacked>(val.as<std::vector<std::byte> >());
- EQPreset valresult;
- std::memcpy(valresult.szName, valpacked.szName, std::size(valresult.szName));
- std::copy(valpacked.Gains, valpacked.Gains + MAX_EQ_BANDS, valresult.Gains);
- std::copy(valpacked.Freqs, valpacked.Freqs + MAX_EQ_BANDS, valresult.Freqs);
- return valresult;
- }
- #endif // !NO_EQ
- template<> inline SettingValue ToSettingValue(const mpt::UUID &val) { return SettingValue(val.ToUString()); }
- template<> inline mpt::UUID FromSettingValue(const SettingValue &val) { return mpt::UUID::FromString(val.as<mpt::ustring>()); }
- // Chords
- struct MPTChord
- {
- enum
- {
- notesPerChord = 4,
- relativeMode = 0x3F,
- noNote = int8_min,
- };
- using NoteType = int8;
- uint8 key; // Base note
- std::array<NoteType, notesPerChord - 1> notes; // Additional chord notes
- };
- using MPTChords = std::array<MPTChord, 3 * 12>; // 3 octaves
- // MIDI recording
- enum RecordAftertouchOptions
- {
- atDoNotRecord = 0,
- atRecordAsVolume,
- atRecordAsMacro,
- };
- // New file action
- enum NewFileAction
- {
- nfDefaultFormat = 0,
- nfSameAsCurrent,
- nfDefaultTemplate
- };
- // Sample editor preview behaviour
- enum SampleEditorKeyBehaviour
- {
- seNoteOffOnNewKey = 0,
- seNoteOffOnKeyUp,
- seNoteOffOnKeyRestrike,
- };
- enum SampleEditorDefaultFormat
- {
- dfFLAC,
- dfWAV,
- dfRAW,
- dfS3I,
- };
- enum class TimelineFormat
- {
- Seconds = 0,
- Samples,
- SamplesPow2,
- };
- enum class DefaultChannelColors
- {
- NoColors = 0,
- Rainbow,
- Random,
- };
- class SampleUndoBufferSize
- {
- protected:
- size_t sizeByte;
- int32 sizePercent;
- void CalculateSize();
- public:
- enum
- {
- defaultSize = 10, // In percent
- };
- SampleUndoBufferSize(int32 percent = defaultSize) : sizePercent(percent) { CalculateSize(); }
- void Set(int32 percent) { sizePercent = percent; CalculateSize(); }
- int32 GetSizeInPercent() const { return sizePercent; }
- size_t GetSizeInBytes() const { return sizeByte; }
- };
- template<> inline SettingValue ToSettingValue(const SampleUndoBufferSize &val) { return SettingValue(val.GetSizeInPercent()); }
- template<> inline SampleUndoBufferSize FromSettingValue(const SettingValue &val) { return SampleUndoBufferSize(val.as<int32>()); }
- mpt::ustring IgnoredCCsToString(const std::bitset<128> &midiIgnoreCCs);
- std::bitset<128> StringToIgnoredCCs(const mpt::ustring &in);
- mpt::ustring SettingsModTypeToString(MODTYPE modtype);
- MODTYPE SettingsStringToModType(const mpt::ustring &str);
- template<> inline SettingValue ToSettingValue(const RecordAftertouchOptions &val) { return SettingValue(int32(val)); }
- template<> inline RecordAftertouchOptions FromSettingValue(const SettingValue &val) { return RecordAftertouchOptions(val.as<int32>()); }
- template<> inline SettingValue ToSettingValue(const SampleEditorKeyBehaviour &val) { return SettingValue(int32(val)); }
- template<> inline SampleEditorKeyBehaviour FromSettingValue(const SettingValue &val) { return SampleEditorKeyBehaviour(val.as<int32>()); }
- template<> inline SettingValue ToSettingValue(const TimelineFormat &val) { return SettingValue(int32(val)); }
- template<> inline TimelineFormat FromSettingValue(const SettingValue &val) { return TimelineFormat(val.as<int32>()); }
- template<> inline SettingValue ToSettingValue(const DefaultChannelColors & val) { return SettingValue(int32(val)); }
- template<> inline DefaultChannelColors FromSettingValue(const SettingValue& val) { return DefaultChannelColors(val.as<int32>()); }
- template<> inline SettingValue ToSettingValue(const MODTYPE &val) { return SettingValue(SettingsModTypeToString(val), "MODTYPE"); }
- template<> inline MODTYPE FromSettingValue(const SettingValue &val) { ASSERT(val.GetTypeTag() == "MODTYPE"); return SettingsStringToModType(val.as<mpt::ustring>()); }
- template<> inline SettingValue ToSettingValue(const PlugVolumeHandling &val)
- {
- return SettingValue(int32(val), "PlugVolumeHandling");
- }
- template<> inline PlugVolumeHandling FromSettingValue(const SettingValue &val)
- {
- ASSERT(val.GetTypeTag() == "PlugVolumeHandling");
- if((uint32)val.as<int32>() > PLUGIN_VOLUMEHANDLING_MAX)
- {
- return PLUGIN_VOLUMEHANDLING_IGNORE;
- }
- return static_cast<PlugVolumeHandling>(val.as<int32>());
- }
- template<> inline SettingValue ToSettingValue(const std::vector<uint32> &val) { return mpt::String::Combine(val, U_(",")); }
- template<> inline std::vector<uint32> FromSettingValue(const SettingValue &val) { return mpt::String::Split<uint32>(val, U_(",")); }
- template<> inline SettingValue ToSettingValue(const std::vector<mpt::ustring> &val) { return mpt::String::Combine(val, U_(";")); }
- template<> inline std::vector<mpt::ustring> FromSettingValue(const SettingValue &val) { return mpt::String::Split<mpt::ustring>(val, U_(";")); }
- template<> inline SettingValue ToSettingValue(const SampleFormat &val) { return SettingValue(val.AsInt()); }
- template<> inline SampleFormat FromSettingValue(const SettingValue &val) { return SampleFormat::FromInt(val.as<int32>()); }
- template<> inline SettingValue ToSettingValue(const SoundDevice::ChannelMapping &val) { return SettingValue(val.ToUString(), "ChannelMapping"); }
- template<> inline SoundDevice::ChannelMapping FromSettingValue(const SettingValue &val) { ASSERT(val.GetTypeTag() == "ChannelMapping"); return SoundDevice::ChannelMapping::FromString(val.as<mpt::ustring>()); }
- template<> inline SettingValue ToSettingValue(const ResamplingMode &val) { return SettingValue(int32(val)); }
- template<> inline ResamplingMode FromSettingValue(const SettingValue &val) { return ResamplingMode(val.as<int32>()); }
- template<> inline SettingValue ToSettingValue(const Resampling::AmigaFilter &val) { return SettingValue(int32(val)); }
- template<> inline Resampling::AmigaFilter FromSettingValue(const SettingValue &val) { return static_cast<Resampling::AmigaFilter>(val.as<int32>()); }
- template<> inline SettingValue ToSettingValue(const NewFileAction &val) { return SettingValue(int32(val)); }
- template<> inline NewFileAction FromSettingValue(const SettingValue &val) { return NewFileAction(val.as<int32>()); }
- template<> inline SettingValue ToSettingValue(const std::bitset<128> &val)
- {
- return SettingValue(IgnoredCCsToString(val), "IgnoredCCs");
- }
- template<> inline std::bitset<128> FromSettingValue(const SettingValue &val)
- {
- ASSERT(val.GetTypeTag() == "IgnoredCCs");
- return StringToIgnoredCCs(val.as<mpt::ustring>());
- }
- template<> inline SettingValue ToSettingValue(const SampleEditorDefaultFormat &val)
- {
- mpt::ustring format;
- switch(val)
- {
- case dfWAV:
- format = U_("wav");
- break;
- case dfFLAC:
- default:
- format = U_("flac");
- break;
- case dfRAW:
- format = U_("raw");
- break;
- case dfS3I:
- format = U_("s3i");
- break;
- }
- return SettingValue(format);
- }
- template<> inline SampleEditorDefaultFormat FromSettingValue(const SettingValue &val)
- {
- mpt::ustring format = mpt::ToLowerCase(val.as<mpt::ustring>());
- if(format == U_("wav"))
- return dfWAV;
- if(format == U_("raw"))
- return dfRAW;
- if(format == U_("s3i"))
- return dfS3I;
- else // if(format == U_("flac"))
- return dfFLAC;
- }
- enum SoundDeviceStopMode
- {
- SoundDeviceStopModeClosed = 0,
- SoundDeviceStopModeStopped = 1,
- SoundDeviceStopModePlaying = 2,
- };
- template<> inline SettingValue ToSettingValue(const SoundDeviceStopMode &val)
- {
- return SettingValue(static_cast<int32>(val));
- }
- template<> inline SoundDeviceStopMode FromSettingValue(const SettingValue &val)
- {
- return static_cast<SoundDeviceStopMode>(static_cast<int32>(val));
- }
- enum ProcessPriorityClass
- {
- ProcessPriorityClassIDLE = IDLE_PRIORITY_CLASS,
- ProcessPriorityClassBELOW = BELOW_NORMAL_PRIORITY_CLASS,
- ProcessPriorityClassNORMAL = NORMAL_PRIORITY_CLASS,
- ProcessPriorityClassABOVE = ABOVE_NORMAL_PRIORITY_CLASS,
- ProcessPriorityClassHIGH = HIGH_PRIORITY_CLASS,
- ProcessPriorityClassREALTIME = REALTIME_PRIORITY_CLASS
- };
- template<> inline SettingValue ToSettingValue(const ProcessPriorityClass &val)
- {
- mpt::ustring s;
- switch(val)
- {
- case ProcessPriorityClassIDLE:
- s = U_("idle");
- break;
- case ProcessPriorityClassBELOW:
- s = U_("below");
- break;
- case ProcessPriorityClassNORMAL:
- s = U_("normal");
- break;
- case ProcessPriorityClassABOVE:
- s = U_("above");
- break;
- case ProcessPriorityClassHIGH:
- s = U_("high");
- break;
- case ProcessPriorityClassREALTIME:
- s = U_("realtime");
- break;
- default:
- s = U_("normal");
- break;
- }
- return SettingValue(s);
- }
- template<> inline ProcessPriorityClass FromSettingValue(const SettingValue &val)
- {
- ProcessPriorityClass result = ProcessPriorityClassNORMAL;
- mpt::ustring s = val.as<mpt::ustring>();
- if(s.empty())
- {
- result = ProcessPriorityClassNORMAL;
- } else if(s == U_("idle"))
- {
- result = ProcessPriorityClassIDLE;
- } else if(s == U_("below"))
- {
- result = ProcessPriorityClassBELOW;
- } else if(s == U_("normal"))
- {
- result = ProcessPriorityClassNORMAL;
- } else if(s == U_("above"))
- {
- result = ProcessPriorityClassABOVE;
- } else if(s == U_("high"))
- {
- result = ProcessPriorityClassHIGH;
- } else if(s == U_("realtime"))
- {
- result = ProcessPriorityClassREALTIME;
- } else
- {
- result = ProcessPriorityClassNORMAL;
- }
- return result;
- }
- template<> inline SettingValue ToSettingValue(const mpt::Date::Unix &val)
- {
- time_t t = val;
- const tm* lastUpdate = gmtime(&t);
- CString outDate;
- if(lastUpdate)
- {
- outDate.Format(_T("%04d-%02d-%02d %02d:%02d"), lastUpdate->tm_year + 1900, lastUpdate->tm_mon + 1, lastUpdate->tm_mday, lastUpdate->tm_hour, lastUpdate->tm_min);
- }
- return SettingValue(mpt::ToUnicode(outDate), "UTC");
- }
- template<> inline mpt::Date::Unix FromSettingValue(const SettingValue &val)
- {
- MPT_ASSERT(val.GetTypeTag() == "UTC");
- std::string s = mpt::ToCharset(mpt::Charset::Locale, val.as<mpt::ustring>());
- tm lastUpdate;
- MemsetZero(lastUpdate);
- if(sscanf(s.c_str(), "%04d-%02d-%02d %02d:%02d", &lastUpdate.tm_year, &lastUpdate.tm_mon, &lastUpdate.tm_mday, &lastUpdate.tm_hour, &lastUpdate.tm_min) == 5)
- {
- lastUpdate.tm_year -= 1900;
- lastUpdate.tm_mon--;
- }
- time_t outTime = mpt::Date::Unix::FromUTC(lastUpdate);
- if(outTime < 0)
- {
- outTime = 0;
- }
- return mpt::Date::Unix(outTime);
- }
- struct FontSetting
- {
- enum FontFlags
- {
- None = 0,
- Bold = 1,
- Italic = 2,
- };
- mpt::ustring name;
- int32 size;
- FlagSet<FontFlags> flags;
- FontSetting(const mpt::ustring &name = U_(""), int32 size = 120, FontFlags flags = None) : name(name), size(size), flags(flags) { }
- bool operator== (const FontSetting &other) const
- {
- return name == other.name && size == other.size && flags == other.flags;
- }
- bool operator!= (const FontSetting &other) const
- {
- return !(*this == other);
- }
- };
- MPT_DECLARE_ENUM(FontSetting::FontFlags)
- template<> inline SettingValue ToSettingValue(const FontSetting &val)
- {
- return SettingValue(mpt::ToUnicode(val.name) + U_(",") + mpt::ufmt::val(val.size) + U_("|") + mpt::ufmt::val(val.flags.GetRaw()));
- }
- template<> inline FontSetting FromSettingValue(const SettingValue &val)
- {
- FontSetting setting(val.as<mpt::ustring>());
- std::size_t sizeStart = setting.name.rfind(UC_(','));
- if(sizeStart != std::string::npos)
- {
- const std::vector<mpt::ustring> fields = mpt::String::Split<mpt::ustring>(setting.name.substr(sizeStart + 1), U_("|"));
- if(fields.size() >= 1)
- {
- setting.size = ConvertStrTo<int32>(fields[0]);
- }
- if(fields.size() >= 2)
- {
- setting.flags = static_cast<FontSetting::FontFlags>(ConvertStrTo<int32>(fields[1]));
- }
- setting.name.resize(sizeStart);
- }
- return setting;
- }
- class DefaultAndWorkingDirectory
- {
- protected:
- mpt::PathString m_Default;
- mpt::PathString m_Working;
- public:
- DefaultAndWorkingDirectory();
- DefaultAndWorkingDirectory(const mpt::PathString &def);
- ~DefaultAndWorkingDirectory();
- public:
- void SetDefaultDir(const mpt::PathString &filenameFrom, bool stripFilename = false);
- void SetWorkingDir(const mpt::PathString &filenameFrom, bool stripFilename = false);
- mpt::PathString GetDefaultDir() const;
- mpt::PathString GetWorkingDir() const;
- private:
- bool InternalSet(mpt::PathString &dest, const mpt::PathString &filenameFrom, bool stripFilename);
- };
- class ConfigurableDirectory
- : public DefaultAndWorkingDirectory
- {
- protected:
- SettingsContainer &conf;
- Setting<mpt::PathString> m_Setting;
- public:
- ConfigurableDirectory(SettingsContainer &conf, const AnyStringLocale §ion, const AnyStringLocale &key, const mpt::PathString &def);
- ~ConfigurableDirectory();
- };
- class DebugSettings
- {
- private:
- SettingsContainer &conf;
- private:
- // Debug
- #if !defined(MPT_LOG_IS_DISABLED)
- Setting<int> DebugLogLevel;
- Setting<std::string> DebugLogFacilitySolo;
- Setting<std::string> DebugLogFacilityBlocked;
- Setting<bool> DebugLogFileEnable;
- Setting<bool> DebugLogDebuggerEnable;
- Setting<bool> DebugLogConsoleEnable;
- #endif
- Setting<bool> DebugTraceEnable;
- Setting<uint32> DebugTraceSize;
- Setting<bool> DebugTraceAlwaysDump;
- Setting<bool> DebugStopSoundDeviceOnCrash;
- Setting<bool> DebugStopSoundDeviceBeforeDump;
- Setting<bool> DebugDelegateToWindowsHandler;
- public:
- DebugSettings(SettingsContainer &conf);
- ~DebugSettings();
- };
- namespace SoundDevice
- {
- namespace Legacy
- {
- typedef uint16 ID;
- inline constexpr SoundDevice::Legacy::ID MaskType = 0xff00;
- inline constexpr SoundDevice::Legacy::ID MaskIndex = 0x00ff;
- inline constexpr int ShiftType = 8;
- inline constexpr int ShiftIndex = 0;
- inline constexpr SoundDevice::Legacy::ID TypeWAVEOUT = 0;
- inline constexpr SoundDevice::Legacy::ID TypeDSOUND = 1;
- inline constexpr SoundDevice::Legacy::ID TypeASIO = 2;
- inline constexpr SoundDevice::Legacy::ID TypePORTAUDIO_WASAPI = 3;
- inline constexpr SoundDevice::Legacy::ID TypePORTAUDIO_WDMKS = 4;
- inline constexpr SoundDevice::Legacy::ID TypePORTAUDIO_WMME = 5;
- inline constexpr SoundDevice::Legacy::ID TypePORTAUDIO_DS = 6;
- } // namespace Legacy
- } // namespace SoundDevice
- class TrackerSettings
- {
- private:
- SettingsContainer &conf;
- public:
- // Version
- Setting<mpt::ustring> IniVersion;
- const bool FirstRun;
- const Version PreviousSettingsVersion;
- Setting<mpt::UUID> VersionInstallGUID;
- // Display
- Setting<bool> m_ShowSplashScreen;
- Setting<bool> gbMdiMaximize;
- Setting<bool> highResUI;
- Setting<LONG> glTreeSplitRatio;
- Setting<LONG> glTreeWindowWidth;
- Setting<LONG> glGeneralWindowHeight;
- Setting<LONG> glPatternWindowHeight;
- Setting<LONG> glSampleWindowHeight;
- Setting<LONG> glInstrumentWindowHeight;
- Setting<LONG> glCommentsWindowHeight;
- Setting<LONG> glGraphWindowHeight;
- Setting<int32> gnPlugWindowX;
- Setting<int32> gnPlugWindowY;
- Setting<int32> gnPlugWindowWidth;
- Setting<int32> gnPlugWindowHeight;
- Setting<int32> gnPlugWindowLast; // Last selected plugin ID
- Setting<uint32> gnMsgBoxVisiblityFlags;
- Setting<uint32> GUIUpdateInterval;
- CachedSetting<uint32> FSUpdateInterval;
- CachedSetting<uint32> VuMeterUpdateInterval;
- CachedSetting<float> VuMeterDecaySpeedDecibelPerSecond;
- CachedSetting<bool> accidentalFlats;
- Setting<bool> rememberSongWindows;
- Setting<bool> showDirsInSampleBrowser;
- Setting<DefaultChannelColors> defaultRainbowChannelColors;
- Setting<FontSetting> commentsFont;
- // Misc
- Setting<MODTYPE> defaultModType;
- Setting<NewFileAction> defaultNewFileAction;
- Setting<PlugVolumeHandling> DefaultPlugVolumeHandling;
- Setting<bool> autoApplySmoothFT2Ramping;
- CachedSetting<uint32> MiscITCompressionStereo; // Mask: bit0: IT, bit1: Compat IT, bit2: MPTM
- CachedSetting<uint32> MiscITCompressionMono; // Mask: bit0: IT, bit1: Compat IT, bit2: MPTM
- CachedSetting<bool> MiscSaveChannelMuteStatus;
- CachedSetting<bool> MiscAllowMultipleCommandsPerKey;
- CachedSetting<bool> MiscDistinguishModifiers;
- Setting<ProcessPriorityClass> MiscProcessPriorityClass;
- CachedSetting<bool> MiscFlushFileBuffersOnSave;
- CachedSetting<bool> MiscCacheCompleteFileBeforeLoading;
- Setting<bool> MiscUseSingleInstance;
- // Sound Settings
- bool m_SoundShowRecordingSettings;
- Setting<bool> m_SoundShowDeprecatedDevices;
- Setting<bool> m_SoundDeprecatedDeviceWarningShown;
- Setting<std::vector<uint32> > m_SoundSampleRates;
- Setting<bool> m_SoundSettingsOpenDeviceAtStartup;
- Setting<SoundDeviceStopMode> m_SoundSettingsStopMode;
- bool m_SoundDeviceSettingsUseOldDefaults;
- SoundDevice::Legacy::ID m_SoundDeviceID_DEPRECATED;
- SoundDevice::Settings m_SoundDeviceSettingsDefaults;
- SoundDevice::Settings GetSoundDeviceSettingsDefaults() const;
- #if defined(MPT_WITH_DIRECTSOUND)
- bool m_SoundDeviceDirectSoundOldDefaultIdentifier;
- #endif // MPT_WITH_DIRECTSOUND
- Setting<SoundDevice::Identifier> m_SoundDeviceIdentifier;
- SoundDevice::Identifier GetSoundDeviceIdentifier() const;
- void SetSoundDeviceIdentifier(const SoundDevice::Identifier &identifier);
- SoundDevice::Settings GetSoundDeviceSettings(const SoundDevice::Identifier &device) const;
- void SetSoundDeviceSettings(const SoundDevice::Identifier &device, const SoundDevice::Settings &settings);
- Setting<uint32> MixerMaxChannels;
- Setting<uint32> MixerDSPMask;
- Setting<uint32> MixerFlags;
- Setting<uint32> MixerSamplerate;
- Setting<uint32> MixerOutputChannels;
- Setting<uint32> MixerPreAmp;
- Setting<uint32> MixerStereoSeparation;
- Setting<uint32> MixerVolumeRampUpMicroseconds;
- Setting<uint32> MixerVolumeRampDownMicroseconds;
- Setting<uint32> MixerNumInputChannels;
- MixerSettings GetMixerSettings() const;
- void SetMixerSettings(const MixerSettings &settings);
- Setting<ResamplingMode> ResamplerMode;
- Setting<uint8> ResamplerSubMode;
- Setting<int32> ResamplerCutoffPercent;
- Setting<Resampling::AmigaFilter> ResamplerEmulateAmiga;
- CResamplerSettings GetResamplerSettings() const;
- void SetResamplerSettings(const CResamplerSettings &settings);
- Setting<int> SoundBoostedThreadPriority;
- Setting<mpt::ustring> SoundBoostedThreadMMCSSClass;
- Setting<bool> SoundBoostedThreadRealtimePosix;
- Setting<int> SoundBoostedThreadNicenessPosix;
- Setting<int> SoundBoostedThreadRtprioPosix;
- Setting<bool> SoundMaskDriverCrashes;
- Setting<bool> SoundAllowDeferredProcessing;
- // MIDI Settings
- Setting<UINT> m_nMidiDevice;
- Setting<CString> midiDeviceName;
- // FIXME: MIDI recording is currently done in its own callback/thread and
- // accesses settings framework from in there. Work-around the ASSERTs for
- // now by using cached settings.
- CachedSetting<uint32> m_dwMidiSetup;
- CachedSetting<RecordAftertouchOptions> aftertouchBehaviour;
- CachedSetting<uint16> midiVelocityAmp;
- CachedSetting<std::bitset<128> > midiIgnoreCCs;
- Setting<uint32> midiImportPatternLen;
- Setting<uint32> midiImportQuantize;
- Setting<uint8> midiImportTicks;
- // Pattern Editor
- CachedSetting<bool> gbLoopSong;
- CachedSetting<UINT> gnPatternSpacing;
- CachedSetting<bool> gbPatternVUMeters;
- CachedSetting<bool> gbPatternPluginNames;
- CachedSetting<bool> gbPatternRecord;
- CachedSetting<bool> patternNoEditPopup;
- CachedSetting<bool> patternStepCommands;
- CachedSetting<uint32> m_dwPatternSetup;
- CachedSetting<uint32> m_nRowHighlightMeasures; // primary (measures) and secondary (beats) highlight
- CachedSetting<uint32> m_nRowHighlightBeats; // primary (measures) and secondary (beats) highlight
- CachedSetting<ROWINDEX> recordQuantizeRows;
- CachedSetting<UINT> gnAutoChordWaitTime;
- CachedSetting<int32> orderlistMargins;
- CachedSetting<int32> rowDisplayOffset;
- Setting<FontSetting> patternFont;
- Setting<mpt::ustring> patternFontDot;
- Setting<int32> effectVisWidth;
- Setting<int32> effectVisHeight;
- Setting<int32> effectVisX;
- Setting<int32> effectVisY;
- Setting<CString> patternAccessibilityFormat;
- CachedSetting<bool> patternAlwaysDrawWholePatternOnScrollSlow;
- CachedSetting<bool> orderListOldDropBehaviour;
- // Sample Editor
- Setting<SampleUndoBufferSize> m_SampleUndoBufferSize;
- Setting<SampleEditorKeyBehaviour> sampleEditorKeyBehaviour;
- Setting<SampleEditorDefaultFormat> m_defaultSampleFormat;
- Setting<TimelineFormat> sampleEditorTimelineFormat;
- Setting<ResamplingMode> sampleEditorDefaultResampler;
- Setting<int32> m_nFinetuneStep; // Increment finetune by x cents when using spin control.
- Setting<int32> m_FLACCompressionLevel; // FLAC compression level for saving (0...8)
- Setting<bool> compressITI;
- Setting<bool> m_MayNormalizeSamplesOnLoad;
- Setting<bool> previewInFileDialogs;
- CachedSetting<bool> cursorPositionInHex;
- // Export
- Setting<bool> ExportDefaultToSoundcardSamplerate;
- StreamEncoderSettingsConf ExportStreamEncoderSettings;
- // Components
- Setting<bool> ComponentsLoadOnStartup;
- Setting<bool> ComponentsKeepLoaded;
- bool IsComponentBlocked(const std::string &name);
- // Effects
- #ifndef NO_REVERB
- CReverbSettings m_ReverbSettings;
- #endif
- #ifndef NO_DSP
- CSurroundSettings m_SurroundSettings;
- #endif
- #ifndef NO_DSP
- CMegaBassSettings m_MegaBassSettings;
- #endif
- #ifndef NO_EQ
- EQPreset m_EqSettings;
- EQPreset m_EqUserPresets[4];
- #endif
- #ifndef NO_DSP
- BitCrushSettings m_BitCrushSettings;
- #endif
- // Display (Colors)
- std::array<COLORREF, MAX_MODCOLORS> rgbCustomColors;
- // AutoSave
- CachedSetting<bool> CreateBackupFiles;
- CachedSetting<bool> AutosaveEnabled;
- CachedSetting<uint32> AutosaveIntervalMinutes;
- CachedSetting<uint32> AutosaveHistoryDepth;
- CachedSetting<bool> AutosaveUseOriginalPath;
- ConfigurableDirectory AutosavePath;
-
- // Paths
- ConfigurableDirectory PathSongs;
- ConfigurableDirectory PathSamples;
- ConfigurableDirectory PathInstruments;
- ConfigurableDirectory PathPlugins;
- ConfigurableDirectory PathPluginPresets;
- ConfigurableDirectory PathExport;
- DefaultAndWorkingDirectory PathTunings;
- DefaultAndWorkingDirectory PathUserTemplates;
- mpt::PathString m_szKbdFile;
- // Default template
- Setting<mpt::PathString> defaultTemplateFile;
- Setting<mpt::ustring> defaultArtist;
- Setting<uint32> mruListLength;
- std::vector<mpt::PathString> mruFiles;
- // Chords
- MPTChords Chords;
- // Tunings
- std::unique_ptr<CTuningCollection> oldLocalTunings;
- // Plugins
- Setting<bool> bridgeAllPlugins;
- Setting<bool> enableAutoSuspend;
- CachedSetting<bool> midiMappingInPluginEditor;
- Setting<mpt::ustring> pluginProjectPath;
- CachedSetting<mpt::lstring> vstHostProductString;
- CachedSetting<mpt::lstring> vstHostVendorString;
- CachedSetting<int32> vstHostVendorVersion;
- // Broken Plugins Workarounds
- Setting<bool> BrokenPluginsWorkaroundVSTMaskAllCrashes;
- Setting<bool> BrokenPluginsWorkaroundVSTNeverUnloadAnyPlugin;
- #if defined(MPT_ENABLE_UPDATE)
- // Update
- Setting<bool> UpdateEnabled;
- Setting<bool> UpdateInstallAutomatically;
- Setting<mpt::Date::Unix> UpdateLastUpdateCheck;
- Setting<int32> UpdateUpdateCheckPeriod_DEPRECATED;
- Setting<int32> UpdateIntervalDays;
- Setting<uint32> UpdateChannel;
- Setting<mpt::ustring> UpdateUpdateURL_DEPRECATED;
- Setting<mpt::ustring> UpdateAPIURL;
- Setting<bool> UpdateStatisticsConsentAsked;
- Setting<bool> UpdateStatistics;
- Setting<bool> UpdateSendGUID_DEPRECATED;
- Setting<bool> UpdateShowUpdateHint;
- Setting<CString> UpdateIgnoreVersion;
- Setting<bool> UpdateSkipSignatureVerificationUNSECURE;
- Setting<std::vector<mpt::ustring>> UpdateSigningKeysRootAnchors;
- #endif // MPT_ENABLE_UPDATE
- // Wine support
- Setting<bool> WineSupportEnabled;
- Setting<bool> WineSupportAlwaysRecompile;
- Setting<bool> WineSupportAskCompile;
- Setting<int32> WineSupportCompileVerbosity;
- Setting<bool> WineSupportForeignOpenMPT;
- Setting<bool> WineSupportAllowUnknownHost;
- Setting<int32> WineSupportEnablePulseAudio; // 0==off 1==auto 2==on
- Setting<int32> WineSupportEnablePortAudio; // 0==off 1==auto 2==on
- Setting<int32> WineSupportEnableRtAudio; // 0==off 1==auto 2==on
- public:
- TrackerSettings(SettingsContainer &conf);
- ~TrackerSettings();
- void MigrateOldSoundDeviceSettings(SoundDevice::Manager &manager);
- private:
- void MigrateTunings(const Version storedVersion);
- std::unique_ptr<CTuningCollection> LoadLocalTunings();
- public:
- void SaveSettings();
- static void GetDefaultColourScheme(std::array<COLORREF, MAX_MODCOLORS> &colours);
- std::vector<uint32> GetSampleRates() const;
- static MPTChords &GetChords() { return Instance().Chords; }
- // Get settings object singleton
- static TrackerSettings &Instance();
- void SetMIDIDevice(UINT id);
- UINT GetCurrentMIDIDevice();
- protected:
- static std::vector<uint32> GetDefaultSampleRates();
- #ifndef NO_EQ
- void FixupEQ(EQPreset &eqSettings);
- #endif // !NO_EQ
- void LoadChords(MPTChords &chords);
- void SaveChords(MPTChords &chords);
- };
- OPENMPT_NAMESPACE_END
|