From 057ef1d83ba263fb2adf1aa86f8e281ab0065c43 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 8 Apr 2016 00:15:32 +0200 Subject: Refactoring to finally get rid of MessageHandler/Receiver in favor of the new Settings mechanism. --- src/settings.h | 123 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 86 insertions(+), 37 deletions(-) (limited to 'src/settings.h') 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 #include "atomic.h" +#include "notifier.h" + +enum class LoadStatus : unsigned int +{ + Idle, + Loading, + Done, + Error +}; //! Engine settings struct Settings { + Atomic drumkit_file; + Atomic drumkit_load_status{LoadStatus::Idle}; + + Atomic midimap_file; + Atomic midimap_load_status{LoadStatus::Idle}; + Atomic enable_velocity_modifier{true}; Atomic velocity_modifier_falloff{0.5f}; Atomic velocity_modifier_weight{0.25f}; @@ -51,45 +66,15 @@ struct Settings Atomic current_file; }; -//! Getter utility class. -template class SettingRef +//! Settings getter class. +struct SettingsGetter { -public: - SettingRef(Atomic& value) - : value(value) - { - // string isn't lock free either - assert((std::is_same::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 drumkit_file; + SettingRef drumkit_load_status; -private: - bool firstAccess{true}; - Atomic& value; - Atomic cache; -}; + SettingRef midimap_file; + SettingRef midimap_load_status; -//! Combined getter class. -struct SettingsGetter -{ SettingRef enable_velocity_modifier; SettingRef velocity_modifier_falloff; SettingRef velocity_modifier_weight; @@ -106,7 +91,11 @@ struct SettingsGetter SettingRef 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 drumkit_file; + Notifier drumkit_load_status; + + Notifier midimap_file; + Notifier midimap_load_status; + + Notifier enable_velocity_modifier; + Notifier velocity_modifier_falloff; + Notifier velocity_modifier_weight; + + Notifier enable_velocity_randomiser; + Notifier velocity_randomiser_weight; + + Notifier samplerate; + + Notifier enable_resampling; + + Notifier number_of_files; + Notifier number_of_files_loaded; + Notifier 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 { -- cgit v1.2.3