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

📄 emufx.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	ctl->max = 100;	ctl->tlv = snd_emu10k1_db_scale1;	ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;}static void __devinitsnd_emu10k1_init_mono_onoff_control(struct snd_emu10k1_fx8010_control_gpr *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 __devinitsnd_emu10k1_init_stereo_onoff_control(struct snd_emu10k1_fx8010_control_gpr *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;}/* * Used for emu1010 - conversion from 32-bit capture inputs from HANA * to 2 x 16-bit registers in audigy - their values are read via DMA. * Conversion is performed by Audigy DSP instructions of FX8010. */static int snd_emu10k1_audigy_dsp_convert_32_to_2x16(				struct snd_emu10k1_fx8010_code *icode,				u32 *ptr, int tmp, int bit_shifter16,				int reg_in, int reg_out){	A_OP(icode, ptr, iACC3, A_GPR(tmp + 1), reg_in, A_C_00000000, A_C_00000000);	A_OP(icode, ptr, iANDXOR, A_GPR(tmp), A_GPR(tmp + 1), A_GPR(bit_shifter16 - 1), A_C_00000000);	A_OP(icode, ptr, iTSTNEG, A_GPR(tmp + 2), A_GPR(tmp), A_C_80000000, A_GPR(bit_shifter16 - 2));	A_OP(icode, ptr, iANDXOR, A_GPR(tmp + 2), A_GPR(tmp + 2), A_C_80000000, A_C_00000000);	A_OP(icode, ptr, iANDXOR, A_GPR(tmp), A_GPR(tmp), A_GPR(bit_shifter16 - 3), A_C_00000000);	A_OP(icode, ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A_GPR(tmp), A_C_00010000);	A_OP(icode, ptr, iANDXOR, reg_out, A_GPR(tmp), A_C_ffffffff, A_GPR(tmp + 2));	A_OP(icode, ptr, iACC3, reg_out + 1, A_GPR(tmp + 1), A_C_00000000, A_C_00000000);	return 1;}/* * initial DSP configuration for Audigy */static int __devinit _snd_emu10k1_audigy_init_efx(struct snd_emu10k1 *emu){	int err, i, z, gpr, nctl;	int bit_shifter16;	const int playback = 10;	const int capture = playback + (SND_EMU10K1_PLAYBACK_CHANNELS * 2); /* we reserve 10 voices */	const int stereo_mix = capture + 2;	const int tmp = 0x88;	u32 ptr;	struct snd_emu10k1_fx8010_code *icode = NULL;	struct snd_emu10k1_fx8010_control_gpr *controls = NULL, *ctl;	u32 *gpr_map;	mm_segment_t seg;	if ((icode = kzalloc(sizeof(*icode), GFP_KERNEL)) == NULL ||	    (icode->gpr_map = (u_int32_t __user *)	     kcalloc(512 + 256 + 256 + 2 * 1024, sizeof(u_int32_t),		     GFP_KERNEL)) == NULL ||	    (controls = kcalloc(SND_EMU10K1_GPR_CONTROLS,				sizeof(*controls), GFP_KERNEL)) == NULL) {		err = -ENOMEM;		goto __err;	}	gpr_map = (u32 __force *)icode->gpr_map;	icode->tram_data_map = icode->gpr_map + 512;	icode->tram_addr_map = icode->tram_data_map + 256;	icode->code = icode->tram_addr_map + 256;	/* clear free GPRs */	for (i = 0; i < 512; i++)		set_bit(i, icode->gpr_valid);			/* clear TRAM data & address lines */	for (i = 0; i < 256; i++)		set_bit(i, icode->tram_valid);	strcpy(icode->name, "Audigy DSP code for ALSA");	ptr = 0;	nctl = 0;	gpr = stereo_mix + 10;	gpr_map[gpr++] = 0x00007fff;	gpr_map[gpr++] = 0x00008000;	gpr_map[gpr++] = 0x0000ffff;	bit_shifter16 = gpr;	/* stop FX processor */	snd_emu10k1_ptr_write(emu, A_DBG, 0, (emu->fx8010.dbg = 0) | A_DBG_SINGLE_STEP);#if 1	/* PCM front Playback Volume (independent from stereo mix)	 * playback = 0 + ( gpr * FXBUS_PCM_LEFT_FRONT >> 31)	 * where gpr contains attenuation from corresponding mixer control	 * (snd_emu10k1_init_stereo_control)	 */	A_OP(icode, &ptr, iMAC0, A_GPR(playback), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_FRONT));	A_OP(icode, &ptr, iMAC0, A_GPR(playback+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_FRONT));	snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Front Playback Volume", gpr, 100);	gpr += 2;	/* PCM Surround Playback (independent from stereo mix) */	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++], "PCM Surround Playback Volume", gpr, 100);	gpr += 2;		/* PCM Side Playback (independent from stereo mix) */	if (emu->card_capabilities->spk71) {		A_OP(icode, &ptr, iMAC0, A_GPR(playback+6), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_SIDE));		A_OP(icode, &ptr, iMAC0, A_GPR(playback+7), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_SIDE));		snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Side Playback Volume", gpr, 100);		gpr += 2;	}	/* PCM Center Playback (independent from stereo mix) */	A_OP(icode, &ptr, iMAC0, A_GPR(playback+4), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_CENTER));	snd_emu10k1_init_mono_control(&controls[nctl++], "PCM Center Playback Volume", gpr, 100);	gpr++;	/* PCM LFE Playback (independent from stereo mix) */	A_OP(icode, &ptr, iMAC0, A_GPR(playback+5), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LFE));	snd_emu10k1_init_mono_control(&controls[nctl++], "PCM LFE Playback Volume", gpr, 100);	gpr++;		/*	 * Stereo Mix	 */	/* Wave (PCM) Playback Volume (will be renamed later) */	A_OP(icode, &ptr, iMAC0, A_GPR(stereo_mix), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));	A_OP(icode, &ptr, iMAC0, A_GPR(stereo_mix+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;	/* Synth Playback */	A_OP(icode, &ptr, iMAC0, A_GPR(stereo_mix+0), A_GPR(stereo_mix+0), A_GPR(gpr), A_FXBUS(FXBUS_MIDI_LEFT));	A_OP(icode, &ptr, iMAC0, A_GPR(stereo_mix+1), A_GPR(stereo_mix+1), A_GPR(gpr+1), A_FXBUS(FXBUS_MIDI_RIGHT));	snd_emu10k1_init_stereo_control(&controls[nctl++], "Synth Playback Volume", gpr, 100);	gpr += 2;	/* Wave (PCM) 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++], "PCM Capture Volume", gpr, 0);	gpr += 2;	/* Synth 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++], "Synth 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))	/* emu1212 DSP 0 and DSP 1 Capture */	if (emu->card_capabilities->emu1010) {		if (emu->card_capabilities->ca0108_chip) {			/* Note:JCD:No longer bit shift lower 16bits to upper 16bits of 32bit value. */			A_OP(icode, &ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A3_EMU32IN(0x0), A_C_00000001);			A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_GPR(tmp));			A_OP(icode, &ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A3_EMU32IN(0x1), A_C_00000001);			A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr), A_GPR(tmp));		} else {			A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_P16VIN(0x0));			A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr+1), A_P16VIN(0x1));		}		snd_emu10k1_init_stereo_control(&controls[nctl++], "EMU Capture Volume", gpr, 0);		gpr += 2;	}	/* 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->card_capabilities->ac97_chip ? "Audigy CD Playback Volume" : "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->card_capabilities->ac97_chip ? "Audigy CD Capture Volume" : "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++], SNDRV_CTL_NAME_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++], SNDRV_CTL_NAME_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->card_capabilities->ac97_chip ? "Line2 Playback Volume" : "Line 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->card_capabilities->ac97_chip ? "Line2 Capture Volume" : "Line 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->card_capabilities->ac97_chip ? "Aux2 Playback Volume" : "Aux 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->card_capabilities->ac97_chip ? "Aux2 Capture Volume" : "Aux 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->card_capabilities->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->card_capabilities->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;		}	}

⌨️ 快捷键说明

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