10 char validaltc[] = "";
18 if(dd == nil || dd->iface == nil || dd->altc == nil)
20 b = (uchar*)&dd->data;
21 if(Subclass(dd->iface->csp) != 2 || b[1] != 0x24 || b[2] != 0x02)
30 minfreq = b[8] | b[9]<<8 | b[10]<<16;
31 maxfreq = b[11] | b[12]<<8 | b[13]<<16;
32 if(minfreq > audiofreq || maxfreq < audiofreq)
37 for(i=0; i<b[7]; i++){
38 freq = b[8+3*i] | b[9+3*i]<<8 | b[10+3*i]<<16;
45 dd->altc->aux = validaltc;
51 fprint(2, "%s devid\n", argv0);
56 main(int argc, char *argv[])
71 if((d = getdev(atoi(*argv))) == nil)
72 sysfatal("getdev: %r");
74 sysfatal("configdev: %r");
78 /* parse descriptors, mark valid altc */
79 for(i = 0; i < nelem(ud->ddesc); i++)
80 parsedescr(ud->ddesc[i]);
82 for(i = 0; i < nelem(ud->ep); i++){
84 if(e && e->iface && e->iface->csp == CSP(Claudio, 2, 0) && e->dir == Eout)
87 sysfatal("no endpoints found");
91 for(i = 0; i < nelem(e->iface->altc); i++){
92 a = e->iface->altc[i];
93 if(a && a->aux == validaltc)
96 sysfatal("no altc found");
99 if(usbcmd(d, Rh2d|Rstd|Riface, Rsetiface, i, e->iface->id, nil, 0) < 0)
100 sysfatal("usbcmd: set altc: %r");
103 b[1] = audiofreq >> 8;
104 b[2] = audiofreq >> 16;
105 if(usbcmd(d, Rh2d|Rclass|Rep, Rsetcur, 0x100, e->addr, b, 3) < 0)
106 fprint(2, "warning: set freq: %r");
108 if((ed = openep(d, e->id)) == nil)
109 sysfatal("openep: %r");
110 devctl(ed, "pollival %d", 1);
111 devctl(ed, "samplesz %d", audiochan*audiores/8);
112 devctl(ed, "hz %d", audiofreq);
114 /* rename endpoint to #u/audio */
115 devctl(ed, "name audio");