diff options
Diffstat (limited to 'util/audio-pcm.c')
-rw-r--r-- | util/audio-pcm.c | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/util/audio-pcm.c b/util/audio-pcm.c new file mode 100644 index 0000000..6f2e4fa --- /dev/null +++ b/util/audio-pcm.c @@ -0,0 +1,154 @@ +/* + * audio-pcm.c - Scope out the PCM audio stuff + */ +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if defined(HAVE_MACHINE_SOUNDCARD_H) || defined(HAVE_SYS_SOUNDCARD_H) + +#include "audio.h" +#include "ntp_stdlib.h" +#include "ntp_syslog.h" +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif +#include <stdio.h> +#include "ntp_string.h" + +#ifdef HAVE_SYS_IOCTL_H +#include <sys/ioctl.h> +#endif /* HAVE_SYS_IOCTL_H */ + +#include <fcntl.h> + +#ifdef HAVE_MACHINE_SOUNDCARD_H +# include <machine/soundcard.h> +# define PCM_STYLE_SOUND +#else +# ifdef HAVE_SYS_SOUNDCARD_H +# include <sys/soundcard.h> +# define PCM_STYLE_SOUND +# endif +#endif + +/* + * Global variables + */ +static int ctl_fd; /* audio control file descriptor */ + +const char *m_names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES ; + +void +d_fmt( + unsigned int format + ) +{ + + if (format & AFMT_MU_LAW) printf("MU_LAW "); + if (format & AFMT_A_LAW) printf("A_LAW "); + if (format & AFMT_IMA_ADPCM) printf("IMA_ADPCM "); + if (format & AFMT_U8) printf("U8 "); + if (format & AFMT_S16_LE) printf("S16_LE "); + if (format & AFMT_S16_BE) printf("S16_BE "); + if (format & AFMT_S8) printf("S8 "); + if (format & AFMT_U16_LE) printf("U16_LE "); + if (format & AFMT_U16_BE) printf("U16_BE "); + if (format & AFMT_MPEG) printf("MPEG "); + if (format & AFMT_AC3) printf("AC3 "); + printf("\n"); +} + +void +d_mixer( + unsigned int mixer + ) +{ + int i; + int n = 0; + + for (i = 0; i < SOUND_MIXER_NRDEVICES; ++i) + if ((1 << i) & mixer) { + if (n) + printf(", "); + printf("%s", m_names[i]); + n = 1; + } + printf("\n"); +} + +int +main( ) +{ + int unit = 0; /* device unit (0-3) */ +# define AI_DEV "/dev/audio%d" +# define AC_DEV "/dev/mixer%d" + char ai_dev[30]; + char ac_dev[30]; + struct snd_size s_size; + snd_chan_param s_c_p; + snd_capabilities s_c; + int fd; + int rval; + char *dname = ai_dev; /* device name */ + char *actl = ac_dev; + int devmask = 0, recmask = 0, recsrc = 0; + + (void)sprintf(ai_dev, AI_DEV, unit); + (void)sprintf(ac_dev, AC_DEV, unit); + + /* + * Open audio device. Do not complain if not there. + */ + fd = open(dname, O_RDWR | O_NONBLOCK, 0777); + if (fd < 0) + return (fd); + + /* + * Open audio control device. + */ + ctl_fd = open(actl, O_RDWR); + if (ctl_fd < 0) { + fprintf(stderr, "invalid control device <%s>\n", actl); + close(fd); + return(ctl_fd); + } + + printf("input: <%s> %d\n", dname, fd); + printf("control: <%s> %d\n", actl, ctl_fd); + + if (ioctl(ctl_fd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1) + printf("SOUND_MIXER_READ_DEVMASK: %s\n", strerror(errno)); + if (ioctl(ctl_fd, SOUND_MIXER_READ_RECMASK, &recmask) == -1) + printf("SOUND_MIXER_READ_RECMASK: %s\n", strerror(errno)); + if (ioctl(ctl_fd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1) + printf("SOUND_MIXER_READ_RECSRC: %s\n", strerror(errno)); + + printf("devmask: %#x recmask: %#x recsrc: %#x\n", + devmask, recmask, recsrc); + printf("Devmask: "); d_mixer(devmask); + printf("Recmask: "); d_mixer(recmask); + printf("RecSrc: "); d_mixer(recsrc); + + /* + * Set audio device parameters. + */ + rval = fd; + + if (ioctl(fd, AIOGSIZE, &s_size) == -1) + printf("AIOGSIZE: %s\n", strerror(errno)); + else + printf("play_size %d, rec_size %d\n", + s_size.play_size, s_size.rec_size); + + if (ioctl(fd, AIOGFMT, &s_c_p) == -1) + printf("AIOGFMT: %s\n", strerror(errno)); + else { + printf("play_rate %lu, rec_rate %lu, play_format %#lx, rec_format %#lx\n", + s_c_p.play_rate, s_c_p.rec_rate, s_c_p.play_format, s_c_p.rec_format); + printf("Play format: "); d_fmt(s_c_p.play_format); + printf("Rec format: "); d_fmt(s_c_p.rec_format); + } + +} +#endif /* HAVE_{MACHINE_SOUNDCARD,SYS_SOUNDCARD}_H */ |