All pastes #467397 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-05-02 14:24 UTC
rendered paste body
void VstPlugin::processReplacing(float** inputs, float** outputs, VstInt32 sampleFrames)
{
	float* output = outputs[0];
	int i = sampleFrames;
	unsigned int timeToProcess;
	unsigned int timeStamp = this->timeStamp;

	bufferInit(output, 0.0f, sampleFrames);
	
	Event* e = this->eventQueue;
	while(i) {
		if((this->eventQueue == NULL) || (e->time >= (this->timeStamp + i))) {
			goto processRemainder;
		}

		timeToProcess = e->time - this->timeStamp;
		this->timeStamp += timeToProcess;
		i -= timeToProcess;
		processVoices(output, timeToProcess);

		switch(e->type) {
		case kNoteOnEvent:
			NoteOnEvent* ee = (NoteOnEvent*) e;
			// TODO: do something other than crash when no more voices
			Voice* v = this->freeVoices;
			this->freeVoices = v->next;
			v->next = this->usedVoices;
			this->usedVoices = v;
			v->noteOn(ee->midiNote, ee->velocity);
			this->noteVoiceMap[ee->midiNote] = v;
			break;
		case kNoteOffEvent:
			NoteOffEvent* ee = (NoteOffEvent*) e;
			Voice* v = this->noteVoiceMap[ee->midiNote];
			v->noteOff();
			break;
		default:
			break;
		}
		
		this->eventQueue = e->next;
		e->next = this->freeEvents;
		this->freeEvents = e;
		e = this->eventQueue;
	}

processRemainder:
	processVoices(output, i);
	bufferScale(outputs[0], 0.5, sampleFrames);
}