diff options
Diffstat (limited to 'contrib/ntp/libntp/audio.c')
-rw-r--r-- | contrib/ntp/libntp/audio.c | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/contrib/ntp/libntp/audio.c b/contrib/ntp/libntp/audio.c new file mode 100644 index 000000000000..3228bba62a46 --- /dev/null +++ b/contrib/ntp/libntp/audio.c @@ -0,0 +1,154 @@ +/* + * 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__ */ +} |