emufx.c

来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 1,713 行 · 第 1/5 页

C
1,713
字号
	snd_emu10k1_init_stereo_control(&controls[nctl++], "Music Capture Volume", gpr, 0);	gpr += 2;	/*	 * 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 - used only for mic (renamed later) */	A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_AC97_L);	A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_AC97_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "AMic Playback Volume", gpr, 0);	gpr += 2;	/* AC'97 Capture Volume - used only for mic */	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++], "Mic Capture Volume", gpr, 0);	gpr += 2;	/* mic capture buffer */		A_OP(icode, &ptr, iINTERP, A_EXTOUT(A_EXTOUT_MIC_CAP), A_EXTIN(A_EXTIN_AC97_L), 0xcd, A_EXTIN(A_EXTIN_AC97_R));	/* Audigy CD Playback Volume */	A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_SPDIF_CD_L);	A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_SPDIF_CD_R);	snd_emu10k1_init_stereo_control(&controls[nctl++],					emu->no_ac97 ? "CD Playback Volume" : "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++],					emu->no_ac97 ? "CD Capture Volume" : "Audigy CD Capture Volume",					gpr, 0);	gpr += 2; 	/* Optical SPDIF Playback Volume */	A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_OPT_SPDIF_L);	A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_OPT_SPDIF_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "IEC958 Optical Playback Volume", gpr, 0);	gpr += 2;	/* Optical SPDIF Capture Volume */	A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_OPT_SPDIF_L);	A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_OPT_SPDIF_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "IEC958 Optical Capture Volume", gpr, 0);	gpr += 2;	/* Line2 Playback Volume */	A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_LINE2_L);	A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_LINE2_R);	snd_emu10k1_init_stereo_control(&controls[nctl++],					emu->no_ac97 ? "Line Playback Volume" : "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++],					emu->no_ac97 ? "Line Capture Volume" : "Line2 Capture Volume",					gpr, 0);	gpr += 2;        	/* Philips ADC Playback Volume */	A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_ADC_L);	A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_ADC_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "Analog Mix Playback Volume", gpr, 0);	gpr += 2;	/* Philips ADC Capture Volume */	A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_ADC_L);	A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_ADC_R);	snd_emu10k1_init_stereo_control(&controls[nctl++], "Analog Mix Capture Volume", gpr, 0);	gpr += 2;	/* Aux2 Playback Volume */	A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_AUX2_L);	A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_AUX2_R);	snd_emu10k1_init_stereo_control(&controls[nctl++],					emu->no_ac97 ? "Aux Playback Volume" : "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++],					emu->no_ac97 ? "Aux Capture Volume" : "Aux2 Capture Volume",					gpr, 0);	gpr += 2;		/* Stereo Mix Front Playback Volume */	A_OP(icode, &ptr, iMAC0, A_GPR(playback), A_GPR(playback), A_GPR(gpr), A_GPR(stereo_mix));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+1), A_GPR(playback+1), A_GPR(gpr+1), A_GPR(stereo_mix+1));	snd_emu10k1_init_stereo_control(&controls[nctl++], "Front Playback Volume", gpr, 100);	gpr += 2;		/* Stereo Mix Surround Playback */	A_OP(icode, &ptr, iMAC0, A_GPR(playback+2), A_GPR(playback+2), A_GPR(gpr), A_GPR(stereo_mix));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+3), A_GPR(playback+3), A_GPR(gpr+1), A_GPR(stereo_mix+1));	snd_emu10k1_init_stereo_control(&controls[nctl++], "Surround Playback Volume", gpr, 0);	gpr += 2;	/* Stereo Mix Center Playback */	/* Center = sub = Left/2 + Right/2 */	A_OP(icode, &ptr, iINTERP, A_GPR(tmp), A_GPR(stereo_mix), 0xcd, A_GPR(stereo_mix+1));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+4), A_GPR(playback+4), A_GPR(gpr), A_GPR(tmp));	snd_emu10k1_init_mono_control(&controls[nctl++], "Center Playback Volume", gpr, 0);	gpr++;	/* Stereo Mix LFE Playback */	A_OP(icode, &ptr, iMAC0, A_GPR(playback+5), A_GPR(playback+5), A_GPR(gpr), A_GPR(tmp));	snd_emu10k1_init_mono_control(&controls[nctl++], "LFE Playback Volume", gpr, 0);	gpr++;		if (emu->spk71) {		/* Stereo Mix Side Playback */		A_OP(icode, &ptr, iMAC0, A_GPR(playback+6), A_GPR(playback+6), A_GPR(gpr), A_GPR(stereo_mix));		A_OP(icode, &ptr, iMAC0, A_GPR(playback+7), A_GPR(playback+7), A_GPR(gpr+1), A_GPR(stereo_mix+1));		snd_emu10k1_init_stereo_control(&controls[nctl++], "Side Playback 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);}#define _A_SWITCH(icode, ptr, dst, src, sw) \	A_OP((icode), ptr, iMACINT0, dst, A_C_00000000, src, sw);#define A_SWITCH(icode, ptr, dst, src, sw) \		_A_SWITCH(icode, ptr, A_GPR(dst), A_GPR(src), A_GPR(sw))#define _A_SWITCH_NEG(icode, ptr, dst, src) \	A_OP((icode), ptr, iANDXOR, dst, src, A_C_00000001, A_C_00000001);#define A_SWITCH_NEG(icode, ptr, dst, src) \		_A_SWITCH_NEG(icode, ptr, A_GPR(dst), A_GPR(src))	/*	 *  Process tone control	 */	A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), A_GPR(playback + 0), A_C_00000000, A_C_00000000); /* left */	A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), A_GPR(playback + 1), A_C_00000000, A_C_00000000); /* right */	A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 2), A_GPR(playback + 2), A_C_00000000, A_C_00000000); /* rear left */	A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 3), A_GPR(playback + 3), A_C_00000000, A_C_00000000); /* rear right */	A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), A_GPR(playback + 4), A_C_00000000, A_C_00000000); /* center */	A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), A_GPR(playback + 5), A_C_00000000, A_C_00000000); /* LFE */	if (emu->spk71) {		A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 6), A_GPR(playback + 6), A_C_00000000, A_C_00000000); /* side left */		A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 7), A_GPR(playback + 7), A_C_00000000, A_C_00000000); /* side right */	}		ctl = &controls[nctl + 0];	ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;	strcpy(ctl->id.name, "Tone Control - Bass");	ctl->vcount = 2;	ctl->count = 10;	ctl->min = 0;	ctl->max = 40;	ctl->value[0] = ctl->value[1] = 20;	ctl->translation = EMU10K1_GPR_TRANSLATION_BASS;	ctl = &controls[nctl + 1];	ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;	strcpy(ctl->id.name, "Tone Control - Treble");	ctl->vcount = 2;	ctl->count = 10;	ctl->min = 0;	ctl->max = 40;	ctl->value[0] = ctl->value[1] = 20;	ctl->translation = EMU10K1_GPR_TRANSLATION_TREBLE;#define BASS_GPR	0x8c#define TREBLE_GPR	0x96	for (z = 0; z < 5; z++) {		int j;		for (j = 0; j < 2; j++) {			controls[nctl + 0].gpr[z * 2 + j] = BASS_GPR + z * 2 + j;			controls[nctl + 1].gpr[z * 2 + j] = TREBLE_GPR + z * 2 + j;		}	}	for (z = 0; z < 4; z++) {		/* front/rear/center-lfe/side */		int j, k, l, d;		for (j = 0; j < 2; j++) {	/* left/right */			k = 0xb0 + (z * 8) + (j * 4);			l = 0xe0 + (z * 8) + (j * 4);			d = playback + SND_EMU10K1_PLAYBACK_CHANNELS + z * 2 + j;			A_OP(icode, &ptr, iMAC0, A_C_00000000, A_C_00000000, A_GPR(d), A_GPR(BASS_GPR + 0 + j));			A_OP(icode, &ptr, iMACMV, A_GPR(k+1), A_GPR(k), A_GPR(k+1), A_GPR(BASS_GPR + 4 + j));			A_OP(icode, &ptr, iMACMV, A_GPR(k), A_GPR(d), A_GPR(k), A_GPR(BASS_GPR + 2 + j));			A_OP(icode, &ptr, iMACMV, A_GPR(k+3), A_GPR(k+2), A_GPR(k+3), A_GPR(BASS_GPR + 8 + j));			A_OP(icode, &ptr, iMAC0, A_GPR(k+2), A_GPR_ACCU, A_GPR(k+2), A_GPR(BASS_GPR + 6 + j));			A_OP(icode, &ptr, iACC3, A_GPR(k+2), A_GPR(k+2), A_GPR(k+2), A_C_00000000);			A_OP(icode, &ptr, iMAC0, A_C_00000000, A_C_00000000, A_GPR(k+2), A_GPR(TREBLE_GPR + 0 + j));			A_OP(icode, &ptr, iMACMV, A_GPR(l+1), A_GPR(l), A_GPR(l+1), A_GPR(TREBLE_GPR + 4 + j));			A_OP(icode, &ptr, iMACMV, A_GPR(l), A_GPR(k+2), A_GPR(l), A_GPR(TREBLE_GPR + 2 + j));			A_OP(icode, &ptr, iMACMV, A_GPR(l+3), A_GPR(l+2), A_GPR(l+3), A_GPR(TREBLE_GPR + 8 + j));			A_OP(icode, &ptr, iMAC0, A_GPR(l+2), A_GPR_ACCU, A_GPR(l+2), A_GPR(TREBLE_GPR + 6 + j));			A_OP(icode, &ptr, iMACINT0, A_GPR(l+2), A_C_00000000, A_GPR(l+2), A_C_00000010);			A_OP(icode, &ptr, iACC3, A_GPR(d), A_GPR(l+2), A_C_00000000, A_C_00000000);			if (z == 2)	/* center */				break;		}	}	nctl += 2;#undef BASS_GPR#undef TREBLE_GPR	for (z = 0; z < 8; z++) {		A_SWITCH(icode, &ptr, tmp + 0, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, gpr + 0);		A_SWITCH_NEG(icode, &ptr, tmp + 1, gpr + 0);		A_SWITCH(icode, &ptr, tmp + 1, playback + z, tmp + 1);		A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000);	}	snd_emu10k1_init_stereo_onoff_control(controls + nctl++, "Tone Control - Switch", gpr, 0);	gpr += 2;	/* Master volume (will be renamed later) */	A_OP(icode, &ptr, iMAC0, A_GPR(playback+0+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+0+SND_EMU10K1_PLAYBACK_CHANNELS));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+1+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+1+SND_EMU10K1_PLAYBACK_CHANNELS));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+2+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+2+SND_EMU10K1_PLAYBACK_CHANNELS));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+3+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+3+SND_EMU10K1_PLAYBACK_CHANNELS));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+4+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+4+SND_EMU10K1_PLAYBACK_CHANNELS));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+5+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+5+SND_EMU10K1_PLAYBACK_CHANNELS));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+6+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+6+SND_EMU10K1_PLAYBACK_CHANNELS));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+7+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+7+SND_EMU10K1_PLAYBACK_CHANNELS));	snd_emu10k1_init_mono_control(&controls[nctl++], "Wave Master Playback Volume", gpr, 0);	gpr += 2;	/* analog speakers */	A_PUT_STEREO_OUTPUT(A_EXTOUT_AFRONT_L, A_EXTOUT_AFRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);	A_PUT_STEREO_OUTPUT(A_EXTOUT_AREAR_L, A_EXTOUT_AREAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS);	A_PUT_OUTPUT(A_EXTOUT_ACENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS);	A_PUT_OUTPUT(A_EXTOUT_ALFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS);	if (emu->spk71)		A_PUT_STEREO_OUTPUT(A_EXTOUT_ASIDE_L, A_EXTOUT_ASIDE_R, playback+6 + SND_EMU10K1_PLAYBACK_CHANNELS);	/* headphone */	A_PUT_STEREO_OUTPUT(A_EXTOUT_HEADPHONE_L, A_EXTOUT_HEADPHONE_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);	/* digital outputs */	/* A_PUT_STEREO_OUTPUT(A_EXTOUT_FRONT_L, A_EXTOUT_FRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); */	/* IEC958 Optical Raw Playback Switch */ 	icode->gpr_map[gpr++] = 0x1008;	icode->gpr_map[gpr++] = 0xffff0000;	for (z = 0; z < 2; z++) {		A_OP(icode, &ptr, iMAC0, A_GPR(tmp + 2), A_FXBUS(FXBUS_PT_LEFT + z), A_C_00000000, A_C_00000000);		A_OP(icode, &ptr, iSKIP, A_GPR_COND, A_GPR_COND, A_GPR(gpr - 2), A_C_00000001);		A_OP(icode, &ptr, iACC3, A_GPR(tmp + 2), A_C_00000000, A_C_00010000, A_GPR(tmp + 2));		A_OP(icode, &ptr, iANDXOR, A_GPR(tmp + 2), A_GPR(tmp + 2), A_GPR(gpr - 1), A_C_00000000);		A_SWITCH(icode, &ptr, tmp + 0, tmp + 2, gpr + z);		A_SWITCH_NEG(icode, &ptr, tmp + 1, gpr + z);		A_SWITCH(icode, &ptr, tmp + 1, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, tmp + 1);		A_OP(icode, &ptr, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L + z), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000);	}	snd_emu10k1_init_stereo_onoff_control(controls + nctl++, "IEC958 Optical Raw Playback Switch", gpr, 0);	gpr += 2;		A_PUT_STEREO_OUTPUT(A_EXTOUT_REAR_L, A_EXTOUT_REAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS);	A_PUT_OUTPUT(A_EXTOUT_CENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS);	A_PUT_OUTPUT(A_EXTOUT_LFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS);	/* 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) \

⌨️ 快捷键说明

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