From 28096a402947b05c7e923e075f926263a3279a42 Mon Sep 17 00:00:00 2001
From: Bent Bisballe Nyeng <deva@aasimon.org>
Date: Thu, 22 Apr 2021 18:18:53 +0200
Subject: Fix crash when doing async-load in cli.

---
 drumgizmo/drumgizmoc.cc          | 29 +++++++++++++++++++++++++++++
 plugin/drumgizmo_plugin.cc       |  1 +
 plugingui/drumkitframecontent.cc |  2 ++
 plugingui/statusframecontent.cc  |  2 ++
 src/drumkitloader.cc             |  5 ++++-
 src/settings.h                   |  1 +
 6 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/drumgizmo/drumgizmoc.cc b/drumgizmo/drumgizmoc.cc
index c6b43f0..cec96f7 100644
--- a/drumgizmo/drumgizmoc.cc
+++ b/drumgizmo/drumgizmoc.cc
@@ -326,6 +326,7 @@ int main(int argc, char* argv[])
 		        }
 		        oe = factory.createOutput(engine);
 		        if(ie == NULL)
+		        if(oe == NULL)
 		        {
 			        std::cerr << "Invalid output engine: " << engine << std::endl;
 			        return 1;
@@ -700,6 +701,34 @@ int main(int argc, char* argv[])
 		}
 		std::cout << "\ndone" << std::endl;
 	}
+	else
+	{
+		// Async loading in progress
+
+		// Wait until the loader has passed the kit parsing step before proceeding.
+		bool parsing_done{false};
+		while(!parsing_done)
+		{
+			std::this_thread::sleep_for(std::chrono::milliseconds(10));
+
+			switch(settings.drumkit_load_status.load())
+			{
+			case LoadStatus::Idle:
+			case LoadStatus::Parsing:
+				// Not yet past the parsing step
+				break;
+			case LoadStatus::Loading:
+			case LoadStatus::Done:
+				// Past parsing step
+				parsing_done = true;
+				break;
+			case LoadStatus::Error:
+				// Kit parser error?
+				std::cout << "\nFailed to load " << kitfile << std::endl;
+				return 1;
+			}
+		}
+	}
 
 	gizmo.setSamplerate(oe->getSamplerate());
 	oe->onLatencyChange(gizmo.getLatency());
diff --git a/plugin/drumgizmo_plugin.cc b/plugin/drumgizmo_plugin.cc
index 671fab6..82c0ee9 100644
--- a/plugin/drumgizmo_plugin.cc
+++ b/plugin/drumgizmo_plugin.cc
@@ -281,6 +281,7 @@ void DrumGizmoPlugin::onInlineRedraw(std::size_t width,
 				bar_green.setSize(val, bar_height);
 				painter.drawImage(brd, height - bar_height, bar_green);
 				break;
+			case LoadStatus::Parsing:
 			case LoadStatus::Loading:
 			case LoadStatus::Idle:
 				bar_blue.setSize(val, bar_height);
diff --git a/plugingui/drumkitframecontent.cc b/plugingui/drumkitframecontent.cc
index 9549d75..2ae298b 100644
--- a/plugingui/drumkitframecontent.cc
+++ b/plugingui/drumkitframecontent.cc
@@ -233,6 +233,7 @@ void DrumkitframeContent::setDrumKitLoadStatus(LoadStatus load_status)
 	switch(load_status)
 	{
 	case LoadStatus::Idle:
+	case LoadStatus::Parsing:
 	case LoadStatus::Loading:
 		state = dggui::ProgressBarState::Blue;
 		break;
@@ -255,6 +256,7 @@ void DrumkitframeContent::setMidiMapLoadStatus(LoadStatus load_status)
 	case LoadStatus::Idle:
 		midimap_file_progress.setValue(0);
 		break;
+	case LoadStatus::Parsing:
 	case LoadStatus::Loading:
 		midimap_file_progress.setValue(1);
 		state = dggui::ProgressBarState::Blue;
diff --git a/plugingui/statusframecontent.cc b/plugingui/statusframecontent.cc
index 0fe8bf2..7990d3e 100644
--- a/plugingui/statusframecontent.cc
+++ b/plugingui/statusframecontent.cc
@@ -88,6 +88,7 @@ void StatusframeContent::updateDrumkitLoadStatus(LoadStatus load_status)
 	case LoadStatus::Idle:
 		drumkit_load_status = _("No Kit Loaded");
 		break;
+	case LoadStatus::Parsing:
 	case LoadStatus::Loading:
 		drumkit_load_status = _("Loading...");
 		break;
@@ -130,6 +131,7 @@ void StatusframeContent::updateMidimapLoadStatus(LoadStatus load_status)
 	case LoadStatus::Idle:
 		midimap_load_status = _("No Midimap Loaded");
 		break;
+	case LoadStatus::Parsing:
 	case LoadStatus::Loading:
 		midimap_load_status = _("Loading...");
 		break;
diff --git a/src/drumkitloader.cc b/src/drumkitloader.cc
index 6a4c9f4..9167201 100644
--- a/src/drumkitloader.cc
+++ b/src/drumkitloader.cc
@@ -138,7 +138,7 @@ bool DrumKitLoader::loadkit(const std::string& file)
 	settings.drumkit_samplerate.store(44100);
 	settings.load_status_text.store("");
 
-	settings.drumkit_load_status.store(LoadStatus::Loading);
+	settings.drumkit_load_status.store(LoadStatus::Parsing);
 
 	// Parse drumkit and instrument xml
 
@@ -226,6 +226,9 @@ bool DrumKitLoader::loadkit(const std::string& file)
 		settings.midimap_file = drumkit_path + "/" + drumkitdom.metadata.default_midimap_file;
 	}
 
+	// Done parsing. Now start loading the audio
+	settings.midimap_load_status.store(LoadStatus::Loading);
+
 	loadKitAudio(kit);
 
 	DEBUG(loadkit, "loadkit: Success\n");
diff --git a/src/settings.h b/src/settings.h
index 7507827..fb93d79 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -38,6 +38,7 @@
 enum class LoadStatus : unsigned int
 {
 	Idle,
+	Parsing,
 	Loading,
 	Done,
 	Error
-- 
cgit v1.2.3