diff options
author | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2010-06-05 16:00:53 +0000 |
---|---|---|
committer | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2010-06-05 16:00:53 +0000 |
commit | e659327504f6936b52a3262296dcc0c05a8615dc (patch) | |
tree | e4e4566a058a8ca1b4be35339b2572a86ba38141 | |
parent | 3d0f2c9a1fbaa6ff1fd1fc858ce1aa5248866417 (diff) |
don't prime server buffers, because it's ugly and conceptually
complicated. Instead, request clients to provide enough samples
and start with buffers full.
-rw-r--r-- | lib/libsndio/aucat.c | 10 | ||||
-rw-r--r-- | usr.bin/aucat/aucat.c | 4 | ||||
-rw-r--r-- | usr.bin/aucat/dev.c | 43 | ||||
-rw-r--r-- | usr.bin/aucat/dev.h | 6 | ||||
-rw-r--r-- | usr.bin/aucat/sock.c | 33 |
5 files changed, 24 insertions, 72 deletions
diff --git a/lib/libsndio/aucat.c b/lib/libsndio/aucat.c index 462f45387e6..5147c1ad646 100644 --- a/lib/libsndio/aucat.c +++ b/lib/libsndio/aucat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: aucat.c,v 1.40 2010/06/05 13:40:47 ratchov Exp $ */ +/* $OpenBSD: aucat.c,v 1.41 2010/06/05 16:00:52 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -151,7 +151,8 @@ aucat_runmsg(struct aucat_hdl *hdl) hdl->rtodo = hdl->rmsg.u.data.size; break; case AMSG_POS: - DPRINTF("aucat: pos = %d, maxwrite = %u\n", + hdl->maxwrite += hdl->rmsg.u.ts.delta * (int)hdl->wbpf; + DPRINTF("aucat: pos = %d, maxwrite = %d\n", hdl->rmsg.u.ts.delta, hdl->maxwrite); hdl->delta = hdl->rmsg.u.ts.delta; hdl->rstate = STATE_MSG; @@ -160,7 +161,7 @@ aucat_runmsg(struct aucat_hdl *hdl) case AMSG_MOVE: hdl->maxwrite += hdl->rmsg.u.ts.delta * hdl->wbpf; hdl->delta += hdl->rmsg.u.ts.delta; - DPRINTF("aucat: move = %d, delta = %d, maxwrite = %u\n", + DPRINTF("aucat: move = %d, delta = %d, maxwrite = %d\n", hdl->rmsg.u.ts.delta, hdl->delta, hdl->maxwrite); if (hdl->delta >= 0) { sio_onmove_cb(&hdl->sio, hdl->delta); @@ -326,8 +327,9 @@ aucat_start(struct sio_hdl *sh) return 0; hdl->wbpf = par.bps * par.pchan; hdl->rbpf = par.bps * par.rchan; - hdl->maxwrite = hdl->wbpf * par.appbufsz; + hdl->maxwrite = hdl->wbpf * par.bufsz; hdl->delta = 0; + DPRINTF("aucat: start, maxwrite = %d\n", hdl->maxwrite); AMSG_INIT(&hdl->wmsg); hdl->wmsg.cmd = AMSG_START; diff --git a/usr.bin/aucat/aucat.c b/usr.bin/aucat/aucat.c index daa3d727d2c..e619167a9be 100644 --- a/usr.bin/aucat/aucat.c +++ b/usr.bin/aucat/aucat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: aucat.c,v 1.93 2010/06/05 12:45:48 ratchov Exp $ */ +/* $OpenBSD: aucat.c,v 1.94 2010/06/05 16:00:52 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -723,7 +723,7 @@ aucat_main(int argc, char **argv) } else { d = dev_new_sio(cd->path, cd->mode, &cd->ipar, &cd->opar, cd->bufsz, cd->round, - cd->hold, l_flag); + cd->hold); } if (d == NULL) errx(1, "%s: can't open device", cd->path); diff --git a/usr.bin/aucat/dev.c b/usr.bin/aucat/dev.c index 19b73b08f70..3a259c42e9c 100644 --- a/usr.bin/aucat/dev.c +++ b/usr.bin/aucat/dev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dev.c,v 1.57 2010/06/04 06:15:28 ratchov Exp $ */ +/* $OpenBSD: dev.c,v 1.58 2010/06/05 16:00:52 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -105,7 +105,6 @@ void dev_close(struct dev *); void dev_start(struct dev *); void dev_stop(struct dev *); void dev_clear(struct dev *); -void dev_prime(struct dev *); struct dev *dev_list = NULL; @@ -115,7 +114,7 @@ struct dev *dev_list = NULL; struct dev * dev_new_sio(char *path, unsigned mode, struct aparams *dipar, struct aparams *dopar, - unsigned bufsz, unsigned round, unsigned hold, unsigned prime) + unsigned bufsz, unsigned round, unsigned hold) { struct dev *d; @@ -132,7 +131,6 @@ dev_new_sio(char *path, d->reqipar = *dipar; d->reqbufsz = bufsz; d->reqround = round; - d->prime = prime; d->hold = hold; d->pstate = DEV_CLOSED; d->next = dev_list; @@ -171,7 +169,6 @@ dev_new_loop(struct aparams *dipar, struct aparams *dopar, unsigned bufsz) d->reqmode = MODE_PLAY | MODE_REC | MODE_LOOP; d->pstate = DEV_CLOSED; d->hold = 0; - d->prime = 0; d->next = dev_list; dev_list = d; return d; @@ -193,7 +190,6 @@ dev_new_thru(void) d->reqmode = 0; d->pstate = DEV_CLOSED; d->hold = 0; - d->prime = 0; d->next = dev_list; dev_list = d; return d; @@ -391,8 +387,6 @@ dev_open(struct dev *d) } #endif d->pstate = DEV_INIT; - if (d->prime) - dev_prime(d); return 1; } @@ -748,11 +742,8 @@ dev_run(struct dev *d) dev_stop(d); if (d->refcnt == 0 && !d->hold) dev_close(d); - else { + else dev_clear(d); - if (d->prime) - dev_prime(d); - } } break; } @@ -760,10 +751,7 @@ dev_run(struct dev *d) } /* - * If the device is paused, then resume it. If the caller is using - * full-duplex and its buffers are small, the ``prime'' flag - * could be set to initialize device buffers with silence - * + * If the device is paused, then resume it. * This routine can be called from aproc context. */ void @@ -1151,26 +1139,3 @@ dev_clear(struct dev *d) mon_clear(d->mon); } } - -/* - * Fill with silence play buffers and schedule the same amount of recorded - * samples to drop - */ -void -dev_prime(struct dev *d) -{ - -#ifdef DEBUG - if (debug_level >= 3) - dbg_puts("priming device\n"); -#endif - if (APROC_OK(d->mix)) { -#ifdef DEBUG - if (!LIST_EMPTY(&d->mix->ins)) { - dbg_puts("play end not idle, can't prime device\n"); - dbg_panic(); - } -#endif - mix_prime(d->mix); - } -} diff --git a/usr.bin/aucat/dev.h b/usr.bin/aucat/dev.h index 62ad96b074e..ab8f412fd23 100644 --- a/usr.bin/aucat/dev.h +++ b/usr.bin/aucat/dev.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dev.h,v 1.24 2010/06/04 06:15:28 ratchov Exp $ */ +/* $OpenBSD: dev.h,v 1.25 2010/06/05 16:00:52 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -32,7 +32,6 @@ struct dev { unsigned reqbufsz; /* buffer size */ unsigned reqround; /* block size */ unsigned reqrate; /* sample rate */ - unsigned prime; /* prime play buffer? */ unsigned hold; /* hold the device open ? */ unsigned refcnt; /* number of openers */ #define DEV_CLOSED 0 /* closed */ @@ -63,8 +62,7 @@ void dev_wakeup(struct dev *); struct dev *dev_new_thru(void); struct dev *dev_new_loop(struct aparams *, struct aparams *, unsigned); struct dev *dev_new_sio(char *, unsigned, - struct aparams *, struct aparams *, unsigned, unsigned, - unsigned, unsigned); + struct aparams *, struct aparams *, unsigned, unsigned, unsigned); int dev_thruadd(struct dev *, char *, int, int); void dev_midiattach(struct dev *, struct abuf *, struct abuf *); unsigned dev_roundof(struct dev *, unsigned); diff --git a/usr.bin/aucat/sock.c b/usr.bin/aucat/sock.c index 624b1ecd5ea..4eec95f70e6 100644 --- a/usr.bin/aucat/sock.c +++ b/usr.bin/aucat/sock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sock.c,v 1.49 2010/06/05 12:45:48 ratchov Exp $ */ +/* $OpenBSD: sock.c,v 1.50 2010/06/05 16:00:52 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -409,23 +409,25 @@ void sock_allocbuf(struct sock *f) { struct abuf *rbuf = NULL, *wbuf = NULL; + unsigned bufsz; + bufsz = f->bufsz + f->dev->bufsz / f->dev->round * f->round; f->pstate = SOCK_START; if (f->mode & AMSG_PLAY) { - rbuf = abuf_new(f->bufsz, &f->rpar); + rbuf = abuf_new(bufsz, &f->rpar); aproc_setout(f->pipe.file.rproc, rbuf); if (!ABUF_WOK(rbuf) || (f->pipe.file.state & FILE_EOF)) f->pstate = SOCK_READY; + f->rmax = bufsz * aparams_bpf(&f->rpar); } if (f->mode & AMSG_RECMASK) { - wbuf = abuf_new(f->bufsz, &f->wpar); + wbuf = abuf_new(bufsz, &f->wpar); aproc_setin(f->pipe.file.wproc, wbuf); f->walign = f->round; + f->wmax = 0; } f->delta = 0; f->startpos = 0; - f->wmax = 0; - f->rmax = f->bufsz; f->tickpending = 0; f->startpending = 0; #ifdef DEBUG @@ -433,6 +435,8 @@ sock_allocbuf(struct sock *f) sock_dbg(f); dbg_puts(": allocating "); dbg_putu(f->bufsz); + dbg_puts("/"); + dbg_putu(bufsz); dbg_puts(" fr buffers, rmax = "); dbg_putu(f->rmax); dbg_puts("\n"); @@ -926,24 +930,6 @@ sock_setpar(struct sock *f) } #endif } - if (AMSG_ISSET(p->bufsz)) { - /* - * XXX: bufsz will become read-only, but for now - * allow old library to properly work - */ -#ifdef DEBUG - if (debug_level >= 1) { - sock_dbg(f); - dbg_puts(": legacy client using "); - dbg_putx(p->bufsz); - dbg_puts("fr total buffer size\n"); - } -#endif - min = (f->dev->bufsz / f->dev->round) * f->round; - if (p->bufsz < min) - p->bufsz = min; - p->appbufsz = p->bufsz - min; - } if (AMSG_ISSET(p->appbufsz)) { rate = (f->mode & AMSG_PLAY) ? f->rpar.rate : f->wpar.rate; min = 1; @@ -1508,6 +1494,7 @@ sock_buildmsg(struct sock *f) AMSG_INIT(&f->wmsg); f->wmsg.cmd = AMSG_POS; f->wmsg.u.ts.delta = f->startpos; + f->rmax += f->startpos; f->wtodo = sizeof(struct amsg); f->wstate = SOCK_WMSG; f->startpending = 0; |