#include #include #include #include #include "dat.h" #include "fns.h" void audioinproc(void *v) { long n; uchar abuf[1024]; Block *b; Audio *a; a = v; threadsetname("audio in"); while((n = read(a->fd, abuf, sizeof(abuf))) > 0){ b = newblock(n, abuf); sendp(a->in, b); } fprint(2, "%s exiting: %r\n", threadgetname()); } void audiooutproc(void *v) { Block *b; Audio *a; a = v; threadsetname("audio out"); while(recv(a->out, &b)){ if(write(a->fd, b->data, b->length) < 0) sysfatal("audio write: %r"); free(b); } fprint(2, "%s exiting\n", threadgetname()); } Audio* audioinit(char *path) { Audio *a; if(path == nil) path = "/dev/audio"; a = emalloc(sizeof(*a)); a->fd = open(path, ORDWR); if(a->fd < 0) sysfatal("can't open %s: %r", path); a->in = chancreate(sizeof(Block*), 100); if(a->in == nil) sysfatal("chancreate: %r"); a->out = chancreate(sizeof(Block*), 100); if(a->out == nil) sysfatal("chancreate: %r"); a->inpid = proccreate(audioinproc, a, 8192); if(a->inpid < 0) sysfatal("proccreate: %r"); a->outpid = proccreate(audiooutproc, a, 8192); if(a->outpid < 0) sysfatal("proccreate: %r"); return a; }