diff options
author | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2011-04-08 11:18:08 +0000 |
---|---|---|
committer | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2011-04-08 11:18:08 +0000 |
commit | fec3e2da48e9e0de1799fde5962303e6d68acc38 (patch) | |
tree | d9606e92b8544bdf021aacb5f161f06195aeafd1 /lib/libsndio/aucat.c | |
parent | ceed304d377c01d19816d3957fcfde243991a128 (diff) |
Clean up function naming: use sio_<backend>_ prefix for private
audio-related functions and put them in files named sio_<backend>.c
No behaviour changes.
Diffstat (limited to 'lib/libsndio/aucat.c')
-rw-r--r-- | lib/libsndio/aucat.c | 746 |
1 files changed, 0 insertions, 746 deletions
diff --git a/lib/libsndio/aucat.c b/lib/libsndio/aucat.c deleted file mode 100644 index 7c1ebbe7ab3..00000000000 --- a/lib/libsndio/aucat.c +++ /dev/null @@ -1,746 +0,0 @@ -/* $OpenBSD: aucat.c,v 1.42 2010/10/21 18:57:42 ratchov Exp $ */ -/* - * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/un.h> - -#include <errno.h> -#include <fcntl.h> -#include <poll.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "amsg.h" -#include "sndio_priv.h" - -struct aucat_hdl { - struct sio_hdl sio; - int fd; /* socket */ - struct amsg rmsg, wmsg; /* temporary messages */ - size_t wtodo, rtodo; /* bytes to complete the packet */ -#define STATE_IDLE 0 /* nothing to do */ -#define STATE_MSG 1 /* message being transferred */ -#define STATE_DATA 2 /* data being transferred */ - unsigned rstate, wstate; /* one of above */ - unsigned rbpf, wbpf; /* read and write bytes-per-frame */ - int maxwrite; /* latency constraint */ - int events; /* events the user requested */ - unsigned curvol, reqvol; /* current and requested volume */ - int delta; /* some of received deltas */ -}; - -static void aucat_close(struct sio_hdl *); -static int aucat_start(struct sio_hdl *); -static int aucat_stop(struct sio_hdl *); -static int aucat_setpar(struct sio_hdl *, struct sio_par *); -static int aucat_getpar(struct sio_hdl *, struct sio_par *); -static int aucat_getcap(struct sio_hdl *, struct sio_cap *); -static size_t aucat_read(struct sio_hdl *, void *, size_t); -static size_t aucat_write(struct sio_hdl *, const void *, size_t); -static int aucat_pollfd(struct sio_hdl *, struct pollfd *, int); -static int aucat_revents(struct sio_hdl *, struct pollfd *); -static int aucat_setvol(struct sio_hdl *, unsigned); -static void aucat_getvol(struct sio_hdl *); - -static struct sio_ops aucat_ops = { - aucat_close, - aucat_setpar, - aucat_getpar, - aucat_getcap, - aucat_write, - aucat_read, - aucat_start, - aucat_stop, - aucat_pollfd, - aucat_revents, - aucat_setvol, - aucat_getvol -}; - -/* - * read a message, return 0 if blocked - */ -static int -aucat_rmsg(struct aucat_hdl *hdl) -{ - ssize_t n; - unsigned char *data; - - while (hdl->rtodo > 0) { - data = (unsigned char *)&hdl->rmsg; - data += sizeof(struct amsg) - hdl->rtodo; - while ((n = read(hdl->fd, data, hdl->rtodo)) < 0) { - if (errno == EINTR) - continue; - if (errno != EAGAIN) { - hdl->sio.eof = 1; - DPERROR("aucat_rmsg: read"); - } - return 0; - } - if (n == 0) { - DPRINTF("aucat_rmsg: eof\n"); - hdl->sio.eof = 1; - return 0; - } - hdl->rtodo -= n; - } - return 1; -} - -/* - * write a message, return 0 if blocked - */ -static int -aucat_wmsg(struct aucat_hdl *hdl) -{ - ssize_t n; - unsigned char *data; - - while (hdl->wtodo > 0) { - data = (unsigned char *)&hdl->wmsg; - data += sizeof(struct amsg) - hdl->wtodo; - while ((n = write(hdl->fd, data, hdl->wtodo)) < 0) { - if (errno == EINTR) - continue; - if (errno != EAGAIN) { - hdl->sio.eof = 1; - DPERROR("aucat_wmsg: write"); - } - return 0; - } - hdl->wtodo -= n; - } - return 1; -} - -/* - * execute the next message, return 0 if blocked - */ -static int -aucat_runmsg(struct aucat_hdl *hdl) -{ - if (!aucat_rmsg(hdl)) - return 0; - switch (hdl->rmsg.cmd) { - case AMSG_DATA: - if (hdl->rmsg.u.data.size == 0 || - hdl->rmsg.u.data.size % hdl->rbpf) { - DPRINTF("aucat_runmsg: bad data message\n"); - hdl->sio.eof = 1; - return 0; - } - hdl->rstate = STATE_DATA; - hdl->rtodo = hdl->rmsg.u.data.size; - break; - case AMSG_POS: - 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; - hdl->rtodo = sizeof(struct amsg); - break; - 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 = %d\n", - hdl->rmsg.u.ts.delta, hdl->delta, hdl->maxwrite); - if (hdl->delta >= 0) { - sio_onmove_cb(&hdl->sio, hdl->delta); - hdl->delta = 0; - } - hdl->rstate = STATE_MSG; - hdl->rtodo = sizeof(struct amsg); - break; - case AMSG_SETVOL: - hdl->curvol = hdl->reqvol = hdl->rmsg.u.vol.ctl; - sio_onvol_cb(&hdl->sio, hdl->curvol); - hdl->rstate = STATE_MSG; - hdl->rtodo = sizeof(struct amsg); - break; - case AMSG_GETPAR: - case AMSG_ACK: - hdl->rstate = STATE_IDLE; - hdl->rtodo = 0xdeadbeef; - break; - default: - DPRINTF("aucat_runmsg: unknown message\n"); - hdl->sio.eof = 1; - return 0; - } - return 1; -} - -struct sio_hdl * -sio_open_aucat(const char *str, unsigned mode, int nbio) -{ - extern char *__progname; - int s; - char unit[4], *sep, *opt; - struct aucat_hdl *hdl; - struct sockaddr_un ca; - socklen_t len = sizeof(struct sockaddr_un); - uid_t uid; - - sep = strchr(str, '.'); - if (sep == NULL) { - opt = "default"; - strlcpy(unit, str, sizeof(unit)); - } else { - opt = sep + 1; - if (sep - str >= sizeof(unit)) { - DPRINTF("sio_open_aucat: %s: too long\n", str); - return NULL; - } - strlcpy(unit, str, opt - str); - } - DPRINTF("sio_open_aucat: trying %s -> %s.%s\n", str, unit, opt); - uid = geteuid(); - if (strchr(str, '/') != NULL) - return NULL; - snprintf(ca.sun_path, sizeof(ca.sun_path), - "/tmp/aucat-%u/softaudio%s", uid, unit); - ca.sun_family = AF_UNIX; - - hdl = malloc(sizeof(struct aucat_hdl)); - if (hdl == NULL) - return NULL; - sio_create(&hdl->sio, &aucat_ops, mode, nbio); - - s = socket(AF_UNIX, SOCK_STREAM, 0); - if (s < 0) - goto bad_free; - while (connect(s, (struct sockaddr *)&ca, len) < 0) { - if (errno == EINTR) - continue; - DPERROR("sio_open_aucat: connect"); - /* try shared server */ - snprintf(ca.sun_path, sizeof(ca.sun_path), - "/tmp/aucat/softaudio%s", unit); - while (connect(s, (struct sockaddr *)&ca, len) < 0) { - if (errno == EINTR) - continue; - DPERROR("sio_open_aucat: connect"); - goto bad_connect; - } - break; - } - if (fcntl(s, F_SETFD, FD_CLOEXEC) < 0) { - DPERROR("FD_CLOEXEC"); - goto bad_connect; - } - hdl->fd = s; - hdl->rstate = STATE_IDLE; - hdl->rtodo = 0xdeadbeef; - hdl->wstate = STATE_IDLE; - hdl->wtodo = 0xdeadbeef; - hdl->curvol = SIO_MAXVOL; - hdl->reqvol = SIO_MAXVOL; - - /* - * say hello to server - */ - AMSG_INIT(&hdl->wmsg); - hdl->wmsg.cmd = AMSG_HELLO; - hdl->wmsg.u.hello.version = AMSG_VERSION; - hdl->wmsg.u.hello.mode = mode; - strlcpy(hdl->wmsg.u.hello.who, __progname, - sizeof(hdl->wmsg.u.hello.who)); - strlcpy(hdl->wmsg.u.hello.opt, opt, - sizeof(hdl->wmsg.u.hello.opt)); - hdl->wtodo = sizeof(struct amsg); - if (!aucat_wmsg(hdl)) - goto bad_connect; - hdl->rtodo = sizeof(struct amsg); - if (!aucat_rmsg(hdl)) { - DPRINTF("sio_open_aucat: mode refused\n"); - goto bad_connect; - } - if (hdl->rmsg.cmd != AMSG_ACK) { - DPRINTF("sio_open_aucat: protocol err\n"); - goto bad_connect; - } - return (struct sio_hdl *)hdl; - bad_connect: - while (close(s) < 0 && errno == EINTR) - ; /* retry */ - bad_free: - free(hdl); - return NULL; -} - -static void -aucat_close(struct sio_hdl *sh) -{ - struct aucat_hdl *hdl = (struct aucat_hdl *)sh; - char dummy[1]; - - if (!hdl->sio.eof && hdl->sio.started) - (void)aucat_stop(&hdl->sio); - if (!hdl->sio.eof) { - AMSG_INIT(&hdl->wmsg); - hdl->wmsg.cmd = AMSG_BYE; - hdl->wtodo = sizeof(struct amsg); - if (!aucat_wmsg(hdl)) - goto bad_close; - while (read(hdl->fd, dummy, 1) < 0 && errno == EINTR) - ; /* nothing */ - } - bad_close: - while (close(hdl->fd) < 0 && errno == EINTR) - ; /* nothing */ - free(hdl); -} - -static int -aucat_start(struct sio_hdl *sh) -{ - struct aucat_hdl *hdl = (struct aucat_hdl *)sh; - struct sio_par par; - - /* - * save bpf - */ - if (!sio_getpar(&hdl->sio, &par)) - return 0; - hdl->wbpf = par.bps * par.pchan; - hdl->rbpf = par.bps * par.rchan; - 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; - hdl->wtodo = sizeof(struct amsg); - if (!aucat_wmsg(hdl)) - return 0; - hdl->rstate = STATE_MSG; - hdl->rtodo = sizeof(struct amsg); - if (fcntl(hdl->fd, F_SETFL, O_NONBLOCK) < 0) { - DPERROR("aucat_start: fcntl(0)"); - hdl->sio.eof = 1; - return 0; - } - return 1; -} - -static int -aucat_stop(struct sio_hdl *sh) -{ -#define ZERO_MAX 0x400 - static unsigned char zero[ZERO_MAX]; - struct aucat_hdl *hdl = (struct aucat_hdl *)sh; - unsigned n, count; - - if (fcntl(hdl->fd, F_SETFL, 0) < 0) { - DPERROR("aucat_stop: fcntl(0)"); - hdl->sio.eof = 1; - return 0; - } - - /* - * complete message or data block in progress - */ - if (hdl->wstate == STATE_MSG) { - if (!aucat_wmsg(hdl)) - return 0; - if (hdl->wmsg.cmd == AMSG_DATA) { - hdl->wstate = STATE_DATA; - hdl->wtodo = hdl->wmsg.u.data.size; - } else - hdl->wstate = STATE_IDLE; - } - if (hdl->wstate == STATE_DATA) { - hdl->maxwrite = hdl->wtodo; - while (hdl->wstate != STATE_IDLE) { - count = hdl->wtodo; - if (count > ZERO_MAX) - count = ZERO_MAX; - n = aucat_write(&hdl->sio, zero, count); - if (n == 0) - return 0; - } - } - - /* - * send stop message - */ - AMSG_INIT(&hdl->wmsg); - hdl->wmsg.cmd = AMSG_STOP; - hdl->wtodo = sizeof(struct amsg); - if (!aucat_wmsg(hdl)) - return 0; - if (hdl->rstate == STATE_IDLE) { - hdl->rstate = STATE_MSG; - hdl->rtodo = sizeof(struct amsg); - } - - /* - * wait for the STOP ACK - */ - while (hdl->rstate != STATE_IDLE) { - switch (hdl->rstate) { - case STATE_MSG: - if (!aucat_runmsg(hdl)) - return 0; - break; - case STATE_DATA: - if (!aucat_read(&hdl->sio, zero, ZERO_MAX)) - return 0; - break; - } - } - return 1; -} - -static int -aucat_setpar(struct sio_hdl *sh, struct sio_par *par) -{ - struct aucat_hdl *hdl = (struct aucat_hdl *)sh; - - AMSG_INIT(&hdl->wmsg); - hdl->wmsg.cmd = AMSG_SETPAR; - hdl->wmsg.u.par.bits = par->bits; - hdl->wmsg.u.par.bps = par->bps; - hdl->wmsg.u.par.sig = par->sig; - hdl->wmsg.u.par.le = par->le; - hdl->wmsg.u.par.msb = par->msb; - hdl->wmsg.u.par.rate = par->rate; - hdl->wmsg.u.par.appbufsz = par->appbufsz; - hdl->wmsg.u.par.xrun = par->xrun; - if (hdl->sio.mode & SIO_REC) - hdl->wmsg.u.par.rchan = par->rchan; - if (hdl->sio.mode & SIO_PLAY) - hdl->wmsg.u.par.pchan = par->pchan; - hdl->wtodo = sizeof(struct amsg); - if (!aucat_wmsg(hdl)) - return 0; - return 1; -} - -static int -aucat_getpar(struct sio_hdl *sh, struct sio_par *par) -{ - struct aucat_hdl *hdl = (struct aucat_hdl *)sh; - - AMSG_INIT(&hdl->wmsg); - hdl->wmsg.cmd = AMSG_GETPAR; - hdl->wtodo = sizeof(struct amsg); - if (!aucat_wmsg(hdl)) - return 0; - hdl->rtodo = sizeof(struct amsg); - if (!aucat_rmsg(hdl)) - return 0; - if (hdl->rmsg.cmd != AMSG_GETPAR) { - DPRINTF("aucat_getpar: protocol err\n"); - hdl->sio.eof = 1; - return 0; - } - par->bits = hdl->rmsg.u.par.bits; - par->bps = hdl->rmsg.u.par.bps; - par->sig = hdl->rmsg.u.par.sig; - par->le = hdl->rmsg.u.par.le; - par->msb = hdl->rmsg.u.par.msb; - par->rate = hdl->rmsg.u.par.rate; - par->bufsz = hdl->rmsg.u.par.bufsz; - par->appbufsz = hdl->rmsg.u.par.appbufsz; - par->xrun = hdl->rmsg.u.par.xrun; - par->round = hdl->rmsg.u.par.round; - if (hdl->sio.mode & SIO_PLAY) - par->pchan = hdl->rmsg.u.par.pchan; - if (hdl->sio.mode & SIO_REC) - par->rchan = hdl->rmsg.u.par.rchan; - return 1; -} - -static int -aucat_getcap(struct sio_hdl *sh, struct sio_cap *cap) -{ - struct aucat_hdl *hdl = (struct aucat_hdl *)sh; - unsigned i, bps, le, sig, chan, rindex, rmult; - static unsigned rates[] = { 8000, 11025, 12000 }; - - AMSG_INIT(&hdl->wmsg); - hdl->wmsg.cmd = AMSG_GETCAP; - hdl->wtodo = sizeof(struct amsg); - if (!aucat_wmsg(hdl)) - return 0; - hdl->rtodo = sizeof(struct amsg); - if (!aucat_rmsg(hdl)) - return 0; - if (hdl->rmsg.cmd != AMSG_GETCAP) { - DPRINTF("aucat_getcap: protocol err\n"); - hdl->sio.eof = 1; - return 0; - } - bps = 1; - sig = le = 0; - cap->confs[0].enc = 0; - for (i = 0; i < SIO_NENC; i++) { - if (bps > 4) - break; - cap->confs[0].enc |= 1 << i; - cap->enc[i].bits = bps == 4 ? 24 : bps * 8; - cap->enc[i].bps = bps; - cap->enc[i].sig = sig ^ 1; - cap->enc[i].le = bps > 1 ? le : SIO_LE_NATIVE; - cap->enc[i].msb = 1; - le++; - if (le > 1 || bps == 1) { - le = 0; - sig++; - } - if (sig > 1 || (le == 0 && bps > 1)) { - sig = 0; - bps++; - } - } - chan = 1; - cap->confs[0].rchan = 0; - for (i = 0; i < SIO_NCHAN; i++) { - if (chan > 16) - break; - cap->confs[0].rchan |= 1 << i; - cap->rchan[i] = chan; - if (chan >= 12) { - chan += 4; - } else if (chan >= 2) { - chan += 2; - } else - chan++; - } - chan = 1; - cap->confs[0].pchan = 0; - for (i = 0; i < SIO_NCHAN; i++) { - if (chan > 16) - break; - cap->confs[0].pchan |= 1 << i; - cap->pchan[i] = chan; - if (chan >= 12) { - chan += 4; - } else if (chan >= 2) { - chan += 2; - } else - chan++; - } - rindex = 0; - rmult = 1; - cap->confs[0].rate = 0; - for (i = 0; i < SIO_NRATE; i++) { - if (rmult >= 32) - break; - cap->rate[i] = rates[rindex] * rmult; - cap->confs[0].rate |= 1 << i; - rindex++; - if (rindex == sizeof(rates) / sizeof(unsigned)) { - rindex = 0; - rmult *= 2; - } - } - cap->nconf = 1; - return 1; -} - -static size_t -aucat_read(struct sio_hdl *sh, void *buf, size_t len) -{ - struct aucat_hdl *hdl = (struct aucat_hdl *)sh; - ssize_t n; - - while (hdl->rstate != STATE_DATA) { - switch (hdl->rstate) { - case STATE_MSG: - if (!aucat_runmsg(hdl)) - return 0; - break; - case STATE_IDLE: - DPRINTF("aucat_read: unexpected idle state\n"); - hdl->sio.eof = 1; - return 0; - } - } - if (len > hdl->rtodo) - len = hdl->rtodo; - while ((n = read(hdl->fd, buf, len)) < 0) { - if (errno == EINTR) - continue; - if (errno != EAGAIN) { - hdl->sio.eof = 1; - DPERROR("aucat_read: read"); - } - return 0; - } - if (n == 0) { - DPRINTF("aucat_read: eof\n"); - hdl->sio.eof = 1; - return 0; - } - hdl->rtodo -= n; - if (hdl->rtodo == 0) { - hdl->rstate = STATE_MSG; - hdl->rtodo = sizeof(struct amsg); - } - DPRINTF("aucat: read: n = %zd\n", n); - return n; -} - -static int -aucat_buildmsg(struct aucat_hdl *hdl, size_t len) -{ - unsigned sz; - - if (hdl->curvol != hdl->reqvol) { - hdl->wstate = STATE_MSG; - hdl->wtodo = sizeof(struct amsg); - hdl->wmsg.cmd = AMSG_SETVOL; - hdl->wmsg.u.vol.ctl = hdl->reqvol; - hdl->curvol = hdl->reqvol; - return 1; - } else if (len > 0 && hdl->maxwrite > 0) { - sz = len; - if (sz > AMSG_DATAMAX) - sz = AMSG_DATAMAX; - if (sz > hdl->maxwrite) - sz = hdl->maxwrite; - sz -= sz % hdl->wbpf; - if (sz == 0) - sz = hdl->wbpf; - hdl->wstate = STATE_MSG; - hdl->wtodo = sizeof(struct amsg); - hdl->wmsg.cmd = AMSG_DATA; - hdl->wmsg.u.data.size = sz; - return 1; - } - return 0; -} - -static size_t -aucat_write(struct sio_hdl *sh, const void *buf, size_t len) -{ - struct aucat_hdl *hdl = (struct aucat_hdl *)sh; - ssize_t n; - - while (hdl->wstate != STATE_DATA) { - switch (hdl->wstate) { - case STATE_IDLE: - if (!aucat_buildmsg(hdl, len)) - return 0; - /* PASSTHROUGH */ - case STATE_MSG: - if (!aucat_wmsg(hdl)) - return 0; - if (hdl->wmsg.cmd == AMSG_DATA) { - hdl->wstate = STATE_DATA; - hdl->wtodo = hdl->wmsg.u.data.size; - } else - hdl->wstate = STATE_IDLE; - break; - default: - DPRINTF("aucat_write: bad state\n"); - abort(); - } - } - if (hdl->maxwrite <= 0) - return 0; - if (len > hdl->maxwrite) - len = hdl->maxwrite; - if (len > hdl->wtodo) - len = hdl->wtodo; - if (len == 0) { - DPRINTF("aucat_write: len == 0\n"); - abort(); - } - while ((n = write(hdl->fd, buf, len)) < 0) { - if (errno == EINTR) - continue; - if (errno != EAGAIN) { - hdl->sio.eof = 1; - DPERROR("aucat_write: write"); - } - return 0; - } - hdl->maxwrite -= n; - DPRINTF("aucat: write: n = %zd, maxwrite = %d\n", n, hdl->maxwrite); - hdl->wtodo -= n; - if (hdl->wtodo == 0) { - hdl->wstate = STATE_IDLE; - hdl->wtodo = 0xdeadbeef; - } - return n; -} - -static int -aucat_pollfd(struct sio_hdl *sh, struct pollfd *pfd, int events) -{ - struct aucat_hdl *hdl = (struct aucat_hdl *)sh; - - hdl->events = events; - if (hdl->maxwrite <= 0) - events &= ~POLLOUT; - if (hdl->rstate == STATE_MSG) - events |= POLLIN; - pfd->fd = hdl->fd; - pfd->events = events; - DPRINTF("aucat: pollfd: %x -> %x\n", hdl->events, pfd->events); - return 1; -} - -static int -aucat_revents(struct sio_hdl *sh, struct pollfd *pfd) -{ - struct aucat_hdl *hdl = (struct aucat_hdl *)sh; - int revents = pfd->revents; - - if (revents & POLLIN) { - while (hdl->rstate == STATE_MSG) { - if (!aucat_runmsg(hdl)) { - revents &= ~POLLIN; - break; - } - } - } - if (revents & POLLOUT) { - if (hdl->maxwrite <= 0) - revents &= ~POLLOUT; - } - if (hdl->sio.eof) - return POLLHUP; - DPRINTF("aucat: revents: %x\n", revents & hdl->events); - return revents & (hdl->events | POLLHUP); -} - -static int -aucat_setvol(struct sio_hdl *sh, unsigned vol) -{ - struct aucat_hdl *hdl = (struct aucat_hdl *)sh; - - hdl->reqvol = vol; - return 1; -} - -static void -aucat_getvol(struct sio_hdl *sh) -{ - struct aucat_hdl *hdl = (struct aucat_hdl *)sh; - - sio_onvol_cb(&hdl->sio, hdl->reqvol); - return; -} |