usb/audio: some things aren't worth knowing [rsc] --rw-rw-r-- M 1635703 sape sys 18208 Feb 23 06:44 sys/src/cmd/usb/audio/audiofs.c /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/audiofs.c:8,13 - /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/audiofs.c:8,15 #include "usbaudio.h" #include "usbaudioctl.h" + int attachok; + #define STACKSIZE 16*1024 enum /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/audiofs.c:154,160 - /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/audiofs.c:156,162 int fd; char buf[32]; - fd = create(name, OWRITE, 0600); + fd = create(name, OWRITE, attachok?0666:0600); if(fd < 0) return; sprint(buf, "%d",srvfd); /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/audiofs.c:271,277 - /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/audiofs.c:273,279 f->flags |= Busy; f->dir = &dirs[Qdir]; rhdr.qid = f->dir->qid; - if(strcmp(thdr.uname, user) != 0) + if(attachok == 0 && strcmp(thdr.uname, user) != 0) return Eperm; return 0; } /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/audiofs.c:386,394 - /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/audiofs.c:388,395 if(f->dir == &dirs[Qaudio] || f->dir == &dirs[Qaudioin]) return Eperm; - if(thdr.mode != OREAD) - if((f->dir->mode & 0x2) == 0) - return Eperm; + if(thdr.mode != OREAD && (f->dir->mode & 0x2) == 0) + return Eperm; qlock(f); if(f->dir == &dirs[Qaudioctl] && f->fiddata == nil) f->fiddata = allocaudioctldata(); [rsc] --rw-rw-r-- M 1635703 sape sys 8085 Feb 23 06:44 sys/src/cmd/usb/audio/audiosub.c /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/audiosub.c:97,102 - /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/audiosub.c:97,135 case 0x04: if (verbose) fprint(2, "Audio Mixer Unit %d\n", b[3]); + if (debug & Dbginfo){ + fprint(2, "\t%d bytes:", nb); + for(ctl = 0; ctl < nb; ctl++) + fprint(2, " 0x%2.2x", b[ctl]); + fprint(2, "\n\tbUnitId %d, bNrInPins %d", b[3], b[4]); + } + if (b[4]){ + if(debug & Dbginfo) fprint(2, ", baSourceIDs: [%d", b[5]); + u = findunit(b[5]); + for (ctl = 1; ctl < b[4]; ctl++){ + if (u < 0) + u = findunit(b[5+ctl]); + else if ((x = findunit(b[5+ctl])) >= 0 && u != x && verbose) + fprint(2, "\tMixer %d for output AND input\n", b[3]); + if (debug & Dbginfo) fprint(2, ", %d", b[5+ctl]); + } + if (debug & Dbginfo) fprint(2, "]\n"); + if (u >= 0){ + units[u][nunits[u]++] = b[3]; + if (mixerid[u] >= 0) + fprint(2, "Second mixer (%d, %d) on %s\n", mixerid[u], b[3], u?"record":"playback"); + mixerid[u] = b[3]; + } + if (debug & Dbginfo){ + fprint(2, "Channels %d, config %d, ", + b[ctl+5], b[ctl+5+1] | b[ctl+5+2] << 8); + x = b[ctl+5] * b[4]; + fprint(2, "programmable: %d bits, 0x", x); + x = (x + 7) >> 3; + while(x--) + fprint(2, "%2.2x", b[ctl+x+5+4]); + } + } break; case 0x05: if (verbose) /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/audiosub.c:104,111 - /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/audiosub.c:137,145 if (debug & Dbginfo) fprint(2, "\tbUnitId %d, bNrInPins %d", b[3], b[4]); if (b[4]){ - if (debug & Dbginfo) fprint(2, ", baSourceIDs: [%d", b[5]); u = findunit(b[5]); + if (debug & Dbginfo) fprint(2, ", baSourceIDs: %s [%d", + u?"record":"playback", b[5]); for (ctl = 1; ctl < b[4]; ctl++){ if (u < 0) u = findunit(b[5+ctl]); [rsc] --rw-rw-r-- M 1635703 sape sys 10155 Feb 23 06:44 sys/src/cmd/usb/audio/usbaudio.c /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/usbaudio.c:252,257 - /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/usbaudio.c:252,258 long volume[8]; Audiocontrol *c; char buf[32], *p, line[256]; + extern int attachok; ctlrno = -1; id = -1; /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/usbaudio.c:281,286 - /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/usbaudio.c:282,290 case 's': srvpost = EARGF(usage()); break; + case 'p': + attachok++; + break; default: usage(); }ARGEND /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/usbaudio.c:329,334 - /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/usbaudio.c:333,341 findendpoints(); if (endpt[Play] >= 0){ + if(verbose) + fprint(2, "Setting default play parameters: %d Hz, %d channels at %d bits\n", + defaultspeed[Play], 2, 16); if(findalt(Play, 2, 16, defaultspeed[Play]) < 0){ if(findalt(Play, 2, 16, 48000) < 0) sysfatal("Can't configure playout for %d or %d Hz", defaultspeed[Play], 48000); /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/usbaudio.c:345,350 - /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/usbaudio.c:352,360 } if (endpt[Record] >= 0){ + if(verbose) + fprint(2, "Setting default record parameters: %d Hz, %d channels at %d bits\n", + defaultspeed[Play], 2, 16); if(findalt(Record, 2, 16, defaultspeed[Record]) < 0){ if(findalt(Record, 2, 16, 48000) < 0) sysfatal("Can't configure record for %d or %d Hz", defaultspeed[Record], 48000); [rsc] --rw-rw-r-- M 1635703 sape sys 1889 Feb 23 06:44 sys/src/cmd/usb/audio/usbaudio.h /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/usbaudio.h:13,22 - /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/usbaudio.h:13,24 Delay_control = 0x08, Bassboost_control = 0x09, Loudness_control = 0x0a, - /* Items below are define by implementation: */ + /* Items below are defined by implementation: */ Channel_control = 0x0b, Resolution_control = 0x0c, Ncontrol, + Selector_control = 0x0d, + sampling_freq_control = 0x01, }; [rsc] --rw-rw-r-- M 1635703 sape sys 18245 Feb 23 06:44 sys/src/cmd/usb/audio/usbaudioctl.c [diffs elided - too long] [diff -c /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/usbaudioctl.c /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/usbaudioctl.c] [rsc] --rw-rw-r-- M 1635703 sape sys 618 Feb 23 06:44 sys/src/cmd/usb/audio/usbaudioctl.h /n/sourcesdump/2006/0223/plan9/sys/src/cmd/usb/audio/usbaudioctl.h:7,26 - /n/sourcesdump/2006/0224/plan9/sys/src/cmd/usb/audio/usbaudioctl.h:7,26 typedef struct Audiocontrol Audiocontrol; struct Audiocontrol { - char *name; + char *name; uchar readable; uchar settable; uchar chans; /* 0 is master, non-zero is bitmap */ - long value[8]; /* 0 is master; value[0] == Undef -> all values Undef */ - long min, max, step; + long value[8]; /* 0 is master; value[0] == Undef -> all values Undef */ + long min, max, step; }; - extern Audiocontrol controls[2][Ncontrol]; extern int endpt[2]; extern int interface[2]; extern int featureid[2]; extern int selectorid[2]; + extern int mixerid[2]; extern int buttonendpt; int ctlparse(char *s, Audiocontrol *c, long *v);