mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
ALSA: emu10k1: roll up loops in DSP setup code for Audigy
There is no apparent reason for the massive code duplication. Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de> Link: https://lore.kernel.org/r/20230510173917.3073107-3-oswald.buddenhagen@gmx.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
2a3fa40aef
commit
8cabf83c7a
@ -1552,14 +1552,8 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))
|
||||
gpr++;
|
||||
|
||||
/* 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));
|
||||
for (z = 0; z < 8; z++)
|
||||
A_OP(icode, &ptr, iMAC0, A_GPR(playback+z+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+z+SND_EMU10K1_PLAYBACK_CHANNELS));
|
||||
snd_emu10k1_init_mono_control(&controls[nctl++], "Wave Master Playback Volume", gpr, 0);
|
||||
gpr += 2;
|
||||
|
||||
@ -1646,102 +1640,14 @@ A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))
|
||||
dev_dbg(emu->card->dev, "emufx.c: gpr=0x%x, tmp=0x%x\n",
|
||||
gpr, tmp);
|
||||
*/
|
||||
/* For the EMU1010: How to get 32bit values from the DSP. High 16bits into L, low 16bits into R. */
|
||||
/* A_P16VIN(0) is delayed by one sample,
|
||||
* so all other A_P16VIN channels will need to also be delayed
|
||||
*/
|
||||
/* Left ADC in. 1 of 2 */
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_P16VIN(0x0), A_FXBUS2(0) );
|
||||
/* Right ADC in 1 of 2 */
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
/* Delaying by one sample: instead of copying the input
|
||||
* value A_P16VIN to output A_FXBUS2 as in the first channel,
|
||||
* we use an auxiliary register, delaying the value by one
|
||||
* sample
|
||||
*/
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(2) );
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x1), A_C_00000000, A_C_00000000);
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(4) );
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x2), A_C_00000000, A_C_00000000);
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(6) );
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x3), A_C_00000000, A_C_00000000);
|
||||
/* For 96kHz mode */
|
||||
/* Left ADC in. 2 of 2 */
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0x8) );
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x4), A_C_00000000, A_C_00000000);
|
||||
/* Right ADC in 2 of 2 */
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xa) );
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x5), A_C_00000000, A_C_00000000);
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xc) );
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x6), A_C_00000000, A_C_00000000);
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xe) );
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x7), A_C_00000000, A_C_00000000);
|
||||
/* Pavel Hofman - we still have voices, A_FXBUS2s, and
|
||||
* A_P16VINs available -
|
||||
* let's add 8 more capture channels - total of 16
|
||||
*/
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
|
||||
bit_shifter16,
|
||||
A_GPR(gpr - 1),
|
||||
A_FXBUS2(0x10));
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x8),
|
||||
A_C_00000000, A_C_00000000);
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
|
||||
bit_shifter16,
|
||||
A_GPR(gpr - 1),
|
||||
A_FXBUS2(0x12));
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x9),
|
||||
A_C_00000000, A_C_00000000);
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
|
||||
bit_shifter16,
|
||||
A_GPR(gpr - 1),
|
||||
A_FXBUS2(0x14));
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xa),
|
||||
A_C_00000000, A_C_00000000);
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
|
||||
bit_shifter16,
|
||||
A_GPR(gpr - 1),
|
||||
A_FXBUS2(0x16));
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xb),
|
||||
A_C_00000000, A_C_00000000);
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
|
||||
bit_shifter16,
|
||||
A_GPR(gpr - 1),
|
||||
A_FXBUS2(0x18));
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xc),
|
||||
A_C_00000000, A_C_00000000);
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
|
||||
bit_shifter16,
|
||||
A_GPR(gpr - 1),
|
||||
A_FXBUS2(0x1a));
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xd),
|
||||
A_C_00000000, A_C_00000000);
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
|
||||
bit_shifter16,
|
||||
A_GPR(gpr - 1),
|
||||
A_FXBUS2(0x1c));
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xe),
|
||||
A_C_00000000, A_C_00000000);
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
|
||||
bit_shifter16,
|
||||
A_GPR(gpr - 1),
|
||||
A_FXBUS2(0x1e));
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xf),
|
||||
A_C_00000000, A_C_00000000);
|
||||
/* A_P16VIN(0) is delayed by one sample, so all other A_P16VIN channels
|
||||
* will need to also be delayed; we use an auxiliary register for that. */
|
||||
for (z = 1; z < 0x10; z++) {
|
||||
snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr), A_FXBUS2(z * 2) );
|
||||
A_OP(icode, &ptr, iACC3, A_GPR(gpr), A_P16VIN(z), A_C_00000000, A_C_00000000);
|
||||
gpr_map[gpr++] = 0x00000000;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
Loading…
Reference in New Issue
Block a user