diff options
| author | Bent Bisballe Nyeng <deva@aasimon.org> | 2018-06-10 18:20:55 +0200 | 
|---|---|---|
| committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2018-08-12 11:11:42 +0200 | 
| commit | b360c7cf59cc87f79972fcdd82164834f97833b0 (patch) | |
| tree | b1aaf60c111ab07c98566053ed27c345a04f99e0 /src | |
| parent | fd696ac4f08dbd269aca0772e7e311775d84bb0c (diff) | |
Add new DOMLoader class and unit-test.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile.am | 2 | ||||
| -rw-r--r-- | src/audiofile.h | 1 | ||||
| -rw-r--r-- | src/domloader.cc | 68 | ||||
| -rw-r--r-- | src/domloader.h | 49 | ||||
| -rw-r--r-- | src/drumkit.h | 6 | ||||
| -rw-r--r-- | src/drumkitloader.cc | 24 | ||||
| -rw-r--r-- | src/drumkitloader.h | 4 | ||||
| -rw-r--r-- | src/instrument.h | 3 | ||||
| -rw-r--r-- | src/sample.h | 2 | 
9 files changed, 142 insertions, 17 deletions
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;  | 
