xref: /openbsd/regress/lib/libsndio/cap/cap.c (revision 17df1aa7)
1 #include <errno.h>
2 #include <fcntl.h>
3 #include <poll.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8 #include <sndio.h>
9 
10 struct sio_par par;
11 struct sio_cap cap;
12 
13 void
14 pr_enc(struct sio_enc *enc)
15 {
16 	fprintf(stderr, "%s%d", enc->sig ? "s" : "u", enc->bits);
17 	if (enc->bps > 1)
18 		fprintf(stderr, "%s", enc->le ? "le" : "be");
19 	if (enc->bps != SIO_BPS(enc->bits))
20 		fprintf(stderr, "%d%s", enc->bps, enc->msb ? "msb" : "lsb");
21 }
22 
23 void
24 cap_pr(struct sio_cap *cap)
25 {
26 	unsigned n, i;
27 
28 	for (n = 0; n < cap->nconf; n++) {
29 		fprintf(stderr, "config %d\n", n);
30 		fprintf(stderr, "\tenc:");
31 		for (i = 0; i < SIO_NENC; i++) {
32 			if (cap->confs[n].enc & (1 << i)) {
33 				fprintf(stderr, " ");
34 				pr_enc(&cap->enc[i]);
35 			}
36 		}
37 		fprintf(stderr, "\n\tpchan:");
38 		for (i = 0; i < SIO_NCHAN; i++) {
39 			if (cap->confs[n].pchan & (1 << i))
40 				fprintf(stderr, " %d", cap->pchan[i]);
41 		}
42 		fprintf(stderr, "\n\trchan:");
43 		for (i = 0; i < SIO_NCHAN; i++) {
44 			if (cap->confs[n].rchan & (1 << i))
45 				fprintf(stderr, " %d", cap->rchan[i]);
46 		}
47 		fprintf(stderr, "\n\trate:");
48 		for (i = 0; i < SIO_NRATE; i++) {
49 			if (cap->confs[n].rate & (1 << i))
50 				fprintf(stderr, " %d", cap->rate[i]);
51 		}
52 		fprintf(stderr, "\n");
53 	}
54 }
55 
56 void
57 usage(void) {
58 	fprintf(stderr, "usage: cap [-pr]\n");
59 }
60 
61 int
62 main(int argc, char **argv) {
63 	int ch;
64 	unsigned mode = SIO_PLAY | SIO_REC;
65 	struct sio_hdl *hdl;
66 
67 	while ((ch = getopt(argc, argv, "pr")) != -1) {
68 		switch(ch) {
69 		case 'p':
70 			mode &= ~SIO_REC;
71 			break;
72 		case 'r':
73 			mode &= ~SIO_PLAY;
74 			break;
75 		default:
76 			usage();
77 			exit(1);
78 			break;
79 		}
80 	}
81 	if (mode == 0) {
82 		fprintf(stderr, "-p and -r flags are mutualy exclusive\n");
83 		exit(1);
84 	}
85 	hdl = sio_open(NULL, mode, 0);
86 	if (hdl == NULL) {
87 		fprintf(stderr, "sio_open() failed\n");
88 		exit(1);
89 	}
90 	if (!sio_getcap(hdl, &cap)) {
91 		fprintf(stderr, "sio_setcap() failed\n");
92 		exit(1);
93 	}
94 	cap_pr(&cap);
95 	sio_close(hdl);
96 	return 0;
97 }
98