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