freebsd_amp_hwpstate/contrib/ntp/libntp/audio.c

155 lines
3.6 KiB
C

/*
* audio.c - audio interface for reference clock audio drivers
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "audio.h"
#include <unistd.h>
#include <stdio.h>
#ifdef HAVE_SYS_AUDIOIO_H
#include <sys/audioio.h>
#endif /* HAVE_SYS_AUDIOIO_H */
#ifdef HAVE_SUN_AUDIOIO_H
#include <sun/audioio.h>
#endif /* HAVE_SUN_AUDIOIO_H */
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif /* HAVE_SYS_IOCTL_H */
#include <fcntl.h>
/*
* Global variables
*/
#ifdef HAVE_SYS_AUDIOIO_H
static struct audio_device device; /* audio device ident */
static struct audio_info info; /* audio device info */
static int ctl_fd; /* audio control file descriptor */
#endif /* HAVE_SYS_AUDIOIO_H */
/*
* audio_init - open and initialize audio device
*
* This code works with SunOS 4.x and Solaris 2.x; however, it is
* believed generic and applicable to other systems with a minor twid
* or two. All it does is open the device, set the buffer size (Solaris
* only), preset the gain and set the input port. It assumes that the
* codec sample rate (8000 Hz), precision (8 bits), number of channels
* (1) and encoding (ITU-T G.711 mu-law companded) have been set by
* default.
*/
int
audio_init(void)
{
int fd;
#ifdef HAVE_SYS_AUDIOIO_H
int rval;
#endif /* HAVE_SYS_AUDIOIO_H */
/*
* Open audio device
*/
fd = open("/dev/audio", O_RDWR | O_NONBLOCK, 0777);
if (fd < 0) {
perror("audio:");
return (fd);
}
#ifdef HAVE_SYS_AUDIOIO_H
/*
* Open audio control device
*/
ctl_fd = open("/dev/audioctl", O_RDWR);
if (ctl_fd < 0) {
perror("audioctl:");
close(fd);
return(ctl_fd);
}
/*
* Set audio device parameters.
*/
rval = audio_gain((AUDIO_MAX_GAIN - AUDIO_MIN_GAIN) / 2,
AUDIO_MICROPHONE);
if (rval < 0) {
close(ctl_fd);
close(fd);
return(rval);
}
#endif /* HAVE_SYS_AUDIOIO_H */
return (fd);
}
/*
* audio_gain - adjust codec gain and port
*/
int
audio_gain(
int gain, /* gain 0-255 */
int port /* port */
)
{
#ifdef HAVE_SYS_AUDIOIO_H
int rval;
#endif /* HAVE_SYS_AUDIOIO_H */
#ifdef HAVE_SYS_AUDIOIO_H
AUDIO_INITINFO(&info);
info.record.buffer_size = AUDIO_BUFSIZ;
info.record.gain = gain;
info.record.port = port;
info.record.error = 0;
rval = ioctl(ctl_fd, (int)AUDIO_SETINFO, &info);
if (rval < 0) {
perror("audio:");
return (rval);
}
return (info.record.error);
#else
return (0);
#endif /* HAVE_SYS_AUDIOIO_H */
}
/*
* audio_show - display audio parameters
*
* This code doesn't really do anything, except satisfy curiousity and
* verify the ioctl's work.
*/
void
audio_show(void)
{
#ifdef HAVE_SYS_AUDIOIO_H
ioctl(ctl_fd, (int)AUDIO_GETDEV, &device);
printf("audio: name %s, version %s, config %s\n",
device.name, device.version, device.config);
ioctl(ctl_fd, (int)AUDIO_GETINFO, &info);
printf(
"audio: samples %d, channels %d, precision %d, encoding %d\n",
info.record.sample_rate, info.record.channels,
info.record.precision, info.record.encoding);
printf("audio: gain %d, port %d, buffer %d\n",
info.record.gain, info.record.port,
info.record.buffer_size);
printf("audio: gain %d, port %d\n",
info.record.gain, info.record.port);
printf(
"audio: samples %d, eof %d, pause %d, error %d, waiting %d, balance %d\n",
info.record.samples, info.record.eof,
info.record.pause, info.record.error,
info.record.waiting, info.record.balance);
printf("audio: monitor %d, muted %d\n",
info.monitor_gain, info.output_muted);
#endif /* HAVE_SYS_AUDIOIO_H */
#ifdef __NetBSD__
printf("audio: monitor %d, blocksize %d, hiwat %d, lowat %d, mode %d\n",
info.monitor_gain, info.blocksize, info.hiwat, info.lowat, info.mode);
#endif /* __NetBSD__ */
}