55502f40dc8b7c769880b10874abc9d0

it works but i think i could be doing things in a better way.

compile with gcc -lao -ldl -lm

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <ao/ao.h>
#include <math.h>
#include <pthread.h>

#define BUF_SIZE 4096

int play = 0;
int stop = 0;

int main (int argc, char *argv[]) {		//check for whitch effect to print
	int i = argc;
	for(i > 0; i--;) {
		switch(*argv[i]) {
			case '1':
				lattus();
				break;
			case '2':
				normal();
				break;
			case '3':
				choice();
				break;
			case ' ':
				break;
			default:
				break;
		}
	}
}


char *randstring (char *buffer, int length) {		//genertate a random number
	int i = length;
	for(i >= 0; i--;) {
		buffer[i] = (rand() % 2) ? '1' : '0';
	}
	buffer[length] = 0;
	return buffer;
}

int normal(){			// normal drawing of 1's and 0's
	struct winsize w;
	ioctl(0, TIOCGWINSZ, &w);
	int width = w.ws_col;
	int height = w.ws_row;		//get terminal width and height
	char buffer[width*height + 1];	//create a buffer big enough to hold one draw to the screen
	int i = 25;
	while(i-- >= 0) {
		printf("%s\n", randstring(buffer, width*height));	//draw to screen
		usleep(50000);
	}
	system("clear");		//clear screen
}

void *runner(void *threadid){ //detect thread number and run correct function
	long tid;
	tid = (long)threadid;
	if(tid == 1){
		noise(30);
	}else{
		lattus();
	}
	pthread_exit(NULL);
}

int choice(){ //start the seperate threads
	pthread_t threads[2];
	long t;
	int rc;
	int play2;
	for(t=0;t<2;t++){
		rc = pthread_create(&threads[t], NULL, runner, (void *)t);
	}
	if (rc){
		printf("ERROR; return code from pthread_create() is %d\n", rc);
		exit(-1);
	}
pthread_exit(NULL);
}

int noise(int pitch) { //initiate the noise function with pitch option(not implemented atm)
	ao_device *device;
	ao_sample_format format;
	int default_driver;
	char *buffer;
	int buf_size;
	int sample;
	float freq = 440.0;
	int i;	
	ao_initialize();
	default_driver = ao_default_driver_id();
	format.bits = 16;
	format.channels = 2;
	format.rate = 44100;
	format.byte_format = AO_FMT_LITTLE;
	int length = 2000;	
	buf_size = format.bits/8 * format.channels * length;
	buffer = calloc(buf_size, sizeof(char));
	for (i = 0; i < length; i++) {
		sample = (int)(1 * 32768.0 * sin(2 * M_PI * freq * ((float) i/format.rate)));
		buffer[4*i] = buffer[4*i+2] = sample & 0xff;
		buffer[4*i+1] = buffer[4*i+3] = (sample >> 8) & 0xff;
	}
	while(stop != 1){
		if(play == 1){
			device = ao_open_live(default_driver, &format, NULL /* no options */);
			ao_play(device, buffer, buf_size);
			ao_close(device);
			play = 0;
		}
	}
	pthread_exit(NULL);
}

int lattus (void) {
	struct winsize w;
	ioctl(0, TIOCGWINSZ, &w);
	int width = w.ws_col;		//get the terminal width
	char *buffer1 = malloc(sizeof(char) * (width + 1));	//create 3 buffers for each segment
	char *buffer2 = malloc(sizeof(char) * (width + 1));	//each big enough to hold the width of the terminal
	char *buffer3 = malloc(sizeof(char) * (width + 1));
	int first = 1;			//how many before the space
	int second = width - 8;		//how many in the middle of the space
	int third = 1;			//how many at the end of the space
	int i = 1000;			//draw 1000 lines
	int on = 0;			//switch for growing and shrinking
	while(i-- >= 0) {
		usleep(9000);
		if(first == 1 && third == 1 && second == width - 8 || second == width - 9) {	//is it at min?
			if(second % 2 == 0) {		//is it an even number (had problems with buffer if it was odd)
				second = second - 2;
			} else {
				second = second - 3;
			}
			first ++;
			third ++;
			on = 0;		//keep growing
			play = 1;
		} else if(first == (width - 8) / 2 && third == (width - 8) / 2 && second == 2) {	//untill it gets to max
			if(second % 2 == 0) {
				second = second + 2;
			} else {
				second = second + 1;
			}
			third --;
			first --;
			on = 1;		//start shrinking
			play = 1;
		} else if(on == 0) {	//else if suppost to grow, grow
			second = second - 2;
			third ++;
			first ++;
		} else if(on == 1) {	//else if suppost to shrink shrink
			second = second + 2;
			third --;
			first --;
		} else {
			break;
		}
		printf("%s   %s   %s\n", randstring(buffer1, first), randstring(buffer2, second), randstring(buffer3, third));	//print it out
		wait();
	}
	stop = 1;
	system("clear"); //clear screen
	ao_shutdown();
	pthread_exit(NULL);
}

Refactorings

No refactoring yet !

Your refactoring





Format Copy from initial code

or Cancel