From 4eb398d0af04e27327d0482bf1917066420b97a2 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 22 Jun 2013 20:16:20 +0000 Subject: Switch to X11 --- sio.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 sio.c (limited to 'sio.c') diff --git a/sio.c b/sio.c new file mode 100644 index 0000000..8776930 --- /dev/null +++ b/sio.c @@ -0,0 +1,92 @@ +/* $Id$ */ +/* + * Copyright (c) 2013 Dimitri Sokolyuk + * + * 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 +#include +#include + +struct sio { + struct sio_hdl *sio; + struct sio_par par; +}; + +struct sio * +init_sio(int rchan, int bits, int sig) +{ + struct sio *sio; + + sio = malloc(sizeof(struct sio)); + if (!sio) + errx(1, "malloc failed"); + + sio->sio = sio_open(NULL, SIO_REC, 0); + + if (!sio->sio) + errx(1, "cannot connect to sound server, is it running?"); + + sio_initpar(&sio->par); + + sio->par.rchan = rchan; + sio->par.bits = bits; + sio->par.le = SIO_LE_NATIVE; + sio->par.sig = sig; + + if (!sio_setpar(sio->sio, &sio->par)) + errx(1, "SIO set params failed"); + if (!sio_getpar(sio->sio, &sio->par)) + errx(1, "SIO get params failed"); + + if (sio->par.rchan != rchan || + sio->par.bits != bits || + sio->par.le != SIO_LE_NATIVE || + sio->par.sig != sig) + errx(1, "unsupported audio params"); + + sio_start(sio->sio); + + return sio; +} + +unsigned int +get_round(struct sio *sio) +{ + return sio->par.round; +} + +int +read_sio(struct sio *sio, int16_t *buffer, size_t sz) +{ + int done = 0; + + do { + done += sio_read(sio->sio, buffer, sz); + if (sio_eof(sio->sio)) + errx(1, "SIO EOF"); + buffer += done; + sz -= done; + } while (sz); + + return done; +} + +void +del_sio(struct sio *sio) +{ + sio_stop(sio->sio); + sio_close(sio->sio); + free(sio); +} -- cgit v1.2.3