From b360c7cf59cc87f79972fcdd82164834f97833b0 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng 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& 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(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 + +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& 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 #include #include +#include #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