diff options
author | 2012-11-02 10:24:58 +0000 | |
---|---|---|
committer | 2012-11-02 10:24:58 +0000 | |
commit | 5ffd57472dcd6a9ed24596c46a5dc7d51ae0669a (patch) | |
tree | 51d257df4ea3cf5a57843191536f25ede54601ee /lib/libsndio/sio_aucat.c | |
parent | BHyVe and QEMU also provide virtio. (diff) | |
download | wireguard-openbsd-5ffd57472dcd6a9ed24596c46a5dc7d51ae0669a.tar.xz wireguard-openbsd-5ffd57472dcd6a9ed24596c46a5dc7d51ae0669a.zip |
Use dedicated messages for flow control instead of abusing clock tick
messages and enable flow control for MIDI. Since this requires protocol
version bump, both sndiod and libsndio must be kept up to date to work
together.
Diffstat (limited to 'lib/libsndio/sio_aucat.c')
-rw-r--r-- | lib/libsndio/sio_aucat.c | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/lib/libsndio/sio_aucat.c b/lib/libsndio/sio_aucat.c index bea40dce087..da2a270ac56 100644 --- a/lib/libsndio/sio_aucat.c +++ b/lib/libsndio/sio_aucat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sio_aucat.c,v 1.12 2012/10/27 11:56:04 ratchov Exp $ */ +/* $OpenBSD: sio_aucat.c,v 1.13 2012/11/02 10:24:58 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -35,8 +35,7 @@ struct sio_aucat_hdl { struct sio_hdl sio; struct aucat aucat; - unsigned int rbpf, wbpf; /* read and write bytes-per-frame */ - int maxwrite; /* latency constraint */ + unsigned int rbpf, wbpf; /* read and write bytes-per-frame */ int events; /* events the user requested */ unsigned int curvol, reqvol; /* current and requested volume */ int delta; /* some of received deltas */ @@ -97,23 +96,17 @@ sio_aucat_runmsg(struct sio_aucat_hdl *hdl) return 0; } return 1; - case AMSG_POS: + case AMSG_FLOWCTL: delta = ntohl(hdl->aucat.rmsg.u.ts.delta); - hdl->maxwrite += delta * (int)hdl->wbpf; - DPRINTF("aucat: pos = %d, maxwrite = %d\n", - delta, hdl->maxwrite); - hdl->delta = delta; - if (hdl->delta >= 0) { - sio_onmove_cb(&hdl->sio, hdl->delta); - hdl->delta = 0; - } + hdl->aucat.maxwrite += delta * (int)hdl->wbpf; + DPRINTF("aucat: flowctl = %d, maxwrite = %d\n", + delta, hdl->aucat.maxwrite); break; case AMSG_MOVE: delta = ntohl(hdl->aucat.rmsg.u.ts.delta); - hdl->maxwrite += delta * hdl->wbpf; hdl->delta += delta; DPRINTFN(2, "aucat: move = %d, delta = %d, maxwrite = %d\n", - delta, hdl->delta, hdl->maxwrite); + delta, hdl->delta, hdl->aucat.maxwrite); if (hdl->delta >= 0) { sio_onmove_cb(&hdl->sio, hdl->delta); hdl->delta = 0; @@ -196,10 +189,10 @@ sio_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.bufsz; + hdl->aucat.maxwrite = hdl->wbpf * par.bufsz; hdl->round = par.round; hdl->delta = 0; - DPRINTF("aucat: start, maxwrite = %d\n", hdl->maxwrite); + DPRINTF("aucat: start, maxwrite = %d\n", hdl->aucat.maxwrite); AMSG_INIT(&hdl->aucat.wmsg); hdl->aucat.wmsg.cmd = htonl(AMSG_START); @@ -233,7 +226,7 @@ sio_aucat_stop(struct sio_hdl *sh) return 0; } if (hdl->aucat.wstate == WSTATE_DATA) { - hdl->maxwrite = hdl->aucat.wtodo; + hdl->aucat.maxwrite = hdl->aucat.wtodo; while (hdl->aucat.wstate != WSTATE_IDLE) { count = hdl->aucat.wtodo; if (count > ZERO_MAX) @@ -427,14 +420,14 @@ sio_aucat_write(struct sio_hdl *sh, const void *buf, size_t len) if (!sio_aucat_buildmsg(hdl)) break; } - if (len <= 0 || hdl->maxwrite <= 0) + if (len <= 0 || hdl->aucat.maxwrite <= 0) return 0; - if (len > hdl->maxwrite) - len = hdl->maxwrite; + if (len > hdl->aucat.maxwrite) + len = hdl->aucat.maxwrite; if (len > hdl->walign) len = hdl->walign; n = aucat_wdata(&hdl->aucat, buf, len, hdl->wbpf, &hdl->sio.eof); - hdl->maxwrite -= n; + hdl->aucat.maxwrite -= n; hdl->walign -= n; if (hdl->walign == 0) hdl->walign = hdl->round * hdl->wbpf; @@ -453,7 +446,7 @@ sio_aucat_pollfd(struct sio_hdl *sh, struct pollfd *pfd, int events) struct sio_aucat_hdl *hdl = (struct sio_aucat_hdl *)sh; hdl->events = events; - if (hdl->maxwrite <= 0) + if (hdl->aucat.maxwrite <= 0) events &= ~POLLOUT; return aucat_pollfd(&hdl->aucat, pfd, events); } @@ -473,7 +466,7 @@ sio_aucat_revents(struct sio_hdl *sh, struct pollfd *pfd) revents &= ~POLLIN; } if (revents & POLLOUT) { - if (hdl->maxwrite <= 0) + if (hdl->aucat.maxwrite <= 0) revents &= ~POLLOUT; } if (hdl->sio.eof) |