From b360c7cf59cc87f79972fcdd82164834f97833b0 Mon Sep 17 00:00:00 2001
From: Bent Bisballe Nyeng <deva@aasimon.org>
Date: Sun, 10 Jun 2018 18:20:55 +0200
Subject: Add new DOMLoader class and unit-test.

---
 src/Makefile.am      |  2 ++
 src/audiofile.h      |  1 +
 src/domloader.cc     | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/domloader.h      | 49 +++++++++++++++++++++++++++++++++++++
 src/drumkit.h        |  6 +++--
 src/drumkitloader.cc | 24 +++++++------------
 src/drumkitloader.h  |  4 ++++
 src/instrument.h     |  3 +++
 src/sample.h         |  2 ++
 9 files changed, 142 insertions(+), 17 deletions(-)
 create mode 100644 src/domloader.cc
 create mode 100644 src/domloader.h

(limited to 'src')

diff --git a/src/Makefile.am b/src/Makefile.am
index 9a07c83..960f17c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -25,6 +25,7 @@ nodist_libdg_la_SOURCES = \
 	channelmixer.cc \
 	configfile.cc \
 	configparser.cc \
+	domloader.cc \
 	dgxmlparser.cc \
 	drumgizmo.cc \
 	drumkit.cc \
@@ -66,6 +67,7 @@ EXTRA_DIST = \
 	configfile.h \
 	configparser.h \
 	cpp11fix.h \
+	domloader.h \
 	dgxmlparser.h \
 	drumgizmo.h \
 	drumkit.h \
diff --git a/src/audiofile.h b/src/audiofile.h
index 3bc1ac0..5a5cc3a 100644
--- a/src/audiofile.h
+++ b/src/audiofile.h
@@ -68,6 +68,7 @@ public:
 	std::size_t filechannel;
 
 private:
+	friend class DOMLoaderTest;
 	friend class InstrumentParserTest;
 
 	void* magic{nullptr};
diff --git a/src/domloader.cc b/src/domloader.cc
new file mode 100644
index 0000000..aa7d1e2
--- /dev/null
+++ b/src/domloader.cc
@@ -0,0 +1,68 @@
+/* -*- Mode: c++ -*- */
+/***************************************************************************
+ *            domloader.cc
+ *
+ *  Sun Jun 10 17:39:01 CEST 2018
+ *  Copyright 2018 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 "domloader.h"
+
+#include "DGDOM.h"
+#include "drumkit.h"
+
+#include "cpp11fix.h"
+
+DOMLoader::DOMLoader(Settings& settings, Random& random)
+	: settings(settings)
+	, random(random)
+{
+}
+
+bool DOMLoader::loadDom(const DrumkitDOM& dom,
+                        const std::vector<InstrumentDOM>& instrumentdoms,
+                        DrumKit& drumkit)
+{
+	drumkit._name = dom.name;
+	drumkit._description = dom.description;
+	drumkit._samplerate = dom.samplerate;
+
+	for(const auto& channel: dom.channels)
+	{
+		drumkit.channels.emplace_back();
+		drumkit.channels.back().name = channel.name;
+		drumkit.channels.back().num = drumkit.channels.size() - 1;
+	}
+
+	for(const auto& instrumentref : dom.instruments)
+	{
+		auto ptr = std::make_unique<Instrument>(settings, random);
+		ptr->setGroup(instrumentref.group);
+
+		//InstrumentParser parser(*ptr, settings);
+		//parser.parseFile(path + "/" + instr_file);
+
+		// Transfer ownership to the DrumKit object.
+		drumkit.instruments.emplace_back(std::move(ptr));
+	}
+
+	return true;
+}
diff --git a/src/domloader.h b/src/domloader.h
new file mode 100644
index 0000000..29288c5
--- /dev/null
+++ b/src/domloader.h
@@ -0,0 +1,49 @@
+/* -*- Mode: c++ -*- */
+/***************************************************************************
+ *            domloader.h
+ *
+ *  Sun Jun 10 17:39:01 CEST 2018
+ *  Copyright 2018 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.
+ */
+#pragma once
+
+#include <vector>
+
+class DrumkitDOM;
+class InstrumentDOM;
+class DrumKit;
+class Settings;
+class Random;
+
+class DOMLoader
+{
+public:
+	DOMLoader(Settings& settings, Random& random);
+
+	bool loadDom(const DrumkitDOM& dom,
+	             const std::vector<InstrumentDOM>& instrumentdoms,
+	             DrumKit& drumkit);
+
+private:
+	Settings& settings;
+	Random& random;
+};
diff --git a/src/drumkit.h b/src/drumkit.h
index 1786584..4cee6be 100644
--- a/src/drumkit.h
+++ b/src/drumkit.h
@@ -35,8 +35,6 @@
 
 class DrumKit
 {
-	friend class DrumKitParser;
-	friend class DrumKitLoader;
 public:
 	DrumKit();
 	~DrumKit();
@@ -60,6 +58,10 @@ public:
 	std::size_t getNumberOfFiles() const;
 
 private:
+	friend class DOMLoader;
+	friend class DOMLoaderTest;
+	friend class DrumKitParser;
+	friend class DrumKitLoader;
 	friend class DrumkitParserTest;
 
 	void* magic{nullptr};
diff --git a/src/drumkitloader.cc b/src/drumkitloader.cc
index 02b2c13..0cef31b 100644
--- a/src/drumkitloader.cc
+++ b/src/drumkitloader.cc
@@ -35,6 +35,7 @@
 #include "DGDOM.h"
 #include "dgxmlparser.h"
 #include "path.h"
+#include "domloader.h"
 
 #define REFSFILE "refs.conf"
 
@@ -134,12 +135,17 @@ bool DrumKitLoader::loadkit(const std::string& file)
 	std::string path = getPath(edited_filename);
 	bool parseerror = parseDrumkitFile(edited_filename, drumkitdom);
 
-	for(InstrumentRefDOM ref: drumkitdom.instruments) {
+	for(const auto& ref : drumkitdom.instruments)
+	{
 		instrumentdoms.emplace_back();
-		parseerror |= parseInstrumentFile(path + "/" + ref.file, instrumentdoms.back());
+		parseerror &= parseInstrumentFile(path + "/" + ref.file, instrumentdoms.back());
 	}
 
-	if(parseerror) {
+	DOMLoader domloader(settings, rand);
+	parseerror &= domloader.loadDom(drumkitdom, instrumentdoms, kit);
+
+	if(parseerror)
+	{
 		ERR(drumgizmo, "Drumkit parser failed: %s\n", file.c_str());
 		settings.drumkit_load_status.store(LoadStatus::Error);
 
@@ -150,18 +156,6 @@ bool DrumKitLoader::loadkit(const std::string& file)
 		return false;
 	}
 
-	//TODO: create
-
-	kit._name = drumkitdom.name;
-	kit._description = drumkitdom.description;
-	kit._samplerate = drumkitdom.samplerate;
-
-	for(auto& channel: drumkitdom.channels) {
-		kit.channels.emplace_back();
-		kit.channels.back().name = channel.name;
-		kit.channels.back().num = kit.channels.size() -1;
-	}
-
 	// Check if there is enough free RAM to load the drumkit.
 	//if(!memchecker.enoughFreeMemory(kit))
 	//{
diff --git a/src/drumkitloader.h b/src/drumkitloader.h
index d14a321..9bd2af9 100644
--- a/src/drumkitloader.h
+++ b/src/drumkitloader.h
@@ -29,6 +29,7 @@
 #include <string>
 #include <list>
 #include <mutex>
+#include <vector>
 
 #include "thread.h"
 #include "semaphore.h"
@@ -38,6 +39,9 @@
 #include "audioinputengine.h"
 #include "audiocache.h"
 
+class DrumkitDOM;
+class InstrumentDOM;
+
 //! This class is responsible for loading the drumkits in its own thread.
 //! All interaction calls are simply modifying queues and not doing any
 //! work in-sync with the caller.
diff --git a/src/instrument.h b/src/instrument.h
index b62e155..20bcae4 100644
--- a/src/instrument.h
+++ b/src/instrument.h
@@ -67,6 +67,9 @@ public:
 	float getMinPower() const;
 
 private:
+	friend class DOMLoader;
+	friend class DOMLoaderTest;
+
 	// For parser:
 	friend class InstrumentParser;
 	friend class DrumKitParser;
diff --git a/src/sample.h b/src/sample.h
index daac6aa..5e41e9e 100644
--- a/src/sample.h
+++ b/src/sample.h
@@ -45,6 +45,8 @@ public:
 	float getPower() const;
 
 private:
+	friend class DOMLoader;
+	friend class DOMLoaderTest;
 	friend class InstrumentParser;
 	friend class PowerList;
 	friend class InstrumentParserTest;
-- 
cgit v1.2.3