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

📄 emufx.c

📁 是关于linux2.5.1的完全源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		pcm->valid = 1;		pcm->opened = 0;		pcm->channels = ipcm->channels;		pcm->tram_start = ipcm->tram_start;		pcm->buffer_size = ipcm->buffer_size;		pcm->gpr_size = ipcm->gpr_size;		pcm->gpr_count = ipcm->gpr_count;		pcm->gpr_tmpcount = ipcm->gpr_tmpcount;		pcm->gpr_ptr = ipcm->gpr_ptr;		pcm->gpr_trigger = ipcm->gpr_trigger;		pcm->gpr_running = ipcm->gpr_running;		for (i = 0; i < pcm->channels; i++)			pcm->etram[i] = ipcm->etram[i];	}      __error:	spin_unlock_irq(&emu->reg_lock);	up(&emu->fx8010.lock);	return err;}static int snd_emu10k1_ipcm_peek(emu10k1_t *emu, emu10k1_fx8010_pcm_t *ipcm){	int err = 0, i;	snd_emu10k1_fx8010_pcm_t *pcm;	if (ipcm->substream >= EMU10K1_FX8010_PCM_COUNT)		return -EINVAL;	pcm = &emu->fx8010.pcm[ipcm->substream];	down(&emu->fx8010.lock);	spin_lock_irq(&emu->reg_lock);	ipcm->channels = pcm->channels;	ipcm->tram_start = pcm->tram_start;	ipcm->buffer_size = pcm->buffer_size;	ipcm->gpr_size = pcm->gpr_size;	ipcm->gpr_ptr = pcm->gpr_ptr;	ipcm->gpr_count = pcm->gpr_count;	ipcm->gpr_tmpcount = pcm->gpr_tmpcount;	ipcm->gpr_trigger = pcm->gpr_trigger;	ipcm->gpr_running = pcm->gpr_running;	for (i = 0; i < pcm->channels; i++)		ipcm->etram[i] = pcm->etram[i];	ipcm->res1 = ipcm->res2 = 0;	ipcm->pad = 0;	spin_unlock_irq(&emu->reg_lock);	up(&emu->fx8010.lock);	return err;}#define SND_EMU10K1_GPR_CONTROLS	41#define SND_EMU10K1_INPUTS		10#define SND_EMU10K1_PLAYBACK_CHANNELS	6#define SND_EMU10K1_CAPTURE_CHANNELS	4static void __devinit snd_emu10k1_init_mono_control(emu10k1_fx8010_control_gpr_t *ctl, const char *name, int gpr, int defval){	ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;	strcpy(ctl->id.name, name);	ctl->vcount = ctl->count = 1;	ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;	ctl->min = 0;	ctl->max = 100;	ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;	}static void __devinit snd_emu10k1_init_stereo_control(emu10k1_fx8010_control_gpr_t *ctl, const char *name, int gpr, int defval){	ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;	strcpy(ctl->id.name, name);	ctl->vcount = ctl->count = 2;	ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;	ctl->gpr[1] = gpr + 1; ctl->value[1] = defval;	ctl->min = 0;	ctl->max = 100;	ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;	}static void __devinit snd_emu10k1_init_mono_onoff_control(emu10k1_fx8010_control_gpr_t *ctl, const char *name, int gpr, int defval){	ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;	strcpy(ctl->id.name, name);	ctl->vcount = ctl->count = 1;	ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;	ctl->min = 0;	ctl->max = 1;	ctl->translation = EMU10K1_GPR_TRANSLATION_ONOFF;}static void __devinit snd_emu10k1_init_stereo_onoff_control(emu10k1_fx8010_control_gpr_t *ctl, const char *name, int gpr, int defval){	ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;	strcpy(ctl->id.name, name);	ctl->vcount = ctl->count = 2;	ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;	ctl->gpr[1] = gpr + 1; ctl->value[1] = defval;	ctl->min = 0;	ctl->max = 1;	ctl->translation = EMU10K1_GPR_TRANSLATION_ONOFF;}/* * initial DSP configuration for Audigy */static int __devinit _snd_emu10k1_audigy_init_efx(emu10k1_t *emu){	int err, i, gpr, tmp, playback, capture, nctl;	u32 ptr;	emu10k1_fx8010_code_t *icode;	emu10k1_fx8010_control_gpr_t *controls;	mm_segment_t seg;	spin_lock_init(&emu->fx8010.irq_lock);	INIT_LIST_HEAD(&emu->fx8010.gpr_ctl);	if ((icode = snd_kcalloc(sizeof(emu10k1_fx8010_code_t), GFP_KERNEL)) == NULL)		return -ENOMEM;	if ((controls = snd_kcalloc(sizeof(emu10k1_fx8010_control_gpr_t) * SND_EMU10K1_GPR_CONTROLS, GFP_KERNEL)) == NULL) {		kfree(icode);		return -ENOMEM;	}		/* clear free GPRs */	for (i = 0; i < 256; i++)		set_bit(i, &icode->gpr_valid);	strcpy(icode->name, "Audigy DSP code for ALSA");	ptr = 0;	nctl = 0;	playback = 10;	capture = playback + 10; /* we reserve 10 voices */	gpr = capture + 10;	tmp = 0x80;		/* stop FX processor */	snd_emu10k1_ptr_write(emu, A_DBG, 0, (emu->fx8010.dbg = 0) | A_DBG_SINGLE_STEP);	/* Wave Playback */	A_OP(icode, &ptr, iMAC0, A_GPR(playback), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));	snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Playback Volume", gpr, 100);	gpr += 2;	/* Wave Surround Playback */	A_OP(icode, &ptr, iMAC0, A_GPR(playback+2), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+3), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));	snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Surround Playback Volume", gpr, 0);	gpr += 2;	/* Wave Center Playback */	/* Center = sub = Left/2 + Right/2 */	A_OP(icode, &ptr, iINTERP, A_GPR(tmp), A_FXBUS(FXBUS_PCM_LEFT), 0xcd, A_FXBUS(FXBUS_PCM_RIGHT));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+4), A_C_00000000, A_GPR(gpr), A_GPR(tmp));	snd_emu10k1_init_mono_control(&controls[nctl++], "Wave Center Playback Volume", gpr, 0);	gpr++;	/* Wave LFE Playback */	A_OP(icode, &ptr, iMAC0, A_GPR(playback+5), A_C_00000000, A_GPR(gpr), A_GPR(tmp));	snd_emu10k1_init_mono_control(&controls[nctl++], "Wave LFE Playback Volume", gpr, 0);	gpr++;	/* Music Playback */	A_OP(icode, &ptr, iMAC0, A_GPR(playback+0), A_GPR(playback+0), A_GPR(gpr), A_FXBUS(FXBUS_MIDI_LEFT));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+1), A_GPR(playback+1), A_GPR(gpr+1), A_FXBUS(FXBUS_MIDI_RIGHT));	snd_emu10k1_init_stereo_control(&controls[nctl++], "Music Playback Volume", gpr, 100);	gpr += 2;	/* Wave Capture */	A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));	A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));	snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Capture Volume", gpr, 0);	gpr += 2;	/* Music Capture */	A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_FXBUS(FXBUS_MIDI_LEFT));	A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr+1), A_FXBUS(FXBUS_MIDI_RIGHT));	snd_emu10k1_init_stereo_control(&controls[nctl++], "Music Capture Volume", gpr, 0);	gpr += 2;	/* Surround Playback */	A_OP(icode, &ptr, iMAC0, A_GPR(playback+2), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_REAR));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+3), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_REAR));	snd_emu10k1_init_stereo_control(&controls[nctl++], "Surround Playback Volume", gpr, 80);	gpr += 2;	/* Center Playback */	A_OP(icode, &ptr, iMAC0, A_GPR(playback+4), A_GPR(playback+4), A_GPR(gpr), A_FXBUS(FXBUS_PCM_CENTER));	snd_emu10k1_init_mono_control(&controls[nctl++], "Center Playback Volume", gpr, 80);	gpr++;	/* LFE Playback */	A_OP(icode, &ptr, iMAC0, A_GPR(playback+5), A_GPR(playback+5), A_GPR(gpr), A_FXBUS(FXBUS_PCM_LFE));	snd_emu10k1_init_mono_control(&controls[nctl++], "LFE Playback Volume", gpr, 80);	gpr++;	/*	 * inputs	 */#define A_ADD_VOLUME_IN(var,vol,input) \A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))	/* AC'97 Playback Volume */	A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_AC97_L);	A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_AC97_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "AC97 Playback Volume", gpr, 0);	gpr += 2;	/* AC'97 Capture Volume */	A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AC97_L);	A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AC97_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "AC97 Capture Volume", gpr, 100);	gpr += 2;	/* Audigy CD Playback Volume */	A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_SPDIF_CD_L);	A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_SPDIF_CD_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "Audigy CD Playback Volume", gpr, 0);	gpr += 2;	/* Audigy CD Capture Volume */	A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_SPDIF_CD_L);	A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_SPDIF_CD_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "Audigy CD Capture Volume", gpr, 0);	gpr += 2;	/* Line2 Playback Volume */	A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_LINE2_L);	A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_LINE2_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "Line2 Playback Volume", gpr, 0);	gpr += 2;	/* Line2 Capture Volume */	A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_LINE2_L);	A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_LINE2_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "Line2 Capture Volume", gpr, 0);	gpr += 2;	/* Aux2 Playback Volume */	A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_AUX2_L);	A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_AUX2_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "Aux2 Playback Volume", gpr, 0);	gpr += 2;	/* Aux2 Capture Volume */	A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AUX2_L);	A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AUX2_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "Aux2 Capture Volume", gpr, 0);	gpr += 2;	/*	 * outputs	 */#define A_PUT_OUTPUT(out,src) A_OP(icode, &ptr, iACC3, A_EXTOUT(out), A_C_00000000, A_C_00000000, A_GPR(src))#define A_PUT_STEREO_OUTPUT(out1,out2,src) \	{A_PUT_OUTPUT(out1,src); A_PUT_OUTPUT(out2,src+1);}	/* digital outputs */	A_PUT_STEREO_OUTPUT(A_EXTOUT_FRONT_L, A_EXTOUT_FRONT_R, playback);	A_PUT_STEREO_OUTPUT(A_EXTOUT_REAR_L, A_EXTOUT_REAR_R, playback+2);	A_PUT_OUTPUT(A_EXTOUT_CENTER, playback+4);	A_PUT_OUTPUT(A_EXTOUT_LFE, playback+5);	/* analog speakers */	//A_PUT_STEREO_OUTPUT(A_EXTOUT_AFRONT_L, A_EXTOUT_AFRONT_R, playback);	A_PUT_STEREO_OUTPUT(A_EXTOUT_AC97_L, A_EXTOUT_AC97_R, playback);	A_PUT_STEREO_OUTPUT(A_EXTOUT_AREAR_L, A_EXTOUT_AREAR_R, playback+2);	A_PUT_OUTPUT(A_EXTOUT_ACENTER, playback+4);	A_PUT_OUTPUT(A_EXTOUT_ALFE, playback+5);	/* headphone */	A_PUT_STEREO_OUTPUT(A_EXTOUT_HEADPHONE_L, A_EXTOUT_HEADPHONE_R, playback);	/* ADC buffer */	A_PUT_OUTPUT(A_EXTOUT_ADC_CAP_L, capture);	A_PUT_OUTPUT(A_EXTOUT_ADC_CAP_R, capture+1);	/*	 * ok, set up done..	 */	if (gpr > tmp) {		snd_BUG();		err = -EIO;		goto __err;	}	/* clear remaining instruction memory */	while (ptr < 0x200)		A_OP(icode, &ptr, 0x0f, 0xc0, 0xc0, 0xcf, 0xc0);	seg = snd_enter_user();	icode->gpr_add_control_count = nctl;	icode->gpr_add_controls = controls;	err = snd_emu10k1_icode_poke(emu, icode);	snd_leave_user(seg); __err:	kfree(controls);	kfree(icode);	return err;}/* * initial DSP configuration for Emu10k1 *//* when volume = max, then copy only to avoid volume modification *//* with iMAC0 (negative values) */static void __devinit _volume(emu10k1_fx8010_code_t *icode, u32 *ptr, u32 dst, u32 src, u32 vol){	OP(icode, ptr, iMAC0, dst, C_00000000, src, vol);	OP(icode, ptr, iANDXOR, C_00000000, vol, C_ffffffff, C_7fffffff);	OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000001);	OP(icode, ptr, iACC3, dst, src, C_00000000, C_00000000);}static void __devinit _volume_add(emu10k1_fx8010_code_t *icode, u32 *ptr, u32 dst, u32 src, u32 vol){	OP(icode, ptr, iANDXOR, C_00000000, vol, C_ffffffff, C_7fffffff);	OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000002);	OP(icode, ptr, iMACINT0, dst, dst, src, C_00000001);	OP(icode, ptr, iSKIP, C_00000000, C_7fffffff, C_7fffffff, C_00000001);	OP(icode, ptr, iMAC0, dst, dst, src, vol);}static void __devinit _volume_out(emu10k1_fx8010_code_t *icode, u32 *ptr, u32 dst, u32 src, u32 vol){	OP(icode, ptr, iANDXOR, C_00000000, vol, C_ffffffff, C_7fffffff);	OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000002);	OP(icode, ptr, iACC3, dst, src, C_00000000, C_00000000);	OP(icode, ptr, iSKIP, C_00000000, C_7fffffff, C_7fffffff, C_00000001);	OP(icode, ptr, iMAC0, dst, C_00000000, src, vol);}#define VOLUME(icode, ptr, dst, src, vol) \		_volume(icode, ptr, GPR(dst), GPR(src), GPR(vol))#define VOLUME_IN(icode, ptr, dst, src, vol) \		_volume(icode, ptr, GPR(dst), EXTIN(src), GPR(vol))#define VOLUME_ADD(icode, ptr, dst, src, vol) \		_volume_add(icode, ptr, GPR(dst), GPR(src), GPR(vol))#define VOLUME_ADDIN(icode, ptr, dst, src, vol) \		_volume_add(icode, ptr, GPR(dst), EXTIN(src), GPR(vol))#define VOLUME_OUT(icode, ptr, dst, src, vol) \		_volume_out(icode, ptr, EXTOUT(dst), GPR(src), GPR(vol))#define _SWITCH(icode, ptr, dst, src, sw) \	OP((icode), ptr, iMACINT0, dst, C_00000000, src, sw);#define SWITCH(icode, ptr, dst, src, sw) \		_SWITCH(icode, ptr, GPR(dst), GPR(src), GPR(sw))#define SWITCH_IN(icode, ptr, dst, src, sw) \		_SWITCH(icode, ptr, GPR(dst), EXTIN(src), GPR(sw))#define _SWITCH_NEG(icode, ptr, dst, src) \	OP((icode), ptr, iANDXOR, dst, src, C_00000001, C_00000001);#define SWITCH_NEG(icode, ptr, dst, src) \		_SWITCH_NEG(icode, ptr, GPR(dst), GPR(src))static int __devinit _snd_emu10k1_init_efx(emu10k1_t *emu){	int err, i, z, gpr, tmp, playback, capture;	u32 ptr;	emu10k1_fx8010_code_t *icode;	emu10k1_fx8010_pcm_t *ipcm;	emu10k1_fx8010_control_gpr_t *controls, *ctl;	mm_segment_t seg;	spin_lock_init(&emu->fx8010.irq_lock);	INIT_LIST_HEAD(&emu->fx8010.gpr_ctl);	if ((icode = snd_kcalloc(sizeof(emu10k1_fx8010_code_t), GFP_KERNEL)) == NULL)		return -ENOMEM;

⌨️ 快捷键说明

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