#include <stdio.h>
#include "../H/ugens.h"
#include "../H/sfheader.h"

int RESET = 100;  /* times per sec to reinitialize envelope */
extern SFHEADER      sfdesc[NFILES];
#define BUFFERSIZE 2048

reset(p,n_args)
float *p;
{
	if(p[0]) RESET = p[0];
	fprintf(stderr,"Envelope calls set to %d times per sec\n",RESET);
}
setline() {}

mix(p,n_args)
float *p;
{
	register int i,j,k,si,chlist[4],nsamps;
	int input,output,inputch,outputch;
	float inpbuf[BUFFERSIZE],outpbuf[BUFFERSIZE],dur,amp,val;
	float *inpoint,*outpoint,*inend;
	int isisize,osisize;
	
	input = 0; output = 1;
	inputch =  sfchans(&sfdesc[input]);
	outputch = sfchans(&sfdesc[output]);
	dur = (p[2] < 0.) ? -p[2] : p[2] - p[0];
	amp = p[3];

	         setnote(p[0],dur,input);
	nsamps = setnote(p[1],dur,output);
	si = sfsrate(&sfdesc[input])/RESET;

	for(i=0; i<inputch; i++) 
		chlist[i] = p[i+4];

	for(i=0; i<nsamps; i+ = si) {
		si = ((i+si)>nsamps) ? nsamps-i : si;
		isisize = si * sfchans(&sfdesc[input]);
		osisize = si * sfchans(&sfdesc[output]);

		bclrf(outpbuf,osisize);
		bgetin(inpbuf,input,isisize);

		for(inpoint=inpbuf,outpoint=outpbuf,inend=inpoint+isisize; 
		inpoint < inend; inpoint += inputch,outpoint += outputch) {
			for(j=0; j<inputch; j++) {
				if(chlist[j] >= 0)
					*(outpoint + chlist[j]) += amp * 
							   *(inpoint + j);
			}
		}

		baddout(outpbuf,output,si * sfchans(&sfdesc[output]));
	}

	endnote(output);
}

testwrite(p,n_args)
float *p;
{
	int i,j,nsamps;
	float out[4];
	nsamps = setnote(p[0],p[1],1);
	for(i=0; i<nsamps; i++) {
		for(j=0; j<sfchans(&sfdesc[1]); j++)
			out[j] = i * (j+1);
		WIPEOUT(out,1);
	}
	endnote(1);
}		
testread(p,n_args)
float *p;
{
	int i,j,nsamps,unit;
	float out[4];
	unit = p[2];
	nsamps = setnote(p[0],p[1],unit);
	for(i=0; i<nsamps; i++) {
		GETIN(out,unit);
		for(j=0; j<sfchans(&sfdesc[unit]); j++)
			printf(" %f ",out[j]);
			printf("\n");	
	}
}
clean(p,n_args)
float *p;
{
	int i,j,nsamps;
	float out[4];
	nsamps = setnote(p[0],p[1],1);
	for(i=0; i<nsamps; i++) {
		for(j=0; j<sfchans(&sfdesc[1]); j++)
			out[j] = 0;
		WIPEOUT(out,1);
	}
	endnote(1);
}
