⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbaudioctl.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
					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 + -