xref: /freebsd/contrib/ntp/util/audio-pcm.c (revision 9c2daa00)
19c2daa00SOllivier Robert /*
29c2daa00SOllivier Robert  * audio-pcm.c - Scope out the PCM audio stuff
39c2daa00SOllivier Robert  */
49c2daa00SOllivier Robert #ifdef HAVE_CONFIG_H
59c2daa00SOllivier Robert # include <config.h>
69c2daa00SOllivier Robert #endif
79c2daa00SOllivier Robert 
89c2daa00SOllivier Robert #if defined(HAVE_MACHINE_SOUNDCARD_H) || defined(HAVE_SYS_SOUNDCARD_H)
99c2daa00SOllivier Robert 
109c2daa00SOllivier Robert #include "audio.h"
119c2daa00SOllivier Robert #include "ntp_stdlib.h"
129c2daa00SOllivier Robert #include "ntp_syslog.h"
139c2daa00SOllivier Robert #ifdef HAVE_UNISTD_H
149c2daa00SOllivier Robert # include <unistd.h>
159c2daa00SOllivier Robert #endif
169c2daa00SOllivier Robert #include <stdio.h>
179c2daa00SOllivier Robert #include "ntp_string.h"
189c2daa00SOllivier Robert 
199c2daa00SOllivier Robert #ifdef HAVE_SYS_IOCTL_H
209c2daa00SOllivier Robert #include <sys/ioctl.h>
219c2daa00SOllivier Robert #endif /* HAVE_SYS_IOCTL_H */
229c2daa00SOllivier Robert 
239c2daa00SOllivier Robert #include <fcntl.h>
249c2daa00SOllivier Robert 
259c2daa00SOllivier Robert #ifdef HAVE_MACHINE_SOUNDCARD_H
269c2daa00SOllivier Robert # include <machine/soundcard.h>
279c2daa00SOllivier Robert # define PCM_STYLE_SOUND
289c2daa00SOllivier Robert #else
299c2daa00SOllivier Robert # ifdef HAVE_SYS_SOUNDCARD_H
309c2daa00SOllivier Robert #  include <sys/soundcard.h>
319c2daa00SOllivier Robert #  define PCM_STYLE_SOUND
329c2daa00SOllivier Robert # endif
339c2daa00SOllivier Robert #endif
349c2daa00SOllivier Robert 
359c2daa00SOllivier Robert /*
369c2daa00SOllivier Robert  * Global variables
379c2daa00SOllivier Robert  */
389c2daa00SOllivier Robert static int ctl_fd;		/* audio control file descriptor */
399c2daa00SOllivier Robert 
409c2daa00SOllivier Robert const char *m_names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES ;
419c2daa00SOllivier Robert 
429c2daa00SOllivier Robert void
d_fmt(unsigned int format)439c2daa00SOllivier Robert d_fmt(
449c2daa00SOllivier Robert       unsigned int format
459c2daa00SOllivier Robert       )
469c2daa00SOllivier Robert {
479c2daa00SOllivier Robert 
489c2daa00SOllivier Robert   if (format & AFMT_MU_LAW)	printf("MU_LAW ");
499c2daa00SOllivier Robert   if (format & AFMT_A_LAW)	printf("A_LAW ");
509c2daa00SOllivier Robert   if (format & AFMT_IMA_ADPCM)	printf("IMA_ADPCM ");
519c2daa00SOllivier Robert   if (format & AFMT_U8)		printf("U8 ");
529c2daa00SOllivier Robert   if (format & AFMT_S16_LE)	printf("S16_LE ");
539c2daa00SOllivier Robert   if (format & AFMT_S16_BE)	printf("S16_BE ");
549c2daa00SOllivier Robert   if (format & AFMT_S8)		printf("S8 ");
559c2daa00SOllivier Robert   if (format & AFMT_U16_LE)	printf("U16_LE ");
569c2daa00SOllivier Robert   if (format & AFMT_U16_BE)	printf("U16_BE ");
579c2daa00SOllivier Robert   if (format & AFMT_MPEG)	printf("MPEG ");
589c2daa00SOllivier Robert   if (format & AFMT_AC3)	printf("AC3 ");
599c2daa00SOllivier Robert   printf("\n");
609c2daa00SOllivier Robert }
619c2daa00SOllivier Robert 
629c2daa00SOllivier Robert void
d_mixer(unsigned int mixer)639c2daa00SOllivier Robert d_mixer(
649c2daa00SOllivier Robert 	unsigned int mixer
659c2daa00SOllivier Robert 	)
669c2daa00SOllivier Robert {
679c2daa00SOllivier Robert   int i;
689c2daa00SOllivier Robert   int n = 0;
699c2daa00SOllivier Robert 
709c2daa00SOllivier Robert   for (i = 0; i < SOUND_MIXER_NRDEVICES; ++i)
719c2daa00SOllivier Robert     if ((1 << i) & mixer) {
729c2daa00SOllivier Robert       if (n)
739c2daa00SOllivier Robert 	printf(", ");
749c2daa00SOllivier Robert       printf("%s", m_names[i]);
759c2daa00SOllivier Robert       n = 1;
769c2daa00SOllivier Robert     }
779c2daa00SOllivier Robert   printf("\n");
789c2daa00SOllivier Robert }
799c2daa00SOllivier Robert 
809c2daa00SOllivier Robert int
main()819c2daa00SOllivier Robert main( )
829c2daa00SOllivier Robert {
839c2daa00SOllivier Robert 	int	unit = 0;	/* device unit (0-3) */
849c2daa00SOllivier Robert # define AI_DEV		"/dev/audio%d"
859c2daa00SOllivier Robert # define AC_DEV		"/dev/mixer%d"
869c2daa00SOllivier Robert 	char ai_dev[30];
879c2daa00SOllivier Robert 	char ac_dev[30];
889c2daa00SOllivier Robert 	struct snd_size s_size;
899c2daa00SOllivier Robert 	snd_chan_param s_c_p;
909c2daa00SOllivier Robert 	snd_capabilities s_c;
919c2daa00SOllivier Robert 	int fd;
929c2daa00SOllivier Robert 	int rval;
939c2daa00SOllivier Robert 	char *dname = ai_dev;		/* device name */
949c2daa00SOllivier Robert 	char *actl = ac_dev;
959c2daa00SOllivier Robert 	int devmask = 0, recmask = 0, recsrc = 0;
969c2daa00SOllivier Robert 
979c2daa00SOllivier Robert 	snprintf(ai_dev, sizeof(ai_dev), AI_DEV, unit);
989c2daa00SOllivier Robert 	snprintf(ac_dev, sizeof(ac_dev), AC_DEV, unit);
999c2daa00SOllivier Robert 
1009c2daa00SOllivier Robert 	/*
1019c2daa00SOllivier Robert 	 * Open audio device. Do not complain if not there.
1029c2daa00SOllivier Robert 	 */
1039c2daa00SOllivier Robert 	fd = open(dname, O_RDWR | O_NONBLOCK, 0777);
1049c2daa00SOllivier Robert 	if (fd < 0)
1059c2daa00SOllivier Robert 		return (fd);
1069c2daa00SOllivier Robert 
1079c2daa00SOllivier Robert 	/*
1089c2daa00SOllivier Robert 	 * Open audio control device.
1099c2daa00SOllivier Robert 	 */
1109c2daa00SOllivier Robert 	ctl_fd = open(actl, O_RDWR);
1119c2daa00SOllivier Robert 	if (ctl_fd < 0) {
1129c2daa00SOllivier Robert 		fprintf(stderr, "invalid control device <%s>\n", actl);
1139c2daa00SOllivier Robert 		close(fd);
1149c2daa00SOllivier Robert 		return(ctl_fd);
1159c2daa00SOllivier Robert 	}
1169c2daa00SOllivier Robert 
1179c2daa00SOllivier Robert 	printf("input:   <%s> %d\n", dname, fd);
1189c2daa00SOllivier Robert 	printf("control: <%s> %d\n", actl, ctl_fd);
1199c2daa00SOllivier Robert 
1209c2daa00SOllivier Robert 	if (ioctl(ctl_fd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1)
1219c2daa00SOllivier Robert 	    printf("SOUND_MIXER_READ_DEVMASK: %s\n", strerror(errno));
1229c2daa00SOllivier Robert 	if (ioctl(ctl_fd, SOUND_MIXER_READ_RECMASK, &recmask) == -1)
1239c2daa00SOllivier Robert 	    printf("SOUND_MIXER_READ_RECMASK: %s\n", strerror(errno));
1249c2daa00SOllivier Robert 	if (ioctl(ctl_fd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1)
1259c2daa00SOllivier Robert 	    printf("SOUND_MIXER_READ_RECSRC: %s\n", strerror(errno));
1269c2daa00SOllivier Robert 
1279c2daa00SOllivier Robert 	printf("devmask: %#x recmask: %#x recsrc: %#x\n",
1289c2daa00SOllivier Robert 		devmask, recmask, recsrc);
1299c2daa00SOllivier Robert 	printf("Devmask: "); d_mixer(devmask);
1309c2daa00SOllivier Robert 	printf("Recmask: "); d_mixer(recmask);
1319c2daa00SOllivier Robert 	printf("RecSrc:  "); d_mixer(recsrc);
1329c2daa00SOllivier Robert 
1339c2daa00SOllivier Robert 	/*
1349c2daa00SOllivier Robert 	 * Set audio device parameters.
1359c2daa00SOllivier Robert 	 */
1369c2daa00SOllivier Robert 	rval = fd;
1379c2daa00SOllivier Robert 
1389c2daa00SOllivier Robert 	if (ioctl(fd, AIOGSIZE, &s_size) == -1)
1399c2daa00SOllivier Robert 	    printf("AIOGSIZE: %s\n", strerror(errno));
1409c2daa00SOllivier Robert 	else
1419c2daa00SOllivier Robert 	    printf("play_size %d, rec_size %d\n",
1429c2daa00SOllivier Robert 		s_size.play_size, s_size.rec_size);
1439c2daa00SOllivier Robert 
1449c2daa00SOllivier Robert 	if (ioctl(fd, AIOGFMT, &s_c_p) == -1)
1459c2daa00SOllivier Robert 	    printf("AIOGFMT: %s\n", strerror(errno));
1469c2daa00SOllivier Robert 	else {
1479c2daa00SOllivier Robert 	  printf("play_rate %lu, rec_rate %lu, play_format %#lx, rec_format %#lx\n",
1489c2daa00SOllivier Robert 		 s_c_p.play_rate, s_c_p.rec_rate, s_c_p.play_format, s_c_p.rec_format);
1499c2daa00SOllivier Robert 	  printf("Play format: "); d_fmt(s_c_p.play_format);
1509c2daa00SOllivier Robert 	  printf("Rec format:  "); d_fmt(s_c_p.rec_format);
1519c2daa00SOllivier Robert 	}
1529c2daa00SOllivier Robert 
1539c2daa00SOllivier Robert }
1549c2daa00SOllivier Robert #endif /* HAVE_{MACHINE_SOUNDCARD,SYS_SOUNDCARD}_H */
155