openbsd-ports/audio/esound/files/audio_sndio.c
jakemsr 2eebabbd75 - update to 0.2.41
- replace audio(4) backend with sio_open(3) (libsndio) backend

update by ajacoutot, new backend from me
2008-12-20 08:58:32 +00:00

135 lines
3.4 KiB
C

/* $OpenBSD: audio_sndio.c,v 1.1 2008/12/20 08:58:32 jakemsr Exp $ */
/*
* Copyright (c) 2008 Jacob Meuser <jakemsr@sdf.lonestar.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 "config.h"
#include <sndio.h>
struct sio_hdl *hdl = NULL;
#define ARCH_esd_audio_close
void esd_audio_close()
{
if (hdl != NULL) {
sio_close(hdl);
hdl = NULL;
}
}
#define ARCH_esd_audio_open
int esd_audio_open()
{
char *device;
struct sio_par par;
int mode = SIO_PLAY;
if (hdl != NULL) {
fprintf(stderr, "sndio already opened\n");
return(1);
}
sio_initpar(&par);
if ((esd_audio_format & ESD_MASK_FUNC) == ESD_RECORD)
mode |= SIO_REC;
device = esd_audio_device ? esd_audio_device : getenv("AUDIODEVICE");
if ((hdl = sio_open(device, mode, 0)) == NULL) {
fprintf(stderr, "sio_open failed\n");
goto bad;
}
par.le = (BYTE_ORDER == 4321) ? 0 : 1;
if ((esd_audio_format & ESD_MASK_BITS) == ESD_BITS16) {
par.bits = 16;
par.sig = 1;
} else {
par.bits = 8;
par.sig = 0;
}
par.pchan = (((esd_audio_format & ESD_MASK_CHAN) == ESD_STEREO) ? 2 : 1);
if (mode & SIO_REC)
par.rchan = par.pchan;
par.appbufsz = ESD_BUF_SIZE;
par.rate = esd_audio_rate;
if (!sio_setpar(hdl, &par)) {
fprintf(stderr, "sio_setpar failed\n");
goto bad;
}
if (!sio_getpar(hdl, &par)) {
fprintf(stderr, "sio_getpar failed\n");
goto bad;
}
/* check that the actual parameters are what we asked for */
if (fabs(par.rate - esd_audio_rate) > esd_audio_rate * 0.05) {
fprintf(stderr, "Unsupported rate: %i Hz\n", esd_audio_rate);
goto bad;
}
if ((esd_audio_format & ESD_MASK_BITS) == ESD_BITS16) {
if (par.sig != 1 || par.bits != 16) {
fprintf(stderr, "Unsupported bits: 16\n");
goto bad;
}
} else {
if (par.sig != 0 || par.bits != 8) {
fprintf(stderr, "Unsupported bits: 8\n");
goto bad;
}
}
if ((esd_audio_format & ESD_MASK_CHAN) == ESD_STEREO) {
if (par.pchan != 2) {
fprintf(stderr, "Unsupported channels: 2\n");
goto bad;
}
} else {
if (par.pchan != 1) {
fprintf(stderr, "Unsupported channels: 1\n");
goto bad;
}
}
if (!sio_start(hdl)) {
fprintf(stderr, "sio_start failed\n");
goto bad;
}
return(1);
bad:
esd_audio_close();
return(-1);
}
#define ARCH_esd_audio_write
int esd_audio_write(void *buffer, int buf_size)
{
return sio_write(hdl, buffer, buf_size);
}
#define ARCH_esd_audio_read
int esd_audio_read(void *buffer, int buf_size)
{
return sio_read(hdl, buffer, buf_size);
}