#include
#include #include #include #include #include #include #include "dpi_posixio.h" #include
#define MAX_BUFFER 16384
int buffer = 1024; int prewrite = 0; int fragshift = 8; int test = 0; MODULE_PARM(buffer,"i"); MODULE_PARM(prewrite,"i"); MODULE_PARM(fragshift,"i"); MODULE_PARM(test,"i");
char *buf;
pthread_t thread;
int fd;
int monitor(void) { while(1) { if(read(fd, buf, buffer)<=0) return -1; if(prewrite) { / Note: This will drop the first input buffer / memset(buf, 0, prewrite); write(fd, buf, prewrite); prewrite = 0; } if(write(fd, buf, buffer)<=0) return -1; } }
int siren(void) { static int a = 0; static int f_lo = 300<<8; static int f; static int f_hi = 500<<8; static int d = 1; int j; int samples; short dest = (short )buf;
samples = buffer * sizeof(char) / sizeof(dest[0]); f = (f_lo + f_hi) / 2;
while(1) { for(j = 0; j
>8; f+=d; if(f>f_hi || f void thread_code(void t) { int val,r;
/ This is very dangerous with the es1370 driver. Wrong settings and you get a kernel panic... (Can this really happen if done from user space?) */ val = 0x7fff000 | (fragshift & 0xffff); r = ioctl(fd,SNDCTL_DSP_SETFRAGMENT,&val); if(r<0) goto fail;
r = ioctl(fd,SNDCTL_DSP_RESET,NULL); if(r<0) goto fail; val = 16; r = ioctl(fd,SNDCTL_DSP_SAMPLESIZE,&val); if(r<0) goto fail; val = AFMT_S16_LE; r = ioctl(fd,SNDCTL_DSP_SETFMT,&val); if(r<0) goto fail; val = 1; r = ioctl(fd,SNDCTL_DSP_STEREO,&val); if(r<0) goto fail; val = 44100; r = ioctl(fd,SNDCTL_DSP_SPEED,&val); if(r<0) goto fail; r = ioctl(fd,SNDCTL_DSP_SETDUPLEX,NULL); if(r<0) { fail: rtl_printf("Failed to initialize sound device!\n"); return (void *)-1; }
switch(test) { case 0: return (void )monitor(); default: return (void )siren(); } }
int init_module(void) { buffer &= 0xfffffffc; if(buffer>MAX_BUFFER) { buffer=MAX_BUFFER; printk("Buffer can't be bigger than %d bytes.\n", MAX_BUFFER); return -1; }
prewrite &= 0xfffffffc; if(prewrite>MAX_BUFFER) { prewrite=MAX_BUFFER; printk("Can't prewrite more than %d bytes.\n", MAX_BUFFER); return -1; }
if( !(buf = kmalloc(buffer,GFP_KERNEL)) ) { printk("Couldn't allocate buffer!\n"); return -1; }
if((fd = open("/dev/dsp0", O_RDWR)) < 0 ) { printk("Couldn't open device! (%d)\n",fd); kfree(buf); return -1; }
if( pthread_create(&thread, NULL, thread_code, (void *)1) ) { printk("Failed to create RT thread!\n"); close(fd); kfree(buf); return -1; }
return 0; }
void cleanup_module(void) { pthread_delete_np (thread); close(fd); kfree(buf); }
| Page history | Last edited Mon, 05 May 2003 22:11:19 -0500 | Edit this page |