diff --git a/libsndio/sio_aucat.c b/libsndio/sio_aucat.c index 78d8505..e6b60fa 100644 --- a/libsndio/sio_aucat.c +++ b/libsndio/sio_aucat.c @@ -43,6 +43,8 @@ struct sio_aucat_hdl { #define PSTATE_INIT 0 #define PSTATE_RUN 1 int pstate; + size_t round; /* write block size */ + size_t walign; /* align write packets size to this */ }; static void sio_aucat_close(struct sio_hdl *); @@ -165,6 +167,8 @@ sio_aucat_open(const char *str, unsigned int mode, int nbio) hdl->curvol = SIO_MAXVOL; hdl->reqvol = SIO_MAXVOL; hdl->pstate = PSTATE_INIT; + hdl->round = 0xdeadbeef; + hdl->walign = 0xdeadbeef; return (struct sio_hdl *)hdl; } @@ -193,6 +197,7 @@ sio_aucat_start(struct sio_hdl *sh) hdl->wbpf = par.bps * par.pchan; hdl->rbpf = par.bps * par.rchan; hdl->maxwrite = hdl->wbpf * par.bufsz; + hdl->round = par.round; hdl->delta = 0; DPRINTF("aucat: start, maxwrite = %d\n", hdl->maxwrite); @@ -205,6 +210,7 @@ sio_aucat_start(struct sio_hdl *sh) hdl->aucat.rtodo = sizeof(struct amsg); if (!aucat_setfl(&hdl->aucat, 1, &hdl->sio.eof)) return 0; + hdl->walign = hdl->round * hdl->wbpf; hdl->pstate = PSTATE_RUN; return 1; } @@ -425,8 +431,13 @@ sio_aucat_write(struct sio_hdl *sh, const void *buf, size_t len) return 0; if (len > hdl->maxwrite) len = hdl->maxwrite; + if (len > hdl->walign) + len = hdl->walign; n = aucat_wdata(&hdl->aucat, buf, len, hdl->wbpf, &hdl->sio.eof); hdl->maxwrite -= n; + hdl->walign -= n; + if (hdl->walign == 0) + hdl->walign = hdl->round * hdl->wbpf; return n; }