📄 usbaudioctl.c
字号:
return -1; return 0; } if (c->value[0] != value[0]) return -1; return 0; } if (c->chans){ value[0] = 0; // set to average m = 0; for (i = 1; i < 8; i++) if (c->chans & 1 << i){ if (c->min != Undef && value[i] < c->min) value[i] = c->min; if (c->max != Undef && value[i] > c->max) value[i] = c->max; value[0] += value[i]; m++; } else value[i] = Undef; if (m) value[0] /= m; }else{ if (c->min != Undef && value[0] < c->min) value[0] = c->min; if (c->max != Undef && value[0] > c->max) value[0] = c->max; } req = SET_CUR; count = 1; switch(ctl){ default: if (debug & Dbgcontrol) fprint(2, "setcontrol: can't happen\n"); return -1; case Speed_control: if ((value[0] = setspeed(rec, value[0])) < 0) return -1; c->value[0] = value[0]; return 0; case Equalizer_control: /* not implemented */ return -1; case Resolution_control: control = findalt(rec, controls[rec][Channel_control].value[0], value[0], defaultspeed[rec]); if(control < 0 || setaudioalt(rec, c, control) < 0){ if (debug & Dbgcontrol) fprint(2, "setcontrol: can't find setting for %s\n", c->name); return -1; } c->value[0] = value[0]; controls[rec][Speed_control].value[0] = defaultspeed[rec]; return 0; case Volume_control: case Delay_control: count = 2; /* fall through */ case Mute_control: case Bass_control: case Mid_control: case Treble_control: case Agc_control: case Bassboost_control: case Loudness_control: type = RH2D|Rclass|Rinterface; control = ctl<<8; index = featureid[rec]<<8; break; case Selector_control: type = RH2D|Rclass|Rinterface; control = ctl<<8; index = selectorid[rec]; break; case Channel_control: control = findalt(rec, value[0], controls[rec][Resolution_control].value[0], defaultspeed[rec]); if(control < 0 || setaudioalt(rec, c, control) < 0){ if (debug & Dbgcontrol) fprint(2, "setcontrol: can't find setting for %s\n", c->name); return -1; } c->value[0] = value[0]; controls[rec][Speed_control].value[0] = defaultspeed[rec]; return 0; } if(c->chans){ for (i = 1; i < 8; i++) if (c->chans & 1 << i){ switch(count){ case 2: buf[1] = value[i] >> 8; case 1: buf[0] = value[i]; } if (setupcmd(ad->ep[0], type, req, control | i, index, buf, count) < 0){ if (debug & Dbgcontrol) fprint(2, "setcontrol: setupcmd %s failed\n", controls[rec][ctl].name); return -1; } c->value[i] = value[i]; } }else{ switch(count){ case 2: buf[1] = value[0] >> 8; case 1: buf[0] = value[0]; } if (setupcmd(ad->ep[0], type, req, control, index, buf, count) < 0){ if (debug & Dbgcontrol) fprint(2, "setcontrol: setupcmd %s failed\n", c->name); return -1; } } c->value[0] = value[0]; return 0;}intgetspecialcontrol(int rec, int ctl, int req, long *value){ byte buf[3]; int m, n, i; int type, control, index, count; short svalue; count = 1; switch(ctl){ default: return Undef; case Speed_control: value[0] = getspeed(rec, req); return 0; case Channel_control: case Resolution_control: if (req == GET_MIN) value[0] = controls[rec][ctl].min; if (req == GET_MAX) value[0] = controls[rec][ctl].max; if (req == GET_RES) value[0] = controls[rec][ctl].step; if (req == GET_CUR) value[0] = controls[rec][ctl].value[0]; return 0; case Volume_control: case Delay_control: count = 2; /* fall through */ case Mute_control: case Bass_control: case Mid_control: case Treble_control: case Equalizer_control: case Agc_control: case Bassboost_control: case Loudness_control: type = RD2H|Rclass|Rinterface; control = ctl<<8; index = featureid[rec]<<8; break; case Selector_control: type = RD2H|Rclass|Rinterface; control = ctl<<8; index = selectorid[rec]; break; } if (controls[rec][ctl].chans){ m = 0; value[0] = 0; // set to average for (i = 1; i < 8; i++){ value[i] = Undef; if (controls[rec][ctl].chans & 1 << i){ if (setupreq(ad->ep[0], type, req, control | i, index, count) < 0) return Undef; n = setupreply(ad->ep[0], buf, count); if (n != count) return -1; switch (count) { case 2: svalue = buf[1] << 8 | buf[0]; if (req == GET_CUR){ value[i] = svalue; value[0] += svalue; m++; }else value[0] = svalue; break; case 1: if (req == GET_CUR){ value[i] = buf[0]; value[0] += buf[0]; m++; }else value[0] = buf[0]; } } } if (m) value[0] /= m; return 0; } value[0] = Undef; if (setupreq(ad->ep[0], type, req, control, index, count) < 0) return -1; n = setupreply(ad->ep[0], buf, count); if (n != count) return -1; switch (count) { case 2: svalue = buf[1] << 8 | buf[0]; value[0] = svalue; break; case 1: value[0] = buf[0]; } return 0;}intgetcontrol(int rec, char *name, long *value){ int i; for (i = 0; i < Ncontrol; i++){ if (strcmp(name, controls[rec][i].name) == 0) break; } if (i == Ncontrol) return -1; if (controls[rec][i].readable == 0) return -1; if(getspecialcontrol(rec, i, GET_CUR, value) < 0) return -1; memmove(controls[rec][i].value, value, sizeof controls[rec][i].value); return 0;}voidgetcontrols(void){ int rec, ctl, i; Audiocontrol *c; long v[8]; for (rec = 0; rec < 2; rec++) for (ctl = 0; ctl < Ncontrol; ctl++){ c = &controls[rec][ctl]; if (c->readable){ if (verbose) fprint(2, "%s %s control", rec?"Record":"Playback", controls[rec][ctl].name); c->min = (getspecialcontrol(rec, ctl, GET_MIN, v) < 0) ? Undef : v[0]; if (verbose && c->min != Undef) fprint(2, ", min %ld", c->min); c->max = (getspecialcontrol(rec, ctl, GET_MAX, v) < 0) ? Undef : v[0]; if (verbose && c->max != Undef) fprint(2, ", max %ld", c->max); c->step = (getspecialcontrol(rec, ctl, GET_RES, v) < 0) ? Undef : v[0]; if (verbose && c->step != Undef) fprint(2, ", step %ld", c->step); if (getspecialcontrol(rec, ctl, GET_CUR, c->value) == 0){ if (verbose) { if (c->chans){ fprint(2, ", values"); for (i = 1; i < 8; i++) if (c->chans & 1 << i) fprint(2, "[%d] %ld ", i, c->value[i]); }else fprint(2, ", value %ld", c->value[0]); } } if (verbose) fprint(2, "\n"); } else { c->min = Undef; c->max = Undef; c->step = Undef; c->value[0] = Undef; if (debug & Dbgcontrol) fprint(2, "%s %s control not settable\n", rec?"Playback":"Record", controls[rec][ctl].name); } }}intctlparse(char *s, Audiocontrol *c, long *v){ int i, j, nf, m; char *vals[9]; char *p; long val; nf = tokenize(s, vals, nelem(vals)); if (nf <= 0) return -1; if (c->chans){ j = 0; m = 0; SET(val); v[0] = 0; // will compute average of v[i] for (i = 1; i < 8; i++) if (c->chans & 1 << i) { if (j < nf){ val = strtol(vals[j], &p, 0); if (val == 0 && *p != '\0' && *p != '%') return -1; if (*p == '%' && c->min != Undef) val = (val*c->max + (100-val)*c->min)/100; j++; } v[i] = val; v[0] += val; m++; } else v[i] = Undef; if (m) v[0] /= m; } else { val = strtol(vals[0], &p, 0); if (*p == '%' && c->min != Undef) val = (val*c->max + (100-val)*c->min)/100; v[0] = val; } return 0;}intAconv(Fmt *fp){ char str[256]; Audiocontrol *c; int fst, i; char *p; c = va_arg(fp->args, Audiocontrol*); p = str; if (c->chans) { fst = 1; for (i = 1; i < 8; i++) if (c->chans & 1 << i){ p = seprint(p, str+sizeof str, "%s%ld", fst?"'":" ", c->value[i]); fst = 0; } seprint(p, str+sizeof str, "'"); } else seprint(p, str+sizeof str, "%ld", c->value[0]); return fmtstrcpy(fp, str);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -