#include <math.h>
#include <time.h>
#include "AUSS/AUSS.h"

/**
 * This program is a random ring modulator
 * Acts a filter with AUSS
 * */
#define BUFFSIZE  44100
int main(int argc, char ** argv) {
	int port = 0;
	char * host = NULL;
	float irate = 1/44100;
	int freq = 100;
	int timet = 0;
	int  i = 0;
	int jitter = 1;
	int size;
	short * buffer	= NULL;
	short * buffer1	= NULL;
	short * buffer2	= NULL;
	connection conn = auss_make_conn();
	char * header = auss_make_header(&conn);

	printf("HEADER: %s\n",header);
	free(header);

	buffer	= (short*)malloc(sizeof(short)*BUFFSIZE);
	buffer1	= (short*)malloc(sizeof(short)*BUFFSIZE);
	buffer2	= (short*)malloc(sizeof(short)*BUFFSIZE);
	timet = time(NULL);
	srand(timet);
	timet = 0;
	if (argc < 3) {
		printf("%s <host> <port>\n",argv[0]);
		return 1;
	}
	host = argv[1];
	port = atoi(argv[2]);
	if (!auss_connect(&conn,host,port,true,true)) {
		printf("Could not connect to Server!\n");
		return 1;
	}
	for(;;) {
		size = auss_read(&conn,(byte*)buffer,sizeof(short)*BUFFSIZE);
		if (size==-1) {
			auss_disconnect(&conn);
			return 1;
		}
		size /= 2;
		freq+=10-rand()%11; 
		for (i = 0; i < size; i++) {
			//buffer[i] = (short)(buffer[i]*sin((double)(M_PI_2*freq*(timet%44101)*irate)));  
			buffer[i] = (short)(buffer[i]*sin((double)(freq*(timet%44101))));  
			buffer1[i]=buffer2[i]=buffer[i];
			timet++;
		}
		for (i = 0; i < size; i++) {
			jitter = 10 - rand()%20;
			buffer[i] = (buffer[i]) /2 + buffer1[ (i+jitter) %BUFFSIZE ]/2;
		}
		if (-1==auss_write(&conn,(byte*)buffer,sizeof(short)*size)) {
			auss_disconnect(&conn);
			return 1;
		}
	}
	free(buffer); 
	free(buffer1); 
	free(buffer2); 
}

