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