#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

#include <linux/soundcard.h>

#define BIND_PORT 8193
#define MSGBUFSIZE 1025

#define RATE 8192 //sample rate
#define SIZE 16  //bits per sample
#define CHANNELS 1 //channels of audio


main(int argc, char *argv[]){
struct sockaddr_in addr;
int fd,dsp, nbytes,addrlen,arg;
char msgbuf[MSGBUFSIZE];


	if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
		puts("socket");
		exit(1);
	}


	if((dsp = open("/dev/dsp", O_RDWR)) == -1){
		puts("error opening dsp device, perhaps you dont have a soundcard.. or need to figure out something trickier");
	
	}
	
	/* set sampling parameters */
	arg = SIZE;      /* sample size */
	ioctl(dsp, SOUND_PCM_WRITE_BITS, &arg);

	arg = CHANNELS;  /* mono or stereo */
	ioctl(dsp, SOUND_PCM_WRITE_CHANNELS, &arg);

	arg = RATE;      /* sampling rate */
	ioctl(dsp, SOUND_PCM_WRITE_RATE, &arg);



	memset(&addr,0,sizeof(addr));
	addr.sin_family=AF_INET;
	addr.sin_addr.s_addr=htonl(INADDR_ANY); 
	addr.sin_port=htons(BIND_PORT);

	/* bind to receive address */
	if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) {
		puts("bind");
		exit(1);
	}
     

     /* now just enter a read-print loop */
	while (1) {
		addrlen=sizeof(addr);
		if((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0,(struct sockaddr *) &addr,&addrlen)) < 0) {
			puts("recvfrom");
		}else{
			write(dsp,msgbuf,nbytes);
		}
		printf("%u bytes\n",nbytes);
	}
}


