xref: /freebsd/contrib/ntp/util/audio-pcm.c (revision aa0a1e58)
1 /*
2  * audio-pcm.c - Scope out the PCM audio stuff
3  */
4 #ifdef HAVE_CONFIG_H
5 # include <config.h>
6 #endif
7 
8 #if defined(HAVE_MACHINE_SOUNDCARD_H) || defined(HAVE_SYS_SOUNDCARD_H)
9 
10 #include "audio.h"
11 #include "ntp_stdlib.h"
12 #include "ntp_syslog.h"
13 #ifdef HAVE_UNISTD_H
14 # include <unistd.h>
15 #endif
16 #include <stdio.h>
17 #include "ntp_string.h"
18 
19 #ifdef HAVE_SYS_IOCTL_H
20 #include <sys/ioctl.h>
21 #endif /* HAVE_SYS_IOCTL_H */
22 
23 #include <fcntl.h>
24 
25 #ifdef HAVE_MACHINE_SOUNDCARD_H
26 # include <machine/soundcard.h>
27 # define PCM_STYLE_SOUND
28 #else
29 # ifdef HAVE_SYS_SOUNDCARD_H
30 #  include <sys/soundcard.h>
31 #  define PCM_STYLE_SOUND
32 # endif
33 #endif
34 
35 /*
36  * Global variables
37  */
38 static int ctl_fd;		/* audio control file descriptor */
39 
40 const char *m_names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES ;
41 
42 void
43 d_fmt(
44       unsigned int format
45       )
46 {
47 
48   if (format & AFMT_MU_LAW)	printf("MU_LAW ");
49   if (format & AFMT_A_LAW)	printf("A_LAW ");
50   if (format & AFMT_IMA_ADPCM)	printf("IMA_ADPCM ");
51   if (format & AFMT_U8)		printf("U8 ");
52   if (format & AFMT_S16_LE)	printf("S16_LE ");
53   if (format & AFMT_S16_BE)	printf("S16_BE ");
54   if (format & AFMT_S8)		printf("S8 ");
55   if (format & AFMT_U16_LE)	printf("U16_LE ");
56   if (format & AFMT_U16_BE)	printf("U16_BE ");
57   if (format & AFMT_MPEG)	printf("MPEG ");
58   if (format & AFMT_AC3)	printf("AC3 ");
59   printf("\n");
60 }
61 
62 void
63 d_mixer(
64 	unsigned int mixer
65 	)
66 {
67   int i;
68   int n = 0;
69 
70   for (i = 0; i < SOUND_MIXER_NRDEVICES; ++i)
71     if ((1 << i) & mixer) {
72       if (n)
73 	printf(", ");
74       printf("%s", m_names[i]);
75       n = 1;
76     }
77   printf("\n");
78 }
79 
80 int
81 main( )
82 {
83 	int	unit = 0;	/* device unit (0-3) */
84 # define AI_DEV		"/dev/audio%d"
85 # define AC_DEV		"/dev/mixer%d"
86 	char ai_dev[30];
87 	char ac_dev[30];
88 	struct snd_size s_size;
89 	snd_chan_param s_c_p;
90 	snd_capabilities s_c;
91 	int fd;
92 	int rval;
93 	char *dname = ai_dev;		/* device name */
94 	char *actl = ac_dev;
95 	int devmask = 0, recmask = 0, recsrc = 0;
96 
97 	(void)sprintf(ai_dev, AI_DEV, unit);
98 	(void)sprintf(ac_dev, AC_DEV, unit);
99 
100 	/*
101 	 * Open audio device. Do not complain if not there.
102 	 */
103 	fd = open(dname, O_RDWR | O_NONBLOCK, 0777);
104 	if (fd < 0)
105 		return (fd);
106 
107 	/*
108 	 * Open audio control device.
109 	 */
110 	ctl_fd = open(actl, O_RDWR);
111 	if (ctl_fd < 0) {
112 		fprintf(stderr, "invalid control device <%s>\n", actl);
113 		close(fd);
114 		return(ctl_fd);
115 	}
116 
117 	printf("input:   <%s> %d\n", dname, fd);
118 	printf("control: <%s> %d\n", actl, ctl_fd);
119 
120 	if (ioctl(ctl_fd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1)
121 	    printf("SOUND_MIXER_READ_DEVMASK: %s\n", strerror(errno));
122 	if (ioctl(ctl_fd, SOUND_MIXER_READ_RECMASK, &recmask) == -1)
123 	    printf("SOUND_MIXER_READ_RECMASK: %s\n", strerror(errno));
124 	if (ioctl(ctl_fd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1)
125 	    printf("SOUND_MIXER_READ_RECSRC: %s\n", strerror(errno));
126 
127 	printf("devmask: %#x recmask: %#x recsrc: %#x\n",
128 		devmask, recmask, recsrc);
129 	printf("Devmask: "); d_mixer(devmask);
130 	printf("Recmask: "); d_mixer(recmask);
131 	printf("RecSrc:  "); d_mixer(recsrc);
132 
133 	/*
134 	 * Set audio device parameters.
135 	 */
136 	rval = fd;
137 
138 	if (ioctl(fd, AIOGSIZE, &s_size) == -1)
139 	    printf("AIOGSIZE: %s\n", strerror(errno));
140 	else
141 	    printf("play_size %d, rec_size %d\n",
142 		s_size.play_size, s_size.rec_size);
143 
144 	if (ioctl(fd, AIOGFMT, &s_c_p) == -1)
145 	    printf("AIOGFMT: %s\n", strerror(errno));
146 	else {
147 	  printf("play_rate %lu, rec_rate %lu, play_format %#lx, rec_format %#lx\n",
148 		 s_c_p.play_rate, s_c_p.rec_rate, s_c_p.play_format, s_c_p.rec_format);
149 	  printf("Play format: "); d_fmt(s_c_p.play_format);
150 	  printf("Rec format:  "); d_fmt(s_c_p.rec_format);
151 	}
152 
153 }
154 #endif /* HAVE_{MACHINE_SOUNDCARD,SYS_SOUNDCARD}_H */
155