diff options
Diffstat (limited to 'src/settings.h')
-rw-r--r-- | src/settings.h | 123 |
1 files changed, 86 insertions, 37 deletions
diff --git a/src/settings.h b/src/settings.h index b132c1b..c79e4e5 100644 --- a/src/settings.h +++ b/src/settings.h @@ -31,10 +31,25 @@ #include <cassert> #include "atomic.h" +#include "notifier.h" + +enum class LoadStatus : unsigned int +{ + Idle, + Loading, + Done, + Error +}; //! Engine settings struct Settings { + Atomic<std::string> drumkit_file; + Atomic<LoadStatus> drumkit_load_status{LoadStatus::Idle}; + + Atomic<std::string> midimap_file; + Atomic<LoadStatus> midimap_load_status{LoadStatus::Idle}; + Atomic<bool> enable_velocity_modifier{true}; Atomic<float> velocity_modifier_falloff{0.5f}; Atomic<float> velocity_modifier_weight{0.25f}; @@ -51,45 +66,15 @@ struct Settings Atomic<std::string> current_file; }; -//! Getter utility class. -template <typename T> class SettingRef +//! Settings getter class. +struct SettingsGetter { -public: - SettingRef(Atomic<T>& value) - : value(value) - { - // string isn't lock free either - assert((std::is_same<T, std::string>::value || value.is_lock_free())); - } - - bool hasChanged() - { - T tmp = cache; - cache.exchange(value); - - if(firstAccess) - { - firstAccess = false; - return true; - } - - return tmp != cache; - } - - T getValue() const - { - return cache; - } + SettingRef<std::string> drumkit_file; + SettingRef<LoadStatus> drumkit_load_status; -private: - bool firstAccess{true}; - Atomic<T>& value; - Atomic<T> cache; -}; + SettingRef<std::string> midimap_file; + SettingRef<LoadStatus> midimap_load_status; -//! Combined getter class. -struct SettingsGetter -{ SettingRef<bool> enable_velocity_modifier; SettingRef<float> velocity_modifier_falloff; SettingRef<float> velocity_modifier_weight; @@ -106,7 +91,11 @@ struct SettingsGetter SettingRef<std::string> current_file; SettingsGetter(Settings& settings) - : enable_velocity_modifier{settings.enable_velocity_modifier} + : drumkit_file(settings.drumkit_file) + , drumkit_load_status(settings.drumkit_load_status) + , midimap_file(settings.midimap_file) + , midimap_load_status(settings.midimap_load_status) + , enable_velocity_modifier{settings.enable_velocity_modifier} , velocity_modifier_falloff{settings.velocity_modifier_falloff} , velocity_modifier_weight{settings.velocity_modifier_weight} , enable_velocity_randomiser{settings.enable_velocity_randomiser} @@ -120,6 +109,66 @@ struct SettingsGetter } }; +//! Settings change notifier class. +class SettingsNotifier +{ +public: + Notifier<std::string> drumkit_file; + Notifier<LoadStatus> drumkit_load_status; + + Notifier<std::string> midimap_file; + Notifier<LoadStatus> midimap_load_status; + + Notifier<bool> enable_velocity_modifier; + Notifier<float> velocity_modifier_falloff; + Notifier<float> velocity_modifier_weight; + + Notifier<bool> enable_velocity_randomiser; + Notifier<float> velocity_randomiser_weight; + + Notifier<double> samplerate; + + Notifier<bool> enable_resampling; + + Notifier<int> number_of_files; + Notifier<int> number_of_files_loaded; + Notifier<std::string> current_file; + + void evaluate() + { +#define EVAL(x) if(settings.x.hasChanged()) { x(settings.x.getValue()); } + + EVAL(drumkit_file); + EVAL(drumkit_load_status); + + EVAL(midimap_file); + EVAL(midimap_load_status); + + EVAL(enable_velocity_modifier); + EVAL(velocity_modifier_falloff); + EVAL(velocity_modifier_weight); + + EVAL(enable_velocity_randomiser); + EVAL(velocity_randomiser_weight); + + EVAL(samplerate); + + EVAL(enable_resampling); + + EVAL(number_of_files); + EVAL(number_of_files_loaded); + EVAL(current_file); + } + + SettingsNotifier(Settings& settings) + : settings(settings) + { + } + +private: + SettingsGetter settings; +}; + // lovely reminder: NO, GLOCKE. NOOOO!! /* enum class IntParams { |