diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile.am.drumgizmo | 1 | ||||
| -rw-r--r-- | src/drumgizmo.cc | 128 | ||||
| -rw-r--r-- | src/drumgizmo.h | 3 | ||||
| -rw-r--r-- | src/inputprocessor.cc | 165 | ||||
| -rw-r--r-- | src/inputprocessor.h | 44 | 
5 files changed, 219 insertions, 122 deletions
| diff --git a/src/Makefile.am.drumgizmo b/src/Makefile.am.drumgizmo index 6fddded..818c1ce 100644 --- a/src/Makefile.am.drumgizmo +++ b/src/Makefile.am.drumgizmo @@ -17,6 +17,7 @@ DRUMGIZMO_SOURCES = \  	$(top_srcdir)/src/drumkitloader.cc \  	$(top_srcdir)/src/drumkitparser.cc \  	$(top_srcdir)/src/events.cc \ +	$(top_srcdir)/src/inputprocessor.cc \  	$(top_srcdir)/src/instrument.cc \  	$(top_srcdir)/src/instrumentparser.cc \  	$(top_srcdir)/src/memchecker.cc \ diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index 85f251b..63eda7b 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -51,14 +51,14 @@ DrumGizmo::DrumGizmo(Settings& settings,  	: loader(settings)  	, oe(o)  	, ie(i) +	, kit() +	, input_processor(kit)  	, framesize(0)  	, freewheel(false)  	, events{}  	, settings(settings)  { -	is_stopping = false;  	audioCache.init(10000); // start thread -  	events.reserve(1000);  } @@ -227,129 +227,15 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples)  	// Read new events  	// -	//DEBUG(engine, "Number of active events: %d\n", activeevents[0].size()); -  	ie->run(pos, nsamples, events); -	for(const auto& event: events) -	{ -		if(event.type == TYPE_ONSET) -		{ -			Instrument *i = nullptr; -			int d = event.instrument; -			/* -			  Instruments::iterator it = kit.instruments.begin(); -			  while(d-- && it != kit.instruments.end()) -			  { -			  i = &(it->second); -			  ++it; -			  } -			*/ - -			if(!kit.isValid()) -			{ -				continue; -			} - -			if(d < (int)kit.instruments.size()) -			{ -				i = kit.instruments[d]; -			} - -			if(i == nullptr || !i->isValid()) -			{ -				ERR(drumgizmo, "Missing Instrument %d.\n", (int)event.instrument); -				continue; -			} - -			if(i->getGroup() != "") -			{ -				// Add event to ramp down all existing events with the same groupname. -				Channels::iterator j = kit.channels.begin(); -				while(j != kit.channels.end()) -				{ -					Channel &ch = *j; -					std::list< Event* >::iterator evs = activeevents[ch.num].begin(); -					while(evs != activeevents[ch.num].end()) -					{ -						Event *ev = *evs; -						if(ev->getType() == Event::sample) -						{ -							EventSample *sev = (EventSample*)ev; -							if(sev->group == i->getGroup() && sev->instrument != i) -							{ -								sev->rampdown = 3000; // Ramp down 3000 samples -								// TODO: This must be configurable at some point... -								// ... perhaps even by instrument (ie. in the xml file) -								sev->ramp_start = sev->rampdown; -							} -						} -						++evs; -					} -					++j; -				} -			} - -			Sample *s = i->sample(event.velocity, event.offset + pos); - -			if(s == nullptr) -			{ -				ERR(drumgizmo, "Missing Sample.\n"); -				continue; -			} - -			Channels::iterator j = kit.channels.begin(); -			while(j != kit.channels.end()) -			{ -				Channel &ch = *j; -				AudioFile *af = s->getAudioFile(&ch); -				if(af) -				{ -					// LAZYLOAD: -					// DEBUG(drumgizmo,"Requesting preparing of audio file\n"); -					// loader.prepare(af); -				} -				if(af == nullptr || !af->isValid()) -				{ -					//DEBUG(drumgizmo,"Missing AudioFile.\n"); -				} -				else -				{ -					//DEBUG(drumgizmo, "Adding event %d.\n", event.offset); -					Event *evt = new EventSample(ch.num, 1.0, af, i->getGroup(), i); -					evt->offset = (event.offset + pos) * resampler[0].getRatio(); -					activeevents[ch.num].push_back(evt); -				} -				++j; -			} -		} - -		if(event.type == TYPE_STOP) -		{ -			is_stopping = true; -		} - -		if(is_stopping) -		{ -			// Count the number of active events. -			int num_active_events = 0; -			Channels::iterator j = kit.channels.begin(); -			while(j != kit.channels.end()) -			{ -				Channel &ch = *j; -				num_active_events += activeevents[ch.num].size(); -				++j; -			} - -			if(num_active_events == 0) -			{ -				// No more active events - now we can stop the engine. -				return false; -			} -		} +	double resample_ratio = resampler[0].getRatio(); +	bool active_events_left = input_processor.process(events, activeevents, pos, resample_ratio); +	if(!active_events_left) +	{ +		return false;  	} -  	events.clear();  	// diff --git a/src/drumgizmo.h b/src/drumgizmo.h index 13c657d..3e734b5 100644 --- a/src/drumgizmo.h +++ b/src/drumgizmo.h @@ -41,6 +41,7 @@  #include "chresampler.h"  #include "configfile.h"  #include "settings.h" +#include "inputprocessor.h"  #define REFSFILE "refs.conf" @@ -80,7 +81,6 @@ protected:  	DrumKitLoader loader;  	Mutex mutex; -	bool is_stopping; ///< Is set to true when a TYPE_STOP event has been seen.  	AudioOutputEngine *oe;  	AudioInputEngine *ie; @@ -96,6 +96,7 @@ protected:  	AudioCache audioCache;  	DrumKit kit;  	MemChecker memchecker; +	InputProcessor input_processor;  	size_t framesize;  	bool freewheel; diff --git a/src/inputprocessor.cc b/src/inputprocessor.cc new file mode 100644 index 0000000..789334b --- /dev/null +++ b/src/inputprocessor.cc @@ -0,0 +1,165 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            inputprocessor.cc + * + *  Sat Apr 23 20:39:30 CEST 2016 + *  Copyright 2016 André Nusser + *  andre.nusser@googlemail.com + ****************************************************************************/ + +/* + *  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 "inputprocessor.h" + +#include <list> + +#include "hugin.hpp" + +#include "instrument.h" + +InputProcessor::InputProcessor(DrumKit& kit) +	: kit(kit) +	, is_stopping(false) +{ + +} + +bool InputProcessor::process(const std::vector<event_t>& events, std::list<Event*>* activeevents, size_t pos, double resample_ratio) +{ +	for(const auto& event: events) +	{ +		if(event.type == TYPE_ONSET) +		{ +			Instrument *i = nullptr; +			int d = event.instrument; +			/* +			  Instruments::iterator it = kit.instruments.begin(); +			  while(d-- && it != kit.instruments.end()) +			  { +			  i = &(it->second); +			  ++it; +			  } +			*/ + +			// TODO can this be removed? +			if(!kit.isValid()) +			{ +				continue; +			} + +			if(d < (int)kit.instruments.size()) +			{ +				i = kit.instruments[d]; +			} + +			if(i == nullptr || !i->isValid()) +			{ +				ERR(inputprocessor, "Missing Instrument %d.\n", (int)event.instrument); +				continue; +			} + +			if(i->getGroup() != "") +			{ +				// Add event to ramp down all existing events with the same groupname. +				Channels::iterator j = kit.channels.begin(); +				while(j != kit.channels.end()) +				{ +					Channel &ch = *j; +					std::list< Event* >::iterator evs = activeevents[ch.num].begin(); +					while(evs != activeevents[ch.num].end()) +					{ +						Event *ev = *evs; +						if(ev->getType() == Event::sample) +						{ +							EventSample *sev = (EventSample*)ev; +							if(sev->group == i->getGroup() && sev->instrument != i) +							{ +								sev->rampdown = 3000; // Ramp down 3000 samples +								// TODO: This must be configurable at some point... +								// ... perhaps even by instrument (ie. in the xml file) +								sev->ramp_start = sev->rampdown; +							} +						} +						++evs; +					} +					++j; +				} +			} + +			Sample *s = i->sample(event.velocity, event.offset + pos); + +			if(s == nullptr) +			{ +				ERR(drumgizmo, "Missing Sample.\n"); +				continue; +			} + +			Channels::iterator j = kit.channels.begin(); +			while(j != kit.channels.end()) +			{ +				Channel &ch = *j; +				AudioFile *af = s->getAudioFile(&ch); +				if(af) +				{ +					// LAZYLOAD: +					// DEBUG(drumgizmo,"Requesting preparing of audio file\n"); +					// loader.prepare(af); +				} +				if(af == nullptr || !af->isValid()) +				{ +					//DEBUG(drumgizmo,"Missing AudioFile.\n"); +				} +				else +				{ +					//DEBUG(drumgizmo, "Adding event %d.\n", event.offset); +					Event *evt = new EventSample(ch.num, 1.0, af, i->getGroup(), i); +					evt->offset = (event.offset + pos) * resample_ratio; +					activeevents[ch.num].push_back(evt); +				} +				++j; +			} +		} + +		if(event.type == TYPE_STOP) +		{ +			is_stopping = true; +		} + +		if(is_stopping) +		{ +			// Count the number of active events. +			int num_active_events = 0; +			Channels::iterator j = kit.channels.begin(); +			while(j != kit.channels.end()) +			{ +				Channel &ch = *j; +				num_active_events += activeevents[ch.num].size(); +				++j; +			} + +			if(num_active_events == 0) +			{ +				// No more active events - now we can stop the engine. +				return false; +			} +		} + +	} + +	return true; +} diff --git a/src/inputprocessor.h b/src/inputprocessor.h new file mode 100644 index 0000000..24685be --- /dev/null +++ b/src/inputprocessor.h @@ -0,0 +1,44 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            inputprocessor.h + * + *  Sat Apr 23 20:39:30 CEST 2016 + *  Copyright 2016 André Nusser + *  andre.nusser@googlemail.com + ****************************************************************************/ + +/* + *  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> +#include <list> + +#include "drumkit.h" +#include "events.h" +#include <event.h> + +class InputProcessor +{ +public: +	InputProcessor(DrumKit& kit); +	bool process(const std::vector<event_t>& events, std::list<Event*>* activeevents, size_t pos, double resample_ratio); +private: +	DrumKit& kit; +	bool is_stopping; ///< Is set to true when a TYPE_STOP event has been seen. +}; | 
