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