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