diff options
| author | Bent Bisballe Nyeng <deva@aasimon.org> | 2016-04-08 00:15:32 +0200 | 
|---|---|---|
| committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2016-04-08 00:15:32 +0200 | 
| commit | 057ef1d83ba263fb2adf1aa86f8e281ab0065c43 (patch) | |
| tree | 31c1f237e3a9df9fc241d87527f7dd4245665d43 | |
| parent | b530ac02af61e320e137a392decef1b3cc5af2c4 (diff) | |
Refactoring to finally get rid of MessageHandler/Receiver in favor of the new Settings mechanism.
35 files changed, 406 insertions, 937 deletions
diff --git a/drumgizmo/drumgizmoc.cc b/drumgizmo/drumgizmoc.cc index 357877d..e993dc3 100644 --- a/drumgizmo/drumgizmoc.cc +++ b/drumgizmo/drumgizmoc.cc @@ -92,36 +92,7 @@ static const char usage_str[] =      "  dummy:\n"      "\n"; -CliMain::CliMain() -	: MessageReceiver(MSGRCV_UI) -{ -	loading = true; // Block by default -} - -CliMain::~CliMain() -{ -	hug_close(); -} - -void CliMain::handleMessage(Message* msg) -{ -	switch(msg->type()) -	{ -	case Message::LoadStatus: -		{ -			auto ls = static_cast<LoadStatusMessage*>(msg); -			if(ls->numer_of_files_loaded == ls->number_of_files) -			{ -				loading = false; -			} -		} -		break; -	default: -		break; -	} -} - -int CliMain::run(int argc, char* argv[]) +int main(int argc, char* argv[])  {  	int c; @@ -383,21 +354,37 @@ int CliMain::run(int argc, char* argv[])  		return 1;  	} -	printf("Loading drumkit, this may take a while..."); -	fflush(stdout); -	loading = true; -	while(async == false && loading) +	printf("Loading drumkit, this may take a while:\n"); + +	if(!async)  	{ +		while(settings.drumkit_load_status.load() != LoadStatus::Done) +		{  #ifdef WIN32 -		SleepEx(500, FALSE); +			SleepEx(10, FALSE);  #else -		usleep(500000); +			usleep(10000);  #endif /*WIN32*/ -		handleMessages(); -		printf("."); -		fflush(stdout); + +			int total = settings.number_of_files.load(); +			int loaded =  settings.number_of_files_loaded.load(); + +			printf("\r%d of %d     ", loaded, total); +			fflush(stdout); + +			if(settings.drumkit_load_status.load() == LoadStatus::Error) +			{ +				printf("\nLoad error\n"); +				return 1; +			} + +			if(loaded == total) +			{ +				//break; +			} +		} +		printf("\ndone\n");  	} -	printf("done.\n");  	gizmo.setSamplerate(oe->getSamplerate()); @@ -412,14 +399,7 @@ int CliMain::run(int argc, char* argv[])  	printf("Quit.\n");  	fflush(stdout); -	return 0; -} - -int main(int argc, char* argv[]) -{ -	CliMain cli; - -	cli.run(argc, argv); +	hug_close();  	return 0;  } diff --git a/drumgizmo/drumgizmoc.h b/drumgizmo/drumgizmoc.h index 231aec6..cc2f96c 100644 --- a/drumgizmo/drumgizmoc.h +++ b/drumgizmo/drumgizmoc.h @@ -24,21 +24,4 @@   *  along with DrumGizmo; if not, write to the Free Software   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.   */ -  #pragma once - -#include "messagereceiver.h" - -class CliMain : public MessageReceiver -{ -public: -	CliMain(); -	virtual ~CliMain(); - -	int run(int argc, char* argv[]); -	void handleMessage(Message* msg); - -private: -	bool loading; -}; - diff --git a/plugin/Makefile.mingw32.in b/plugin/Makefile.mingw32.in index 779f54b..8b341c7 100644 --- a/plugin/Makefile.mingw32.in +++ b/plugin/Makefile.mingw32.in @@ -28,8 +28,6 @@ DG_SRC = \  	@top_srcdir@/src/instrument.cc \  	@top_srcdir@/src/instrumentparser.cc \  	@top_srcdir@/src/memchecker.cc \ -	@top_srcdir@/src/messagehandler.cc \ -	@top_srcdir@/src/messagereceiver.cc \  	@top_srcdir@/src/midimapparser.cc \  	@top_srcdir@/src/midimapper.cc \  	@top_srcdir@/src/mutex.cc \ diff --git a/plugin/drumgizmo_plugin.cc b/plugin/drumgizmo_plugin.cc index 24cfb9a..06c2799 100644 --- a/plugin/drumgizmo_plugin.cc +++ b/plugin/drumgizmo_plugin.cc @@ -143,7 +143,7 @@ bool DrumGizmoPlugin::hasGUI()  void DrumGizmoPlugin::createWindow(void *parent)  { -	plugin_gui = std::make_shared<GUI::PluginGUI>(parent); +	plugin_gui = std::make_shared<GUI::PluginGUI>(settings, parent);  	resizeWindow(370, 330);  	onShowWindow();  } diff --git a/plugingui/Makefile.am b/plugingui/Makefile.am index 3dee864..4176c07 100644 --- a/plugingui/Makefile.am +++ b/plugingui/Makefile.am @@ -16,9 +16,7 @@ plugingui_SOURCES = \  	$(top_srcdir)/src/configfile.cc \  	$(top_srcdir)/src/thread.cc \  	$(top_srcdir)/src/semaphore.cc \ -	$(top_srcdir)/src/mutex.cc \ -	$(top_srcdir)/src/messagehandler.cc \ -	$(top_srcdir)/src/messagereceiver.cc +	$(top_srcdir)/src/mutex.cc  rcgen_SOURCES = rcgen.cc @@ -46,7 +44,6 @@ EXTRA_DIST = \  	nativewindow.h \  	nativewindow_win32.h \  	nativewindow_x11.h \ -	notifier.h \  	painter.h \  	pixelbuffer.h \  	pluginconfig.h \ diff --git a/plugingui/button.h b/plugingui/button.h index 7e3e168..1bfeb2d 100644 --- a/plugingui/button.h +++ b/plugingui/button.h @@ -28,9 +28,10 @@  #include <string> +#include <notifier.h> +  #include "widget.h"  #include "painter.h" -#include "notifier.h"  #include "font.h"  namespace GUI { diff --git a/plugingui/checkbox.h b/plugingui/checkbox.h index 3da5511..5c658a5 100644 --- a/plugingui/checkbox.h +++ b/plugingui/checkbox.h @@ -26,9 +26,10 @@   */  #pragma once +#include <notifier.h> +  #include "widget.h"  #include "image.h" -#include "notifier.h"  namespace GUI { diff --git a/plugingui/dgwindow.cc b/plugingui/dgwindow.cc index 25cbdf0..c325703 100644 --- a/plugingui/dgwindow.cc +++ b/plugingui/dgwindow.cc @@ -30,12 +30,12 @@  #include "verticalline.h"  #include "../version.h" -#include "messagehandler.h"  #include "pluginconfig.h"  namespace GUI { -class LabeledControl : public Widget +class LabeledControl +	: public Widget  {  public:  	LabeledControl(Widget* parent, const std::string& name) @@ -60,7 +60,8 @@ public:  	Label caption{this};  }; -class File : public Widget +class File +	: public Widget  {  public:  	File(Widget* parent) @@ -83,7 +84,8 @@ public:  	Button browseButton{this};  }; -class HumanizeControls : public Widget +class HumanizeControls +	: public Widget  {  public:  	HumanizeControls(Widget* parent) @@ -119,10 +121,8 @@ public:  	Knob falloffKnob{&falloff};  }; -DGWindow::DGWindow(void* native_window, MessageHandler& messageHandler, -                   Config& config, Settings& settings) +DGWindow::DGWindow(void* native_window, Config& config, Settings& settings)  	: Window(native_window) -	, messageHandler(messageHandler)  	, config(config)  	, settings(settings)  { @@ -180,6 +180,7 @@ DGWindow::DGWindow(void* native_window, MessageHandler& messageHandler,  	midimapFileProgress = new ProgressBar(this);  	midimapFileProgress->resize(width() - 40, 11); +	midimapFileProgress->setTotal(2);  	layout.addItem(midimapFileProgress);  	VerticalLine *l2 = new VerticalLine(this); @@ -208,7 +209,7 @@ DGWindow::DGWindow(void* native_window, MessageHandler& messageHandler,  	layout.addItem(l3);  	Label *lbl_version = new Label(this); -	lbl_version->setText(".::. v" VERSION "  .::.  http://www.drumgizmo.org  .::.  LGPLv3 .::."); +	lbl_version->setText(".::.  v" VERSION "  .::.  http://www.drumgizmo.org  .::.  LGPLv3 .::.");  	lbl_version->resize(width(), 20);  	lbl_version->setAlignment(TextAlignment::center);  	layout.addItem(lbl_version); @@ -220,6 +221,50 @@ DGWindow::DGWindow(void* native_window, MessageHandler& messageHandler,  	fileBrowser->hide();  } +void DGWindow::setDrumKitLoadStatus(LoadStatus load_status) +{ +	ProgressBarState state = ProgressBarState::Blue; +	switch(load_status) +	{ +	case LoadStatus::Idle: +	case LoadStatus::Loading: +		state = ProgressBarState::Blue; +		break; +	case LoadStatus::Done: +		state = ProgressBarState::Green; +		break; +	case LoadStatus::Error: +		state = ProgressBarState::Red; +		break; +	} +	drumkitFileProgress->setState(state); +} + +void DGWindow::setMidiMapLoadStatus(LoadStatus load_status) +{ +	ProgressBarState state = ProgressBarState::Blue; +	switch(load_status) +	{ +	case LoadStatus::Idle: +		midimapFileProgress->setValue(0); +		break; +	case LoadStatus::Loading: +		midimapFileProgress->setValue(1); +		state = ProgressBarState::Blue; +		break; +	case LoadStatus::Done: +		midimapFileProgress->setValue(2); +		state = ProgressBarState::Green; +		break; +	case LoadStatus::Error: +		midimapFileProgress->setValue(2); +		state = ProgressBarState::Red; +		break; +	} + +	midimapFileProgress->setState(state); +} +  void DGWindow::repaintEvent(RepaintEvent* repaintEvent)  {  	if(!visible()) @@ -234,45 +279,41 @@ void DGWindow::repaintEvent(RepaintEvent* repaintEvent)  void DGWindow::attackValueChanged(float value)  { -	//ChangeSettingMessage *msg = -	//	new ChangeSettingMessage(ChangeSettingMessage::velocity_modifier_weight, -	//													 value); -	//messageHandler.sendMessage(MSGRCV_ENGINE, msg); -  	settings.velocity_modifier_weight.store(value); -#ifdef STANDALONE +#ifdef STANDALONE // For GUI debugging  	int i = value * 4;  	switch(i) { -	case 0: drumkitFileProgress->setState(ProgressBarState::Off); break; -	case 1: drumkitFileProgress->setState(ProgressBarState::Blue); break; -	case 2: drumkitFileProgress->setState(ProgressBarState::Green); break; -	case 3: drumkitFileProgress->setState(ProgressBarState::Red); break; -	default: break; +	case 0: +		drumkitFileProgress->setState(ProgressBarState::Off); +		break; +	case 1: +		drumkitFileProgress->setState(ProgressBarState::Blue); +		break; +	case 2: +		drumkitFileProgress->setState(ProgressBarState::Green); +		break; +	case 3: +		drumkitFileProgress->setState(ProgressBarState::Red); +		break; +	default: +		break;  	}  #endif  }  void DGWindow::falloffValueChanged(float value)  { -	//ChangeSettingMessage *msg = -	//	new ChangeSettingMessage(ChangeSettingMessage::velocity_modifier_falloff, -	//	                         value); -	//messageHandler.sendMessage(MSGRCV_ENGINE, msg); -  	settings.velocity_modifier_falloff.store(value); -#ifdef STANDALONE -	drumkitFileProgress->setProgress(value); +#ifdef STANDALONE // For GUI debugging +	drumkitFileProgress->setTotal(100); +	drumkitFileProgress->setValue(value * 100);  #endif  }  void DGWindow::velocityCheckClick(bool checked)  { -//	ChangeSettingMessage *msg = -//		new ChangeSettingMessage(ChangeSettingMessage::enable_velocity_modifier, -//		                         checked); -//	messageHandler.sendMessage(MSGRCV_ENGINE, msg);  	settings.enable_velocity_modifier.store(checked);  } @@ -323,13 +364,7 @@ void DGWindow::selectKitFile(const std::string& filename)  	config.lastkit = drumkit;  	config.save(); -	drumkitFileProgress->setProgress(0); -	drumkitFileProgress->setState(ProgressBarState::Blue); - -	LoadDrumKitMessage *msg = new LoadDrumKitMessage(); -	msg->drumkitfile = drumkit; - -	messageHandler.sendMessage(MSGRCV_ENGINE, msg); +	settings.drumkit_file.store(drumkit);  }  void DGWindow::selectMapFile(const std::string& filename) @@ -342,9 +377,7 @@ void DGWindow::selectMapFile(const std::string& filename)  	config.lastmidimap = midimap;  	config.save(); -	LoadMidimapMessage *msg = new LoadMidimapMessage(); -	msg->midimapfile = midimap; -	messageHandler.sendMessage(MSGRCV_ENGINE, msg); +	settings.midimap_file.store(midimap);  } diff --git a/plugingui/dgwindow.h b/plugingui/dgwindow.h index c4fbeab..72e4679 100644 --- a/plugingui/dgwindow.h +++ b/plugingui/dgwindow.h @@ -26,8 +26,9 @@   */  #pragma once -#include "window.h" +#include <settings.h> +#include "window.h"  #include "label.h"  #include "lineedit.h"  #include "checkbox.h" @@ -37,10 +38,6 @@  #include "filebrowser.h"  #include "layout.h" -#include <settings.h> - -class MessageHandler; -  namespace GUI {  class Config; @@ -49,8 +46,7 @@ class File;  class DGWindow : public Window {  public: -	DGWindow(void* native_window, MessageHandler& messageHandler, Config& config, -	         Settings& settings); +	DGWindow(void* native_window, Config& config, Settings& settings);  	Header* header; @@ -68,6 +64,9 @@ public:  	Knob* falloffKnob;  	FileBrowser* fileBrowser; +	void setDrumKitLoadStatus(LoadStatus load_status); +	void setMidiMapLoadStatus(LoadStatus load_status); +  protected:  	// From Widget:  	void repaintEvent(RepaintEvent* repaintEvent) override; @@ -81,7 +80,6 @@ private:  	void selectKitFile(const std::string& filename);  	void selectMapFile(const std::string& filename); -	MessageHandler& messageHandler;  	Config& config;  	VBoxLayout layout{this}; diff --git a/plugingui/eventhandler.h b/plugingui/eventhandler.h index 1fdb1e8..490c515 100644 --- a/plugingui/eventhandler.h +++ b/plugingui/eventhandler.h @@ -26,9 +26,10 @@   */  #pragma once +#include <notifier.h> +  #include "guievent.h"  #include "nativewindow.h" -#include "notifier.h"  namespace GUI { diff --git a/plugingui/filebrowser.h b/plugingui/filebrowser.h index 04b34f6..bc2019f 100644 --- a/plugingui/filebrowser.h +++ b/plugingui/filebrowser.h @@ -26,15 +26,15 @@   */  #pragma once -#include "widget.h" +#include <notifier.h> +#include "widget.h"  #include "button.h"  #include "listbox.h"  #include "lineedit.h"  #include "label.h"  #include "image.h"  #include "directory.h" -#include "notifier.h"  namespace GUI { diff --git a/plugingui/knob.h b/plugingui/knob.h index 10d91d6..d144184 100644 --- a/plugingui/knob.h +++ b/plugingui/knob.h @@ -26,10 +26,11 @@   */  #pragma once +#include <notifier.h> +  #include "widget.h"  #include "image.h"  #include "font.h" -#include "notifier.h"  namespace GUI { diff --git a/plugingui/layout.h b/plugingui/layout.h index 55cc93f..49bf75c 100644 --- a/plugingui/layout.h +++ b/plugingui/layout.h @@ -29,7 +29,7 @@  #include <list>  #include <cstdlib> -#include "notifier.h" +#include <notifier.h>  namespace GUI { diff --git a/plugingui/listboxbasic.h b/plugingui/listboxbasic.h index 7953dc3..2ebe845 100644 --- a/plugingui/listboxbasic.h +++ b/plugingui/listboxbasic.h @@ -29,11 +29,12 @@  #include <string.h>  #include <vector> +#include <notifier.h> +  #include "widget.h"  #include "font.h"  #include "painter.h"  #include "scrollbar.h" -#include "notifier.h"  namespace GUI { diff --git a/plugingui/listboxthin.h b/plugingui/listboxthin.h index 3139ecc..1617234 100644 --- a/plugingui/listboxthin.h +++ b/plugingui/listboxthin.h @@ -29,10 +29,11 @@  #include <string.h>  #include <vector> +#include <notifier.h> +  #include "widget.h"  #include "painter.h"  #include "listboxbasic.h" -#include "notifier.h"  namespace GUI { diff --git a/plugingui/plugingui.cc b/plugingui/plugingui.cc index 9bac007..2802c44 100644 --- a/plugingui/plugingui.cc +++ b/plugingui/plugingui.cc @@ -26,18 +26,17 @@   */  #include "plugingui.h" +#include <iostream> +  #include <hugin.hpp>  #include "pluginconfig.h" -#include "messagehandler.h" - -#include <iostream>  namespace GUI { -PluginGUI::PluginGUI(void* native_window) -	: MessageReceiver(MSGRCV_UI) -	, native_window(native_window) +PluginGUI::PluginGUI(Settings& settings, void* native_window) +	: native_window(native_window) +	, settings(settings)  {  	init();  } @@ -46,70 +45,6 @@ PluginGUI::~PluginGUI()  {  } -void PluginGUI::handleMessage(Message *msg) -{ -	Painter p(*window);// Make sure we only redraw buffer once (set refcount to 1) - -	switch(msg->type()) { -	case Message::LoadStatus: -		{ -			LoadStatusMessage *ls = (LoadStatusMessage*)msg; -			window->drumkitFileProgress->setProgress((float)ls->numer_of_files_loaded / -			                              (float)ls->number_of_files); -			if(ls->numer_of_files_loaded == ls->number_of_files) -			{ -				window->drumkitFileProgress->setState(ProgressBarState::Green); -			} -		} -		break; -	case Message::LoadStatusMidimap: -		{ -			LoadStatusMessageMidimap *ls = (LoadStatusMessageMidimap*)msg; -			window->midimapFileProgress->setProgress(1); -			if(ls->success) -			{ -				window->midimapFileProgress->setState(ProgressBarState::Green); -			} -			else -			{ -				window->midimapFileProgress->setState(ProgressBarState::Red); -			} -		} -		break; -	case Message::EngineSettingsMessage: -		{ -			EngineSettingsMessage *settings = (EngineSettingsMessage *)msg; -			window->lineedit->setText(settings->drumkitfile); -			if(settings->drumkit_loaded) -			{ -				window->drumkitFileProgress->setProgress(1); -				window->drumkitFileProgress->setState(ProgressBarState::Green); -			} -			else -			{ -				window->drumkitFileProgress->setProgress(0); -				window->drumkitFileProgress->setState(ProgressBarState::Blue); -			} -			window->lineedit2->setText(settings->midimapfile); -			if(settings->midimap_loaded) -			{ -				window->midimapFileProgress->setProgress(1); -				window->midimapFileProgress->setState(ProgressBarState::Green); -			} -			else -			{ -				window->midimapFileProgress->setProgress(0); -				window->midimapFileProgress->setState(ProgressBarState::Blue); -			} -			window->velocityCheck->setChecked(settings->enable_velocity_modifier); -			window->attackKnob->setValue(settings->velocity_modifier_weight); -			window->falloffKnob->setValue(settings->velocity_modifier_falloff); -		} -	default: -		break; -	} -} -  bool PluginGUI::processEvents()  {  	if(!initialised) @@ -118,69 +53,13 @@ bool PluginGUI::processEvents()  	}  	window->eventHandler()->processEvents(); -	//handleMessages(); - -	static bool foo = false; -	static int t = 0; -	if(t != time(nullptr)) -	{ -		t = time(nullptr); -		foo = !foo; -		float v = settings.velocity_modifier_falloff.load(); -		v += 0.1f; -		settings.velocity_modifier_falloff.store(v); -	} - -	Painter p(*window); - -	// Run through all settings one at a time propagate changes to the UI. -	if(getter.enable_velocity_modifier.hasChanged()) -	{ -		enable_velocity_modifier_notifier(getter.enable_velocity_modifier.getValue()); -	} -	if(getter.velocity_modifier_falloff.hasChanged())  	{ -		velocity_modifier_falloff_notifier(getter.velocity_modifier_falloff.getValue()); -	} +		Painter p(*window); -	if(getter.velocity_modifier_weight.hasChanged()) -	{ -		velocity_modifier_weight_notifier(getter.velocity_modifier_weight.getValue()); -	} - -	if(getter.enable_velocity_randomiser.hasChanged()) -	{ -		enable_velocity_randomiser_notifier(getter.enable_velocity_randomiser.getValue()); +		settings_notifier.evaluate();  	} -	if(getter.velocity_randomiser_weight.hasChanged()) -	{ -		velocity_randomiser_weight_notifier(getter.velocity_randomiser_weight.getValue()); -	} - -	if(getter.samplerate.hasChanged()) -	{ -		samplerate_notifier(getter.samplerate.getValue()); -	} - -	if(getter.enable_resampling.hasChanged()) -	{ -		enable_resampling_notifier(getter.enable_resampling.getValue()); -	} - -	if(getter.number_of_files.hasChanged() || -	   getter.number_of_files_loaded.hasChanged()) -	{ -		drumkit_file_progress_notifier((float)getter.number_of_files_loaded.getValue() / -		                               (float)getter.number_of_files.getValue()); -	} - -	//if(getter.current_file.hasChanged()) -	//{ -	//	current_file_notifier(getter.current_file.getValue()); -	//} -  	if(closing)  	{  		closeNotifier(); @@ -198,41 +77,51 @@ void PluginGUI::init()  	config = new Config();  	config->load(); -	window = new DGWindow(native_window, msghandler, *config, settings); +	window = new DGWindow(native_window, *config, settings); + + +	CONNECT(this, settings_notifier.drumkit_file, +	        window->lineedit, &LineEdit::setText); +	CONNECT(this, settings_notifier.drumkit_load_status, +	        window, &DGWindow::setDrumKitLoadStatus); -	CONNECT(this, enable_velocity_modifier_notifier, +	CONNECT(this, settings_notifier.midimap_file, +	        window->lineedit2, &LineEdit::setText); +	CONNECT(this, settings_notifier.midimap_load_status, +	        window, &DGWindow::setMidiMapLoadStatus); + +	CONNECT(this, settings_notifier.enable_velocity_modifier,  	        window->velocityCheck, &CheckBox::setChecked); -	CONNECT(this, velocity_modifier_falloff_notifier, +	CONNECT(this, settings_notifier.velocity_modifier_falloff,  	        window->falloffKnob, &Knob::setValue); -	CONNECT(this, velocity_modifier_weight_notifier, +	CONNECT(this, settings_notifier.velocity_modifier_weight,  	        window->attackKnob, &Knob::setValue); -	//CONNECT(this, enable_velocity_randomiser_notifier, -	//        window->velocityCheck, &CheckBox::setChecked); -	//CONNECT(this, velocity_randomiser_weight_notifier, -	//        window->velocityCheck, &CheckBox::setChecked); +	// TODO: +	//CONNECT(this, settings_notifier.enable_velocity_randomiser, +	//        window->, &CheckBox::setChecked); +	//CONNECT(this, settings_notifier.velocity_randomiser_weight, +	//        window->, &Knob::setValue); + +	//CONNECT(this, settings_notifier.samplerate, +	//        window->, &Knob::setValue); -	//CONNECT(this, samplerate_notifier, -	//        window->velocityCheck, &CheckBox::setChecked); +	//CONNECT(this, settings_notifier.enable_resampling, +	//        window->, &CheckBox::setChecked); -	//CONNECT(this, enable_resampling_notifier, -	//        window->velocityCheck, &CheckBox::setChecked); +	CONNECT(this, settings_notifier.number_of_files, +	        window->drumkitFileProgress, &ProgressBar::setTotal); -	CONNECT(this, drumkit_file_progress_notifier, -	        window->drumkitFileProgress, &ProgressBar::setProgress); +	CONNECT(this, settings_notifier.number_of_files_loaded, +	        window->drumkitFileProgress, &ProgressBar::setValue);  	auto eventHandler = window->eventHandler();  	CONNECT(eventHandler, closeNotifier, this, &PluginGUI::closeEventHandler);  	window->show(); -	{ // Request all engine settings -		EngineSettingsMessage *msg = new EngineSettingsMessage(); -		msghandler.sendMessage(MSGRCV_ENGINE, msg); -	} -  	initialised = true;  } diff --git a/plugingui/plugingui.h b/plugingui/plugingui.h index ca31c41..04b0a29 100644 --- a/plugingui/plugingui.h +++ b/plugingui/plugingui.h @@ -26,24 +26,20 @@   */  #pragma once +#include <settings.h> +#include <notifier.h> +  #include "dgwindow.h"  #include "eventhandler.h" -  #include "pluginconfig.h" -#include <settings.h> - -#include "messagereceiver.h" -#include "notifier.h" -  namespace GUI {  class PluginGUI -	: public MessageReceiver -	, public Listener +	: public Listener  {  public: -	PluginGUI(void* native_window = nullptr); +	PluginGUI(Settings& settings, void* native_window = nullptr);  	virtual ~PluginGUI();  	//! Process all events and messages in queue @@ -56,9 +52,6 @@ public:  	void show();  	void hide(); - -	void handleMessage(Message* msg); -  	DGWindow* window{nullptr};  	EventHandler* eventhandler{nullptr}; @@ -66,21 +59,6 @@ public:  	Notifier<> closeNotifier; -	// Setting notifiers: -	Notifier<bool> enable_velocity_modifier_notifier; -	Notifier<float> velocity_modifier_falloff_notifier; -	Notifier<float> velocity_modifier_weight_notifier; - -	Notifier<bool> enable_velocity_randomiser_notifier; -	Notifier<float> velocity_randomiser_weight_notifier; - -	Notifier<double> samplerate_notifier; - -	Notifier<bool> enable_resampling_notifier; - -	Notifier<float> drumkit_file_progress_notifier; -	//Notifier<std::string> current_file_notifier; -  	// Support old interface a little while longer..  	void setWindowClosedCallback(void (*handler)(void*), void* ptr); @@ -97,8 +75,8 @@ private:  	void (*windowClosedHandler)(void *){nullptr};  	void *windowClosedPtr{nullptr}; -	Settings settings; -	SettingsGetter getter{settings}; +	Settings& settings; +	SettingsNotifier settings_notifier{settings};  };  } // GUI:: diff --git a/plugingui/progressbar.cc b/plugingui/progressbar.cc index 932f17c..f934664 100644 --- a/plugingui/progressbar.cc +++ b/plugingui/progressbar.cc @@ -26,6 +26,8 @@   */  #include "progressbar.h" +#include <iostream> +  namespace GUI {  ProgressBar::ProgressBar(Widget *parent) @@ -46,9 +48,6 @@ ProgressBar::ProgressBar(Widget *parent)  	bar_green.left    = new Image(":progress_front_green_l.png");  	bar_green.right   = new Image(":progress_front_green_r.png");  	bar_green.center  = new Image(":progress_front_green_c.png"); - -	state = ProgressBarState::Blue; -	_progress = .5;  }  ProgressBar::~ProgressBar() @@ -79,22 +78,31 @@ void ProgressBar::setState(ProgressBarState state)  	}  } -float ProgressBar::progress() +void ProgressBar::setTotal(int total)  { -	return _progress; +	if(this->total != total) +	{ +		this->total = total; +		repaintEvent(nullptr); +	}  } -void ProgressBar::setProgress(float progress) +void ProgressBar::setValue(int value)  { -	_progress = progress; -	repaintEvent(nullptr); +	if(this->value != value) +	{ +		this->value = value; +		repaintEvent(nullptr); +	}  }  void ProgressBar::repaintEvent(RepaintEvent* repaintEvent)  {  	Painter p(*this); -	int max = width() * _progress; +	float progress = (float)value / (float)total; + +	int max = width() * progress;  	p.clear(); diff --git a/plugingui/progressbar.h b/plugingui/progressbar.h index d5f6c61..d48a8b5 100644 --- a/plugingui/progressbar.h +++ b/plugingui/progressbar.h @@ -46,8 +46,8 @@ public:  	ProgressBar(Widget *parent);  	~ProgressBar(); -	float progress(); -	void setProgress(float progress); +	void setTotal(int total); +	void setValue(int value);  	void setState(ProgressBarState state); @@ -56,7 +56,7 @@ protected:  	virtual void repaintEvent(RepaintEvent* repaintEvent) override;  private: -	ProgressBarState state; +	ProgressBarState state{ProgressBarState::Blue};  	Painter::Bar bar_bg; @@ -64,7 +64,8 @@ private:  	Painter::Bar bar_blue;  	Painter::Bar bar_red; -	float _progress; +	int total{0}; +	int value{0};  };  } // GUI:: diff --git a/plugingui/testmain.cc b/plugingui/testmain.cc index b3a0d8d..84d813d 100644 --- a/plugingui/testmain.cc +++ b/plugingui/testmain.cc @@ -33,13 +33,10 @@  #include <hugin.hpp> -// Dummy Engine class. -class Engine : public MessageHandler { -public: -	void handleMessage(Message *msg) {} -}; +#include <notifier.h> +#include <settings.h> -class TestMain : public GUI::Listener { +class TestMain : public Listener {  public:  	TestMain()  	{ @@ -67,7 +64,8 @@ public:  	bool running = true; -	GUI::PluginGUI gui; +	Settings settings; +	GUI::PluginGUI gui{settings};  };  int main() diff --git a/src/Makefile.am b/src/Makefile.am index 9dd6c29..4d167af 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,13 +23,11 @@ EXTRA_DIST = \  	instrument.h \  	instrumentparser.h \  	memchecker.h \ -	message.h \ -	messagehandler.h \ -	messagereceiver.h \  	midimapparser.h \  	midimapper.h \  	mutex.h \  	nolocale.h \ +	notifier.h \  	path.h \  	powerlist.h \  	rangemap.h \ @@ -62,8 +60,6 @@ EXTRA_DIST = \  	instrument.cc \  	instrumentparser.cc \  	memchecker.cc \ -	messagehandler.cc \ -	messagereceiver.cc \  	midimapparser.cc \  	midimapper.cc \  	mutex.cc \ diff --git a/src/Makefile.am.drumgizmo b/src/Makefile.am.drumgizmo index e707fe2..6fddded 100644 --- a/src/Makefile.am.drumgizmo +++ b/src/Makefile.am.drumgizmo @@ -20,8 +20,6 @@ DRUMGIZMO_SOURCES = \  	$(top_srcdir)/src/instrument.cc \  	$(top_srcdir)/src/instrumentparser.cc \  	$(top_srcdir)/src/memchecker.cc \ -	$(top_srcdir)/src/messagehandler.cc \ -	$(top_srcdir)/src/messagereceiver.cc \  	$(top_srcdir)/src/midimapparser.cc \  	$(top_srcdir)/src/midimapper.cc \  	$(top_srcdir)/src/mutex.cc \ diff --git a/src/atomic.h b/src/atomic.h index e0b80b1..95a5e9d 100644 --- a/src/atomic.h +++ b/src/atomic.h @@ -116,7 +116,67 @@ public:  		return data;  	} +	bool operator==(const T& other) const +	{ +		std::lock_guard<std::mutex> lock{mutex}; +		return other == data; +	} + +	bool operator!=(const T& other) const +	{ +		std::lock_guard<std::mutex> lock{mutex}; +		return !(other == data); +	} + +	bool operator==(const Atomic<T>& other) const +	{ +		std::lock_guard<std::mutex> lock{mutex}; +		return other.load() == data; +	} + +	bool operator!=(const Atomic<T>& other) const +	{ +		std::lock_guard<std::mutex> lock{mutex}; +		return !(other.load() == data); +	} +  private:  	T data;  	mutable std::mutex mutex;  }; + +//! Getter utility class. +template <typename T> class SettingRef +{ +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 cache != tmp; +	} + +	T getValue() const +	{ +		return cache; +	} + +private: +	bool firstAccess{true}; +	Atomic<T>& value; +	Atomic<T> cache; +}; diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index f769f4e..aa6be23 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -38,6 +38,7 @@  #include <hugin.hpp>  #include <config.h> +#include <memory>  #include "drumkitparser.h"  #include "audioinputenginemidi.h" @@ -47,8 +48,7 @@  DrumGizmo::DrumGizmo(Settings& settings,                       AudioOutputEngine *o, AudioInputEngine *i) -	: MessageReceiver(MSGRCV_ENGINE) -	, loader(settings) +	: loader(settings)  	, oe(o)  	, ie(i)  	, framesize(0) @@ -69,9 +69,12 @@ DrumGizmo::~DrumGizmo()  bool DrumGizmo::loadkit(std::string file)  { +	settings.drumkit_load_status.store(LoadStatus::Idle); +  	if(file == "")  	{ -		return 1; +		settings.drumkit_load_status.store(LoadStatus::Error); +		return false;  	}  	DEBUG(drumgizmo, "loadkit(%s)\n", file.c_str()); @@ -82,20 +85,24 @@ bool DrumGizmo::loadkit(std::string file)  	// Delete all Channels, Instruments, Samples and AudioFiles.  	kit.clear(); +	settings.drumkit_load_status.store(LoadStatus::Loading); +  	DrumKitParser parser(settings, kit);  	if(parser.parseFile(file))  	{  		ERR(drumgizmo, "Drumkit parser failed: %s\n", file.c_str()); +		settings.drumkit_load_status.store(LoadStatus::Error);  		return false;  	} -	// Check if there is enough free RAM to load the drumkit. -	if(!memchecker.enoughFreeMemory(kit)) -	{ -		printf("WARNING: " -		       "There doesn't seem to be enough RAM available to load the kit.\n" -		       "Trying to load it anyway...\n"); -	} +	// TODO: Re-introduce when the code has been moved to the loader thread. +	//// Check if there is enough free RAM to load the drumkit. +	//if(!memchecker.enoughFreeMemory(kit)) +	//{ +	//	printf("WARNING: " +	//	       "There doesn't seem to be enough RAM available to load the kit.\n" +	//	       "Trying to load it anyway...\n"); +	//}  	loader.loadKit(&kit); @@ -126,79 +133,6 @@ bool DrumGizmo::init()  	return true;  } -void DrumGizmo::handleMessage(Message *msg) -{ -	DEBUG(msg, "got message."); -	switch(msg->type()) { -	case Message::LoadDrumKit: -		{ -			DEBUG(msg, "got LoadDrumKitMessage message."); -			LoadDrumKitMessage *m = (LoadDrumKitMessage*)msg; -			loadkit(m->drumkitfile); -			//init(true); -		} -		break; -	case Message::LoadMidimap: -		DEBUG(msg, "got LoadMidimapMessage message."); -		if(!ie->isMidiEngine()) -		{ -			break; -		} -		{ -			AudioInputEngineMidi *aim = (AudioInputEngineMidi*)ie; -			LoadMidimapMessage *m = (LoadMidimapMessage*)msg; -			bool ret = aim->loadMidiMap(m->midimapfile, kit.instruments); - -			LoadStatusMessageMidimap *ls = new LoadStatusMessageMidimap(); -			ls->success = ret; -			msghandler.sendMessage(MSGRCV_UI, ls); -		} -		break; -	case Message::EngineSettingsMessage: -		{ -			bool mmap_loaded = false; -			std::string mmapfile; -			if(ie->isMidiEngine()) -			{ -				AudioInputEngineMidi *aim = (AudioInputEngineMidi*)ie; -				mmapfile = aim->getMidimapFile(); -				mmap_loaded = aim->isValid(); -			} - -			EngineSettingsMessage *msg = new EngineSettingsMessage(); -			msg->midimapfile = mmapfile; -			msg->midimap_loaded = mmap_loaded; -			msg->drumkitfile = kit.getFile(); -			msg->drumkit_loaded = loader.isDone(); -			msg->enable_velocity_modifier = settings.enable_velocity_modifier.load(); -			msg->velocity_modifier_falloff = settings.velocity_modifier_falloff.load(); -			msg->velocity_modifier_weight = settings.velocity_modifier_weight.load(); -			msg->enable_velocity_randomiser = settings.enable_velocity_randomiser.load(); -			msg->velocity_randomiser_weight = settings.velocity_randomiser_weight.load(); -			msghandler.sendMessage(MSGRCV_UI, msg); -		} -		break; -	case Message::ChangeSettingMessage: -		{ -			ChangeSettingMessage *ch = (ChangeSettingMessage*)msg; -			switch(ch->name) { -			case ChangeSettingMessage::enable_velocity_modifier: -				settings.enable_velocity_modifier.store(ch->value); -				break; -			case ChangeSettingMessage::velocity_modifier_weight: -				settings.velocity_modifier_weight.store(ch->value); -				break; -			case ChangeSettingMessage::velocity_modifier_falloff: -				settings.velocity_modifier_falloff.store(ch->value); -				break; -			} -		} -		break; -	default: -		break; -	} -} -  void DrumGizmo::setFrameSize(size_t framesize)  {  	// If we are resampling override the frame size. @@ -260,8 +194,31 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)  {  	setFrameSize(nsamples); -	// Handle engine messages, at most one in each iteration: -	handleMessages(1); +	// TODO: Move this to DrumKitLoader thread. +	if(getter.drumkit_file.hasChanged()) +	{ +		loadkit(getter.drumkit_file.getValue()); +	} + +	// TODO: Move this to DrumKitLoader thread. +	if(getter.midimap_file.hasChanged()) +	{ +		auto ie_midi = dynamic_cast<AudioInputEngineMidi*>(ie); +		if(ie_midi) +		{ +			settings.midimap_load_status.store(LoadStatus::Loading); +			bool ret = ie_midi->loadMidiMap(getter.midimap_file.getValue(), +			                                kit.instruments); +			if(ret) +			{ +				settings.midimap_load_status.store(LoadStatus::Done); +			} +			else +			{ +				settings.midimap_load_status.store(LoadStatus::Error); +			} +		} +	}  	ie->pre();  	oe->pre(nsamples); @@ -712,8 +669,8 @@ bool DrumGizmo::setConfigString(std::string cfg)  	ConfigParser p;  	if(p.parseString(cfg))  	{ -	 ERR(drumgizmo, "Config parse error.\n"); -	 return false; +		ERR(drumgizmo, "Config parse error.\n"); +		return false;  	}  	if(p.value("enable_velocity_modifier") != "") @@ -747,27 +704,15 @@ bool DrumGizmo::setConfigString(std::string cfg)  	}  	std::string newkit = p.value("drumkitfile"); -	if(newkit != "" && kit.getFile() != newkit) +	if(newkit != "")  	{ -		/* -		  if(!loadkit(p.values["drumkitfile"])) -		  { -		  return false; -		  } -		  init(true); -		*/ -		LoadDrumKitMessage *msg = new LoadDrumKitMessage(); -		msg->drumkitfile = newkit; -		msghandler.sendMessage(MSGRCV_ENGINE, msg); +		settings.drumkit_file.store(newkit);  	}  	std::string newmidimap = p.value("midimapfile");  	if(newmidimap != "")  	{ -		//midimapfile = newmidimap; -		LoadMidimapMessage *msg = new LoadMidimapMessage(); -		msg->midimapfile = newmidimap; -		msghandler.sendMessage(MSGRCV_ENGINE, msg); +		settings.midimap_file.store(newmidimap);  	}  	return true; diff --git a/src/drumgizmo.h b/src/drumgizmo.h index 63348da..7af5dbb 100644 --- a/src/drumgizmo.h +++ b/src/drumgizmo.h @@ -31,25 +31,15 @@  #include "audiooutputengine.h"  #include "audioinputengine.h" -  #include "events.h"  #include "audiofile.h"  #include "drumkit.h"  #include "memchecker.h" -  #include "drumkitloader.h"  #include "audiocache.h" -  #include "mutex.h" - -#include "message.h" - -#include "messagereceiver.h" -  #include "chresampler.h" -  #include "configfile.h" -  #include "settings.h"  #define MAX_NUM_CHANNELS 64 @@ -57,7 +47,6 @@  #define RESAMPLER_INPUT_BUFFER 64  class DrumGizmo -	: public MessageReceiver  {  public:  	DrumGizmo(Settings& settings, @@ -77,8 +66,6 @@ public:  	std::string configString();  	bool setConfigString(std::string cfg); -	void handleMessage(Message *msg); -  	int samplerate();  	void setSamplerate(int samplerate); @@ -112,4 +99,5 @@ protected:  	std::vector<event_t> events;  	Settings& settings; +	SettingsGetter getter{settings};  }; diff --git a/src/drumkitloader.cc b/src/drumkitloader.cc index 3cb4b68..f9e45db 100644 --- a/src/drumkitloader.cc +++ b/src/drumkitloader.cc @@ -184,18 +184,14 @@ void DrumKitLoader::thread_main()  			audiofile->load(preload_size);  		} -		loaded++; +		++loaded; -		if(loaded % fraction == 0 || loaded == total_num_audiofiles) +		settings.number_of_files.store(total_num_audiofiles); +		settings.number_of_files_loaded.store(loaded); + +		if(total_num_audiofiles == loaded)  		{ -			//LoadStatusMessage *ls = new LoadStatusMessage(); -			//ls->number_of_files = total_num_audiofiles; -			//ls->numer_of_files_loaded = loaded; -			//ls->current_file = filename; -			//msghandler.sendMessage(MSGRCV_UI, ls); -			settings.number_of_files.store(total_num_audiofiles); -			settings.number_of_files_loaded.store(loaded); -			//settings.current_file.store(filename); +			settings.drumkit_load_status.store(LoadStatus::Done);  		}  	} diff --git a/src/drumkitparser.cc b/src/drumkitparser.cc index 221e921..048a05b 100644 --- a/src/drumkitparser.cc +++ b/src/drumkitparser.cc @@ -34,7 +34,7 @@  #include "path.h"  #include "drumgizmo.h" -DrumKitParser::DrumKitParser(Settings& setting, DrumKit& k) +DrumKitParser::DrumKitParser(Settings& settings, DrumKit& k)  	: kit(k)  	, refs(REFSFILE)  	, settings(settings) diff --git a/src/instrument.cc b/src/instrument.cc index f187de0..cc052e9 100644 --- a/src/instrument.cc +++ b/src/instrument.cc @@ -42,7 +42,7 @@ Instrument::Instrument(Settings& settings)  Instrument::~Instrument()  { -	magic = NULL; +	magic = nullptr;  	DEBUG(instrument, "delete %p\n", this);  	std::vector<AudioFile*>::iterator i = audiofiles.begin(); @@ -60,8 +60,6 @@ bool Instrument::isValid() const  Sample* Instrument::sample(level_t level, size_t pos)  { -	Sample *sample = NULL; -  	// Read out all values from settings.  	auto enable_velocity_randomiser = settings.enable_velocity_randomiser.load();  	auto velocity_randomiser_weight = settings.velocity_randomiser_weight.load(); @@ -70,6 +68,8 @@ Sample* Instrument::sample(level_t level, size_t pos)  	auto enable_velocity_modifier = settings.enable_velocity_modifier.load();  	auto velocity_modifier_weight = settings.velocity_modifier_weight.load(); +	Sample *sample = nullptr; +  	if(enable_velocity_modifier == false)  	{  		mod = 1.0; @@ -78,14 +78,13 @@ Sample* Instrument::sample(level_t level, size_t pos)  	if(enable_velocity_randomiser)  	{ -		float r = rand.floatInRange(-0.5f, 0.5f); -		r *= velocity_randomiser_weight * 2; // ex. random number [-0.1;0.1] +		float r = rand.floatInRange(-1.0 * velocity_randomiser_weight, +		                            velocity_randomiser_weight);  		level += r;  		if(level > 1.0)  		{  			level = 1.0;  		} -  		if(level < 0.0)  		{  			level = 0.0; @@ -94,8 +93,7 @@ Sample* Instrument::sample(level_t level, size_t pos)  	if(enable_velocity_modifier)  	{ -		mod += (pos - lastpos) / -			(samplerate * velocity_modifier_falloff); +		mod += (pos - lastpos) / (samplerate * velocity_modifier_falloff);  		if(mod > 1.0)  		{  			mod = 1.0; @@ -113,11 +111,10 @@ Sample* Instrument::sample(level_t level, size_t pos)  		std::vector<Sample*> s = samples.get(level * mod);  		if(s.size() == 0)  		{ -			return NULL; +			return nullptr;  		} -		//size_t idx = ::rand()%(s.size()); -		sample = rand.choose<Sample*>(s); +		sample = rand.choose(s);  	}  	if(enable_velocity_modifier) diff --git a/src/message.h b/src/message.h deleted file mode 100644 index 71d0da6..0000000 --- a/src/message.h +++ /dev/null @@ -1,121 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            message.h - * - *  Wed Mar 20 15:50:57 CET 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo 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 Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#ifndef __DRUMGIZMO_MESSAGE_H__ -#define __DRUMGIZMO_MESSAGE_H__ - -#include <string> - -class MessageHandler; - -class Message { -public: -  typedef enum { -    // Engine -> GUI Messages: -    LoadStatus, // Signal GUI the current load status. -    LoadStatusMidimap, // Signal GUI the current load status of the midimap. - -    // GUI -> Engine, Engine -> Engine Messages: -    LoadDrumKit, // Signal engine to load drumkit. -    LoadMidimap, // Signal engine to load midimap. -    EngineSettingsMessage, // Request or receive engine settings. -    ChangeSettingMessage, // Update named setting in engine. -  } type_t; - -  typedef enum { -    NormalProcessing, // Just add to the queue -    FilterMultiple, // Ignore top message if it has the same type. -    // SyncWait, // Block the send call until the message has been handled by the receiver. -  } processing_mode_t; - -  virtual ~Message() {} -  virtual type_t type() = 0; -  virtual processing_mode_t processing_mode() { return NormalProcessing; } -}; - -class LoadStatusMessage : public Message { -public: -  type_t type() { return Message::LoadStatus; } -  processing_mode_t processing_mode() { return FilterMultiple; } -  unsigned int number_of_files; -  unsigned int numer_of_files_loaded; -  std::string current_file; -}; - -class LoadStatusMessageMidimap : public Message { -public: -  type_t type() { return Message::LoadStatusMidimap; } -  bool success; -}; - -class LoadDrumKitMessage : public Message { -public: -  type_t type() { return Message::LoadDrumKit; } -  std::string drumkitfile; -}; - -class LoadMidimapMessage : public Message { -public: -  type_t type() { return Message::LoadMidimap; } -  std::string midimapfile; -}; - -class EngineSettingsMessage : public Message { -public: -  type_t type() { return Message::EngineSettingsMessage; } -  std::string midimapfile; -  bool midimap_loaded; - -  std::string drumkitfile; -  bool drumkit_loaded; - -  float enable_velocity_modifier; -  float velocity_modifier_falloff; -  float velocity_modifier_weight; -  float enable_velocity_randomiser; -  float velocity_randomiser_weight; -}; - -class ChangeSettingMessage : public Message { -public: -  typedef enum { -    enable_velocity_modifier, -    velocity_modifier_weight, -    velocity_modifier_falloff, -  } setting_name_t; - -  ChangeSettingMessage(setting_name_t n, float v) { -    name = n; -    value = v; -  } - -  type_t type() { return Message::ChangeSettingMessage; } - -  setting_name_t name; -  float value; -}; - -#endif/*__DRUMGIZMO_MESSAGE_H__*/ diff --git a/src/messagehandler.cc b/src/messagehandler.cc deleted file mode 100644 index 7a0c7ea..0000000 --- a/src/messagehandler.cc +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            messagehandler.cc - * - *  Fri Jun 14 20:30:43 CEST 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo 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 Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "messagehandler.h" - -#include <hugin.hpp> - -#include "messagereceiver.h" - -// Global messagehandler: -MessageHandler msghandler; - -MessageHandler::MessageHandler() -{ -} - -void MessageHandler::addReceiver(message_receiver_id_t id, -                                 MessageReceiver *receiver) -{ -  MutexAutolock l(mutex); - -  receivers[id] = receiver; -} - -void MessageHandler::removeReceiver(MessageReceiver *receiver) -{ -  MutexAutolock l(mutex); - -  std::map<message_receiver_id_t, MessageReceiver *>::iterator i = -    receivers.begin(); -  while(i != receivers.end()) { -    if(i->second == receiver) { -      receivers.erase(i); -      break; -    } -    i++; -  } -} - -bool MessageHandler::sendMessage(message_receiver_id_t id, Message* msg) -{ -  MutexAutolock l(mutex); - -  if(receivers.find(id) == receivers.end()) { -    //WARN(msghandler, "Could not find id %d\n", id); -    delete msg; -    return false; -  } - -  //DEBUG(msghandler, "Sending message to id %d\n", id); - -  MessageReceiver *receiver = receivers[id]; -  /* // This code causes sporadic segfaults on windows. -  if(msg->processing_mode() == Message::FilterMultiple) { -    Message *pmsg; -    MutexAutolock lock(receiver->message_mutex); // Make peek/receive atomic. -    while( (pmsg = receiver->peekMessage()) != NULL) { -      if(pmsg->type() != msg->type()) break; -      // Remove all old messages with same type. -      delete receiver->receiveMessage(); -    } -  } -  */ -  receiver->sendMessage(msg); -  return true; -} diff --git a/src/messagehandler.h b/src/messagehandler.h deleted file mode 100644 index 2b6c40e..0000000 --- a/src/messagehandler.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            messagehandler.h - * - *  Fri Jun 14 20:30:43 CEST 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo 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 Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#ifndef __DRUMGIZMO_MESSAGEHANDLER_H__ -#define __DRUMGIZMO_MESSAGEHANDLER_H__ - -#include <map> - -#include "message.h" -#include "mutex.h" - -typedef enum { -  MSGRCV_ENGINE = 1, -  MSGRCV_UI = 2, -  MSGRCV_LOADER = 3, -} message_receiver_id_t; - -class MessageReceiver; - -class MessageHandler { -public: -  MessageHandler(); - -  void addReceiver(message_receiver_id_t id, MessageReceiver *receiver); -  void removeReceiver(MessageReceiver *receiver); - -  /** -   * Send Message to receiver with specified id. -   * @return Return true if id is registered. Return false if id is not -   * currently registered. -   */ -  bool sendMessage(message_receiver_id_t id, Message* msg); - -private: -  std::map<message_receiver_id_t, MessageReceiver *> receivers; - -  Mutex mutex; -}; - -// Global MessageHandler; -extern MessageHandler msghandler; - -#endif/*__DRUMGIZMO_MESSAGEHANDLER_H__*/ diff --git a/src/messagereceiver.cc b/src/messagereceiver.cc deleted file mode 100644 index 590c98a..0000000 --- a/src/messagereceiver.cc +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            messagereceiver.cc - * - *  Sun Jun 16 12:09:06 CEST 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo 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 Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#include "messagereceiver.h" - -#include <hugin.hpp> - -MessageReceiver::MessageReceiver(message_receiver_id_t id) -{ -  msghandler.addReceiver(id, this); -} - -MessageReceiver::~MessageReceiver() -{ -  msghandler.removeReceiver(this); -} - -void MessageReceiver::sendMessage(Message *msg) -{ -  MutexAutolock l(message_mutex); - -  message_queue.push_back(msg); -} - -Message *MessageReceiver::receiveMessage() -{ -  Message *msg = NULL; -  if(message_queue.size()) { -    msg = message_queue.front(); -    message_queue.pop_front(); -  } -  return msg; -} - -Message *MessageReceiver::peekMessage() -{ -  Message *msg = NULL; -  if(message_queue.size()) { -    msg = message_queue.front(); -  } -  return msg; -} - -void MessageReceiver::handleMessages(size_t max) -{ -  MutexAutolock l(message_mutex); -  bool process_all = false; -  if(max == 0) process_all = true; - -  while((process_all || max--) && peekMessage()) { -    Message *msg = receiveMessage(); -    handleMessage(msg); -    delete msg; -  } -} diff --git a/src/messagereceiver.h b/src/messagereceiver.h deleted file mode 100644 index c1a8e60..0000000 --- a/src/messagereceiver.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            messagereceiver.h - * - *  Sun Jun 16 12:09:06 CEST 2013 - *  Copyright 2013 Bent Bisballe Nyeng - *  deva@aasimon.org - ****************************************************************************/ - -/* - *  This file is part of DrumGizmo. - * - *  DrumGizmo is free software; you can redistribute it and/or modify - *  it under the terms of the GNU Lesser General Public License as published by - *  the Free Software Foundation; either version 3 of the License, or - *  (at your option) any later version. - * - *  DrumGizmo 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 Lesser General Public License for more details. - * - *  You should have received a copy of the GNU Lesser General Public License - *  along with DrumGizmo; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. - */ -#ifndef __DRUMGIZMO_MESSAGERECEIVER_H__ -#define __DRUMGIZMO_MESSAGERECEIVER_H__ - -#include <list> - -#include "mutex.h" -#include "message.h" -#include "messagehandler.h" - -class MessageReceiver { -  friend class MessageHandler; -public: -  MessageReceiver(message_receiver_id_t id); -  ~MessageReceiver(); - -  /** -   * Receive message from the message queue. -   */ -  Message *receiveMessage(); - -  /** -   * Receive message from the message queue without removing it. -   */ -  Message *peekMessage(); - -  /** -   * Add a message to the message queue. -   */ -  void sendMessage(Message *msg); - -  /** -   * Handle messages from the event queue. -   * @param max_number_of_events the maximum number of events to be handled in -   * this call. 0 means all. -   */ -  void handleMessages(size_t max_number_of_events = 0); - -  /** -   * Handler to be implemented in child classes. -   * Handles a single event. -   */ -  virtual void handleMessage(Message *msg) = 0; - -private: -  Mutex message_mutex; -  std::list<Message *> message_queue; -}; - -#endif/*__DRUMGIZMO_MESSAGERECEIVER_H__*/ diff --git a/plugingui/notifier.h b/src/notifier.h index 9e9f6eb..ff59741 100644 --- a/plugingui/notifier.h +++ b/src/notifier.h @@ -72,7 +72,7 @@ namespace aux  }; -namespace GUI { +//namespace GUI {  class Listener;  class NotifierBase { @@ -158,6 +158,6 @@ private:  }; -} // GUI:: +//} // GUI::  #define CONNECT(SRC, SIG, TAR, SLO) (SRC)->SIG.connect(TAR, SLO) 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 {  | 
