openbsd-ports/audio/flite/files/au_sndio.c
jakemsr e845b6c545 - sndio instead of audio(4)
- cleanup & modernize:
remove bouncing maintainer contact, remove nop patch, regen patches,
@bin markers
2009-12-14 00:33:08 +00:00

122 lines
2.5 KiB
C

/*
* Copyright (c) 2009 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 <sndio.h>
#include "cst_string.h"
#include "cst_audio.h"
cst_audiodev *
audio_open_sndio(int sps, int channels, cst_audiofmt fmt)
{
struct sio_par par;
struct sio_hdl *hdl;
cst_audiodev *ad;
hdl = sio_open(NULL, SIO_PLAY, 0);
if (hdl == NULL) {
cst_errmsg("sndio_audio: failed to open audio device\n");
cst_error();
}
sio_initpar(&par);
switch (fmt) {
case CST_AUDIO_LINEAR16:
par.bits = 16;
par.sig = 1;
break;
case CST_AUDIO_LINEAR8:
par.bits = 8;
par.sig = 0;
break;
default:
cst_errmsg("sndio_audio: invalid format\n");
cst_error();
}
par.pchan = 1;
par.rate = sps;
if (!sio_setpar(hdl, &par)) {
cst_errmsg("sndio_audio: failed to set audio params\n");
cst_error();
}
if (!sio_getpar(hdl, &par)) {
cst_errmsg("sndio_audio: failed to get audio params\n");
cst_error();
}
ad = cst_alloc(cst_audiodev, 1);
ad->sps = sps;
ad->real_sps = par.rate;
ad->channels = channels;
ad->real_channels = par.pchan;
ad->fmt = fmt;
if (par.sig == 1 && par.bits == 16)
ad->real_fmt = CST_AUDIO_LINEAR16;
else if (par.sig == 0 && par.bits == 8)
ad->real_fmt = CST_AUDIO_LINEAR8;
else {
cst_errmsg("sndio_audio: returned audio format unsupported\n");
cst_free(ad);
cst_error();
}
if (!sio_start(hdl)) {
cst_errmsg("sndio_audio: start failed\n");
cst_free(ad);
cst_error();
}
ad->platform_data = hdl;
return ad;
}
int
audio_close_sndio(cst_audiodev *ad)
{
if (ad == NULL)
return 0;
sio_close(ad->platform_data);
cst_free(ad);
return 0;
}
int
audio_write_sndio(cst_audiodev *ad, void *samples, int num_bytes)
{
return sio_write(ad->platform_data, samples, num_bytes);
}
int
audio_flush_sndio(cst_audiodev *ad)
{
return 0;
}
int
audio_drain_sndio(cst_audiodev *ad)
{
return 0;
}