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

📄 ainstr_iw.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
			snd_seq_iwffff_instr_free(ops, ip, atomic);			return err;		}		while (len > (long)sizeof(__u32)) {			__u32 stype;			if (copy_from_user(&stype, instr_data, sizeof(stype)))				return -EFAULT;			if (stype != IWFFFF_STRU_WAVE)				break;			err = snd_seq_iwffff_copy_wave_from_stream(ops,								   lp,							    	   &instr_data,								   &len,								   atomic);			if (err < 0) {				snd_seq_iwffff_instr_free(ops, ip, atomic);				return err;			}		}	}	return 0;}static void snd_seq_iwffff_copy_lfo_to_stream(iwffff_xlfo_t *fx,					      iwffff_lfo_t *fp){	fx->freq = cpu_to_le16(fp->freq);	fx->depth = cpu_to_le16(fp->depth);	fx->sweep = cpu_to_le16(fp->sweep);	fp->shape = fx->shape;	fp->delay = fx->delay;}static int snd_seq_iwffff_copy_env_to_stream(__u32 req_stype,					     iwffff_layer_t *lp,					     iwffff_xenv_t *ex,					     iwffff_env_t *ep,					     char __user **data,					     long *len){	iwffff_env_record_t *rp;	iwffff_xenv_record_t rx;	iwffff_env_point_t *pp;	iwffff_xenv_point_t px;	int points_size, idx;	ex->flags = ep->flags;	ex->mode = ep->mode;	ex->index = ep->index;	for (rp = ep->record; rp; rp = rp->next) {		if (*len < (long)sizeof(rx))			return -ENOMEM;		memset(&rx, 0, sizeof(rx));		rx.stype = req_stype;		rx.nattack = cpu_to_le16(rp->nattack);		rx.nrelease = cpu_to_le16(rp->nrelease);		rx.sustain_offset = cpu_to_le16(rp->sustain_offset);		rx.sustain_rate = cpu_to_le16(rp->sustain_rate);		rx.release_rate = cpu_to_le16(rp->release_rate);		rx.hirange = cpu_to_le16(rp->hirange);		if (copy_to_user(*data, &rx, sizeof(rx)))			return -EFAULT;		*data += sizeof(rx);		*len -= sizeof(rx);		points_size = (rp->nattack + rp->nrelease) * 2 * sizeof(__u16);		if (*len < points_size)			return -ENOMEM;		pp = (iwffff_env_point_t *)(rp + 1);		for (idx = 0; idx < rp->nattack + rp->nrelease; idx++) {			px.offset = cpu_to_le16(pp->offset);			px.rate = cpu_to_le16(pp->rate);			if (copy_to_user(*data, &px, sizeof(px)))				return -EFAULT;			*data += sizeof(px);			*len -= sizeof(px);		}	}	return 0;}static int snd_seq_iwffff_copy_wave_to_stream(snd_iwffff_ops_t *ops,					      iwffff_layer_t *lp,					      char __user **data,					      long *len,					      int atomic){	iwffff_wave_t *wp;	iwffff_xwave_t xp;	int err;	unsigned int real_size;		for (wp = lp->wave; wp; wp = wp->next) {		if (*len < (long)sizeof(xp))			return -ENOMEM;		memset(&xp, 0, sizeof(xp));		xp.stype = IWFFFF_STRU_WAVE;		xp.share_id[0] = cpu_to_le32(wp->share_id[0]);		xp.share_id[1] = cpu_to_le32(wp->share_id[1]);		xp.share_id[2] = cpu_to_le32(wp->share_id[2]);		xp.share_id[3] = cpu_to_le32(wp->share_id[3]);		xp.format = cpu_to_le32(wp->format);		if (wp->format & IWFFFF_WAVE_ROM)			xp.offset = cpu_to_le32(wp->address.memory);		xp.size = cpu_to_le32(wp->size);		xp.start = cpu_to_le32(wp->start);		xp.loop_start = cpu_to_le32(wp->loop_start);		xp.loop_end = cpu_to_le32(wp->loop_end);		xp.loop_repeat = cpu_to_le32(wp->loop_repeat);		xp.sample_ratio = cpu_to_le32(wp->sample_ratio);		xp.attenuation = wp->attenuation;		xp.low_note = wp->low_note;		xp.high_note = wp->high_note;		if (copy_to_user(*data, &xp, sizeof(xp)))			return -EFAULT;		*data += sizeof(xp);		*len -= sizeof(xp);		real_size = snd_seq_iwffff_size(wp->size, wp->format);		if (!(wp->format & IWFFFF_WAVE_ROM)) {			if (*len < (long)real_size)				return -ENOMEM;		}		if (ops->get_sample) {			err = ops->get_sample(ops->private_data, wp,					      *data, real_size, atomic);			if (err < 0)				return err;		}		if (!(wp->format & IWFFFF_WAVE_ROM)) {			*data += real_size;			*len -= real_size;		}	}	return 0;}static int snd_seq_iwffff_get(void *private_data, snd_seq_kinstr_t *instr,			      char __user *instr_data, long len, int atomic, int cmd){	snd_iwffff_ops_t *ops = (snd_iwffff_ops_t *)private_data;	iwffff_instrument_t *ip;	iwffff_xinstrument_t ix;	iwffff_layer_t *lp;	iwffff_xlayer_t lx;	char __user *layer_instr_data;	int err;		if (cmd != SNDRV_SEQ_INSTR_GET_CMD_FULL)		return -EINVAL;	if (len < (long)sizeof(ix))		return -ENOMEM;	memset(&ix, 0, sizeof(ix));	ip = (iwffff_instrument_t *)KINSTR_DATA(instr);	ix.stype = IWFFFF_STRU_INSTR;	ix.exclusion = cpu_to_le16(ip->exclusion);	ix.layer_type = cpu_to_le16(ip->layer_type);	ix.exclusion_group = cpu_to_le16(ip->exclusion_group);	ix.effect1 = cpu_to_le16(ip->effect1);	ix.effect1_depth = cpu_to_le16(ip->effect1_depth);	ix.effect2 = ip->effect2;	ix.effect2_depth = ip->effect2_depth;	if (copy_to_user(instr_data, &ix, sizeof(ix)))		return -EFAULT;	instr_data += sizeof(ix);	len -= sizeof(ix);	for (lp = ip->layer; lp; lp = lp->next) {		if (len < (long)sizeof(lx))			return -ENOMEM;		memset(&lx, 0, sizeof(lx));		lx.stype = IWFFFF_STRU_LAYER;		lx.flags = lp->flags;		lx.velocity_mode = lp->velocity_mode;		lx.layer_event = lp->layer_event;		lx.low_range = lp->low_range;		lx.high_range = lp->high_range;		lx.pan = lp->pan;		lx.pan_freq_scale = lp->pan_freq_scale;		lx.attenuation = lp->attenuation;		snd_seq_iwffff_copy_lfo_to_stream(&lx.tremolo, &lp->tremolo);		snd_seq_iwffff_copy_lfo_to_stream(&lx.vibrato, &lp->vibrato);		layer_instr_data = instr_data;		instr_data += sizeof(lx);		len -= sizeof(lx);		err = snd_seq_iwffff_copy_env_to_stream(IWFFFF_STRU_ENV_RECP,							lp,							&lx.penv, &lp->penv,						        &instr_data, &len);		if (err < 0)			return err;		err = snd_seq_iwffff_copy_env_to_stream(IWFFFF_STRU_ENV_RECV,							lp,							&lx.venv, &lp->venv,						        &instr_data, &len);		if (err < 0)			return err;		/* layer structure updating is now finished */		if (copy_to_user(layer_instr_data, &lx, sizeof(lx)))			return -EFAULT;		err = snd_seq_iwffff_copy_wave_to_stream(ops,							 lp,							 &instr_data,							 &len,							 atomic);		if (err < 0)			return err;	}	return 0;}static long snd_seq_iwffff_env_size_in_stream(iwffff_env_t *ep){	long result = 0;	iwffff_env_record_t *rp;	for (rp = ep->record; rp; rp = rp->next) {		result += sizeof(iwffff_xenv_record_t);		result += (rp->nattack + rp->nrelease) * 2 * sizeof(__u16);	}	return 0;}static long snd_seq_iwffff_wave_size_in_stream(iwffff_layer_t *lp){	long result = 0;	iwffff_wave_t *wp;		for (wp = lp->wave; wp; wp = wp->next) {		result += sizeof(iwffff_xwave_t);		if (!(wp->format & IWFFFF_WAVE_ROM))			result += wp->size;	}	return result;}static int snd_seq_iwffff_get_size(void *private_data, snd_seq_kinstr_t *instr,				   long *size){	long result;	iwffff_instrument_t *ip;	iwffff_layer_t *lp;	*size = 0;	ip = (iwffff_instrument_t *)KINSTR_DATA(instr);	result = sizeof(iwffff_xinstrument_t);	for (lp = ip->layer; lp; lp = lp->next) {		result += sizeof(iwffff_xlayer_t);		result += snd_seq_iwffff_env_size_in_stream(&lp->penv);		result += snd_seq_iwffff_env_size_in_stream(&lp->venv);		result += snd_seq_iwffff_wave_size_in_stream(lp);	}	*size = result;	return 0;}static int snd_seq_iwffff_remove(void *private_data,				 snd_seq_kinstr_t *instr,                                 int atomic){	snd_iwffff_ops_t *ops = (snd_iwffff_ops_t *)private_data;	iwffff_instrument_t *ip;	ip = (iwffff_instrument_t *)KINSTR_DATA(instr);	snd_seq_iwffff_instr_free(ops, ip, atomic);	return 0;}static void snd_seq_iwffff_notify(void *private_data,				  snd_seq_kinstr_t *instr,                                  int what){	snd_iwffff_ops_t *ops = (snd_iwffff_ops_t *)private_data;	if (ops->notify)		ops->notify(ops->private_data, instr, what);}int snd_seq_iwffff_init(snd_iwffff_ops_t *ops,			void *private_data,			snd_seq_kinstr_ops_t *next){	memset(ops, 0, sizeof(*ops));	ops->private_data = private_data;	ops->kops.private_data = ops;	ops->kops.add_len = sizeof(iwffff_instrument_t);	ops->kops.instr_type = SNDRV_SEQ_INSTR_ID_INTERWAVE;	ops->kops.put = snd_seq_iwffff_put;	ops->kops.get = snd_seq_iwffff_get;	ops->kops.get_size = snd_seq_iwffff_get_size;	ops->kops.remove = snd_seq_iwffff_remove;	ops->kops.notify = snd_seq_iwffff_notify;	ops->kops.next = next;	return 0;}/* *  Init part */static int __init alsa_ainstr_iw_init(void){	return 0;}static void __exit alsa_ainstr_iw_exit(void){}module_init(alsa_ainstr_iw_init)module_exit(alsa_ainstr_iw_exit)EXPORT_SYMBOL(snd_seq_iwffff_init);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -