diff options
| -rw-r--r-- | src/inputprocessor.cc | 195 | ||||
| -rw-r--r-- | src/inputprocessor.h | 3 | 
2 files changed, 106 insertions, 92 deletions
| diff --git a/src/inputprocessor.cc b/src/inputprocessor.cc index a232e35..3f8cf65 100644 --- a/src/inputprocessor.cc +++ b/src/inputprocessor.cc @@ -46,120 +46,131 @@ bool InputProcessor::process(const std::vector<event_t>& events, size_t pos, dou  	{  		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()) +			if(!process_onset(event, pos, resample_ratio))  			{  				continue;  			} +		} -			if(d < (int)kit.instruments.size()) -			{ -				i = kit.instruments[d]; -			} +		if(!process_stop(event)) +		{ +			return false; +		} +	} -			if(i == nullptr || !i->isValid()) -			{ -				ERR(inputprocessor, "Missing Instrument %d.\n", (int)event.instrument); -				continue; -			} +	return true; +} + +bool InputProcessor::process_onset(const event_t& event, size_t pos, double resample_ratio) +{ +	Instrument* i = nullptr; +	int d = event.instrument; + +	// TODO can this be removed? +	if(!kit.isValid()) +	{ +		return false; +	} + +	if(d < (int)kit.instruments.size()) +	{ +		i = kit.instruments[d]; +	} -			if(i->getGroup() != "") +	if(i == nullptr || !i->isValid()) +	{ +		ERR(inputprocessor, "Missing Instrument %d.\n", (int)event.instrument); +		return false; +	} + +	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())  			{ -				// Add event to ramp down all existing events with the same groupname. -				Channels::iterator j = kit.channels.begin(); -				while(j != kit.channels.end()) +				Event *ev = *evs; +				if(ev->getType() == Event::sample)  				{ -					Channel &ch = *j; -					std::list< Event* >::iterator evs = activeevents[ch.num].begin(); -					while(evs != activeevents[ch.num].end()) +					EventSample *sev = (EventSample*)ev; +					if(sev->group == i->getGroup() && sev->instrument != i)  					{ -						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; +						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;  					} -					++j;  				} +				++evs;  			} +			++j; +		} +	} -			Sample *s = i->sample(event.velocity, event.offset + pos); +	Sample *s = i->sample(event.velocity, event.offset + pos); -			if(s == nullptr) -			{ -				ERR(drumgizmo, "Missing Sample.\n"); -				continue; -			} +	if(s == nullptr) +	{ +		ERR(inputprocessor, "Missing Sample.\n"); +		return false; +	} -			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; -			} +	Channels::iterator j = kit.channels.begin(); +	while(j != kit.channels.end()) +	{ +		Channel &ch = *j; +		AudioFile *af = s->getAudioFile(&ch); +		if(af) +		{ +			// LAZYLOAD: +			// DEBUG(inputprocessor, "Requesting preparing of audio file\n"); +			// loader.prepare(af);  		} - -		if(event.type == TYPE_STOP) +		if(af == nullptr || !af->isValid())  		{ -			is_stopping = true; +			//DEBUG(inputprocessor, "Missing AudioFile.\n");  		} - -		if(is_stopping) +		else  		{ -			// 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; -			} +			//DEBUG(inputprocessor, "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(num_active_events == 0) -			{ -				// No more active events - now we can stop the engine. -				return false; -			} +	return true; +} + +bool InputProcessor::process_stop(const event_t& event) +{ +	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 index fb12555..7e03737 100644 --- a/src/inputprocessor.h +++ b/src/inputprocessor.h @@ -42,4 +42,7 @@ private:  	DrumKit& kit;  	std::list<Event*>* activeevents;  	bool is_stopping; ///< Is set to true when a TYPE_STOP event has been seen. + +	bool process_onset(const event_t& event, size_t pos, double resample_ratio); +	bool process_stop(const event_t& event);  }; | 
