Changeset 772 for GPL/trunk/alsa-kernel/pci/emu10k1/emufx.c
- Timestamp:
- Apr 19, 2025, 8:08:37 PM (4 months ago)
- Location:
- GPL/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/trunk
- Property svn:mergeinfo changed
/GPL/branches/uniaud32-6.6-LTS (added) merged: 765,768-769 /GPL/branches/uniaud32-exp (added) merged: 735-741,743-744,748-751,753-760,762-764 /GPL/branches/uniaud32-next merged: 718-734
- Property svn:mergeinfo changed
-
GPL/trunk/alsa-kernel/pci/emu10k1/emufx.c
r703 r772 2 2 /* 3 3 * Copyright (c) by Jaroslav Kysela <perex@perex.cz> 4 * James Courtier-Dutton <James@superbug.co.uk> 5 * Oswald Buddenhagen <oswald.buddenhagen@gmx.de> 4 6 * Creative Labs, Inc. 7 * 5 8 * Routines for effect processor FX8010 6 *7 * Copyright (c) by James Courtier-Dutton <James@superbug.co.uk>8 * Added EMU 1010 support.9 *10 * BUGS:11 * --12 *13 * TODO:14 * --15 9 */ 16 10 … … 48 42 */ 49 43 50 static const char * const fxbuses[16] = { 44 // Playback channel labels; corresponds with the public FXBUS_* defines. 45 // Unlike the tables below, this is not determined by the hardware. 46 const char * const snd_emu10k1_fxbus[32] = { 51 47 /* 0x00 */ "PCM Left", 52 48 /* 0x01 */ "PCM Right", 53 /* 0x02 */ "PCM SurroundLeft",54 /* 0x03 */ "PCM SurroundRight",49 /* 0x02 */ "PCM Rear Left", 50 /* 0x03 */ "PCM Rear Right", 55 51 /* 0x04 */ "MIDI Left", 56 52 /* 0x05 */ "MIDI Right", 57 /* 0x06 */ " Center",58 /* 0x07 */ " LFE",59 /* 0x08 */ NULL,60 /* 0x09 */ NULL,53 /* 0x06 */ "PCM Center", 54 /* 0x07 */ "PCM LFE", 55 /* 0x08 */ "PCM Front Left", 56 /* 0x09 */ "PCM Front Right", 61 57 /* 0x0a */ NULL, 62 58 /* 0x0b */ NULL, 63 59 /* 0x0c */ "MIDI Reverb", 64 60 /* 0x0d */ "MIDI Chorus", 65 /* 0x0e */ NULL, 66 /* 0x0f */ NULL 61 /* 0x0e */ "PCM Side Left", 62 /* 0x0f */ "PCM Side Right", 63 /* 0x10 */ NULL, 64 /* 0x11 */ NULL, 65 /* 0x12 */ NULL, 66 /* 0x13 */ NULL, 67 /* 0x14 */ "Passthrough Left", 68 /* 0x15 */ "Passthrough Right", 69 /* 0x16 */ NULL, 70 /* 0x17 */ NULL, 71 /* 0x18 */ NULL, 72 /* 0x19 */ NULL, 73 /* 0x1a */ NULL, 74 /* 0x1b */ NULL, 75 /* 0x1c */ NULL, 76 /* 0x1d */ NULL, 77 /* 0x1e */ NULL, 78 /* 0x1f */ NULL 67 79 }; 68 80 69 static const char * const creative_ins[16] = { 81 // Physical inputs; corresponds with the public EXTIN_* defines. 82 const char * const snd_emu10k1_sblive_ins[16] = { 70 83 /* 0x00 */ "AC97 Left", 71 84 /* 0x01 */ "AC97 Right", … … 86 99 }; 87 100 88 static const char * const audigy_ins[16] = { 101 // Physical inputs; corresponds with the public A_EXTIN_* defines. 102 const char * const snd_emu10k1_audigy_ins[16] = { 89 103 /* 0x00 */ "AC97 Left", 90 104 /* 0x01 */ "AC97 Right", … … 105 119 }; 106 120 107 static const char * const creative_outs[32] = { 121 // Physical outputs; corresponds with the public EXTOUT_* defines. 122 const char * const snd_emu10k1_sblive_outs[32] = { 108 123 /* 0x00 */ "AC97 Left", 109 124 /* 0x01 */ "AC97 Right", … … 122 137 /* 0x0e */ "AC97 Surround Right", 123 138 /* 0x0f */ NULL, 139 // This is actually the FXBUS2 range; SB Live! 5.1 only. 124 140 /* 0x10 */ NULL, 125 141 /* 0x11 */ "Analog Center", … … 140 156 }; 141 157 142 static const char * const audigy_outs[32] = { 158 // Physical outputs; corresponds with the public A_EXTOUT_* defines. 159 const char * const snd_emu10k1_audigy_outs[32] = { 143 160 /* 0x00 */ "Digital Front Left", 144 161 /* 0x01 */ "Digital Front Right", … … 173 190 /* 0x1e */ NULL, 174 191 /* 0x1f */ NULL, 192 }; 193 194 // On the SB Live! 5.1, FXBUS2[1] and FXBUS2[2] are occupied by EXTOUT_ACENTER 195 // and EXTOUT_ALFE, so we can't connect inputs to them for multitrack recording. 196 // 197 // Since only 14 of the 16 EXTINs are used, this is not a big problem. 198 // We route AC97 to FX capture 14 and 15, SPDIF_CD to FX capture 0 and 3, 199 // and the rest of the EXTINs to the corresponding FX capture channel. 200 // Multitrack recorders will still see the center/LFE output signal 201 // on the second and third "input" channel. 202 const s8 snd_emu10k1_sblive51_fxbus2_map[16] = { 203 2, -1, -1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 1 175 204 }; 176 205 … … 320 349 static int snd_emu10k1_gpr_ctl_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 321 350 { 351 struct snd_emu10k1_fx8010_ctl *ctl = 352 (struct snd_emu10k1_fx8010_ctl *) kcontrol->private_value; 353 unsigned int i; 354 355 for (i = 0; i < ctl->vcount; i++) 356 ucontrol->value.integer.value[i] = ctl->value[i]; 357 return 0; 358 } 359 360 static int snd_emu10k1_gpr_ctl_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 361 { 322 362 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol); 323 363 struct snd_emu10k1_fx8010_ctl *ctl = 324 364 (struct snd_emu10k1_fx8010_ctl *) kcontrol->private_value; 325 unsigned long flags; 326 unsigned int i; 327 328 spin_lock_irqsave(&emu->reg_lock, flags); 329 for (i = 0; i < ctl->vcount; i++) 330 ucontrol->value.integer.value[i] = ctl->value[i]; 331 spin_unlock_irqrestore(&emu->reg_lock, flags); 332 return 0; 333 } 334 335 static int snd_emu10k1_gpr_ctl_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 336 { 337 struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol); 338 struct snd_emu10k1_fx8010_ctl *ctl = 339 (struct snd_emu10k1_fx8010_ctl *) kcontrol->private_value; 340 unsigned long flags; 341 unsigned int nval, val; 365 int nval, val; 342 366 unsigned int i, j; 343 367 int change = 0; 344 368 345 spin_lock_irqsave(&emu->reg_lock, flags);346 369 for (i = 0; i < ctl->vcount; i++) { 347 370 nval = ucontrol->value.integer.value[i]; … … 357 380 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, val); 358 381 break; 382 case EMU10K1_GPR_TRANSLATION_NEGATE: 383 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, ~val); 384 break; 359 385 case EMU10K1_GPR_TRANSLATION_TABLE100: 360 386 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, db_table[val]); 387 break; 388 case EMU10K1_GPR_TRANSLATION_NEG_TABLE100: 389 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, 390 val == 100 ? 0x80000000 : -(int)db_table[val]); 361 391 break; 362 392 case EMU10K1_GPR_TRANSLATION_BASS: … … 382 412 } 383 413 __error: 384 spin_unlock_irqrestore(&emu->reg_lock, flags);385 414 return change; 386 415 } … … 643 672 kcontrol = ctl->kcontrol; 644 673 if (kcontrol->id.iface == id->iface && 645 !strcmp(kcontrol->id.name, id->name)&&646 kcontrol->id.index == id->index)674 kcontrol->id.index == id->index && 675 !strcmp(kcontrol->id.name, id->name)) 647 676 return ctl; 648 677 } … … 766 795 continue; 767 796 gctl_id = (struct snd_ctl_elem_id *)&gctl->id; 768 down_read(&emu->card->controls_rwsem);769 797 if (snd_ctl_find_id(emu->card, gctl_id)) { 770 up_read(&emu->card->controls_rwsem);771 798 err = -EEXIST; 772 799 goto __error; 773 800 } 774 up_read(&emu->card->controls_rwsem);775 801 if (gctl_id->iface != SNDRV_CTL_ELEM_IFACE_MIXER && 776 802 gctl_id->iface != SNDRV_CTL_ELEM_IFACE_PCM) { 803 err = -EINVAL; 804 goto __error; 805 } 806 switch (gctl->translation) { 807 case EMU10K1_GPR_TRANSLATION_NONE: 808 case EMU10K1_GPR_TRANSLATION_NEGATE: 809 break; 810 case EMU10K1_GPR_TRANSLATION_TABLE100: 811 case EMU10K1_GPR_TRANSLATION_NEG_TABLE100: 812 if (gctl->min != 0 || gctl->max != 100) { 813 err = -EINVAL; 814 goto __error; 815 } 816 break; 817 case EMU10K1_GPR_TRANSLATION_BASS: 818 case EMU10K1_GPR_TRANSLATION_TREBLE: 819 if (gctl->min != 0 || gctl->max != 40) { 820 err = -EINVAL; 821 goto __error; 822 } 823 break; 824 case EMU10K1_GPR_TRANSLATION_ONOFF: 825 if (gctl->min != 0 || gctl->max != 1) { 826 err = -EINVAL; 827 goto __error; 828 } 829 break; 830 default: 777 831 err = -EINVAL; 778 832 goto __error; … … 916 970 if (err < 0) 917 971 return err; 918 down_write(&card->controls_rwsem);919 972 ctl = snd_emu10k1_look_for_ctl(emu, &id); 920 973 if (ctl) 921 974 snd_ctl_remove(card, ctl->kcontrol); 922 up_write(&card->controls_rwsem);923 975 } 924 976 return 0; … … 1118 1170 #define SND_EMU10K1_CAPTURE_CHANNELS 4 1119 1171 1172 #define HR_VAL(v) ((v) * 0x80000000LL / 100 - 1) 1173 1120 1174 static void 1121 snd_emu10k1_init_mono_control (struct snd_emu10k1_fx8010_control_gpr *ctl,1122 const char *name, int gpr, int defval)1175 snd_emu10k1_init_mono_control2(struct snd_emu10k1_fx8010_control_gpr *ctl, 1176 const char *name, int gpr, int defval, int defval_hr) 1123 1177 { 1124 1178 ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER; 1125 1179 strcpy(ctl->id.name, name); 1126 1180 ctl->vcount = ctl->count = 1; 1127 ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;1128 1181 if (high_res_gpr_volume) { 1129 ctl->min = 0;1182 ctl->min = -1; 1130 1183 ctl->max = 0x7fffffff; 1131 1184 ctl->tlv = snd_emu10k1_db_linear; 1132 ctl->translation = EMU10K1_GPR_TRANSLATION_NONE; 1185 ctl->translation = EMU10K1_GPR_TRANSLATION_NEGATE; 1186 defval = defval_hr; 1133 1187 } else { 1134 1188 ctl->min = 0; 1135 1189 ctl->max = 100; 1136 1190 ctl->tlv = snd_emu10k1_db_scale1; 1137 ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100; 1138 } 1139 } 1191 ctl->translation = EMU10K1_GPR_TRANSLATION_NEG_TABLE100; 1192 } 1193 ctl->gpr[0] = gpr + 0; ctl->value[0] = defval; 1194 } 1195 #define snd_emu10k1_init_mono_control(ctl, name, gpr, defval) \ 1196 snd_emu10k1_init_mono_control2(ctl, name, gpr, defval, HR_VAL(defval)) 1140 1197 1141 1198 static void 1142 snd_emu10k1_init_stereo_control (struct snd_emu10k1_fx8010_control_gpr *ctl,1143 const char *name, int gpr, int defval)1199 snd_emu10k1_init_stereo_control2(struct snd_emu10k1_fx8010_control_gpr *ctl, 1200 const char *name, int gpr, int defval, int defval_hr) 1144 1201 { 1145 1202 ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER; 1146 1203 strcpy(ctl->id.name, name); 1147 1204 ctl->vcount = ctl->count = 2; 1148 ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;1149 ctl->gpr[1] = gpr + 1; ctl->value[1] = defval;1150 1205 if (high_res_gpr_volume) { 1151 ctl->min = 0;1206 ctl->min = -1; 1152 1207 ctl->max = 0x7fffffff; 1153 1208 ctl->tlv = snd_emu10k1_db_linear; 1154 ctl->translation = EMU10K1_GPR_TRANSLATION_NONE; 1209 ctl->translation = EMU10K1_GPR_TRANSLATION_NEGATE; 1210 defval = defval_hr; 1155 1211 } else { 1156 1212 ctl->min = 0; 1157 1213 ctl->max = 100; 1158 1214 ctl->tlv = snd_emu10k1_db_scale1; 1159 ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100; 1160 } 1161 } 1215 ctl->translation = EMU10K1_GPR_TRANSLATION_NEG_TABLE100; 1216 } 1217 ctl->gpr[0] = gpr + 0; ctl->value[0] = defval; 1218 ctl->gpr[1] = gpr + 1; ctl->value[1] = defval; 1219 } 1220 #define snd_emu10k1_init_stereo_control(ctl, name, gpr, defval) \ 1221 snd_emu10k1_init_stereo_control2(ctl, name, gpr, defval, HR_VAL(defval)) 1162 1222 1163 1223 static void … … 1189 1249 1190 1250 /* 1191 * Used for emu1010 - conversion from 32-bit capture inputs from HANA1192 * to 2 x 16-bit registers in audigy - their values are read via DMA.1251 * Used for emu1010 - conversion from 32-bit capture inputs from the FPGA 1252 * to 2 x 16-bit registers in Audigy - their values are read via DMA. 1193 1253 * Conversion is performed by Audigy DSP instructions of FX8010. 1194 1254 */ 1195 static intsnd_emu10k1_audigy_dsp_convert_32_to_2x16(1255 static void snd_emu10k1_audigy_dsp_convert_32_to_2x16( 1196 1256 struct snd_emu10k1_fx8010_code *icode, 1197 1257 u32 *ptr, int tmp, int bit_shifter16, 1198 1258 int reg_in, int reg_out) 1199 1259 { 1200 A_OP(icode, ptr, iACC3, A_GPR(tmp + 1), reg_in, A_C_00000000, A_C_00000000); 1201 A_OP(icode, ptr, iANDXOR, A_GPR(tmp), A_GPR(tmp + 1), A_GPR(bit_shifter16 - 1), A_C_00000000); 1202 A_OP(icode, ptr, iTSTNEG, A_GPR(tmp + 2), A_GPR(tmp), A_C_80000000, A_GPR(bit_shifter16 - 2)); 1203 A_OP(icode, ptr, iANDXOR, A_GPR(tmp + 2), A_GPR(tmp + 2), A_C_80000000, A_C_00000000); 1204 A_OP(icode, ptr, iANDXOR, A_GPR(tmp), A_GPR(tmp), A_GPR(bit_shifter16 - 3), A_C_00000000); 1205 A_OP(icode, ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A_GPR(tmp), A_C_00010000); 1206 A_OP(icode, ptr, iANDXOR, reg_out, A_GPR(tmp), A_C_ffffffff, A_GPR(tmp + 2)); 1207 A_OP(icode, ptr, iACC3, reg_out + 1, A_GPR(tmp + 1), A_C_00000000, A_C_00000000); 1208 return 1; 1209 } 1260 // This leaves the low word in place, which is fine, 1261 // as the low bits are completely ignored subsequently. 1262 // reg_out[1] = reg_in 1263 A_OP(icode, ptr, iACC3, reg_out + 1, reg_in, A_C_00000000, A_C_00000000); 1264 // It is fine to read reg_in multiple times. 1265 // tmp = reg_in << 15 1266 A_OP(icode, ptr, iMACINT1, A_GPR(tmp), A_C_00000000, reg_in, A_GPR(bit_shifter16)); 1267 // Left-shift once more. This is a separate step, as the 1268 // signed multiplication would clobber the MSB. 1269 // reg_out[0] = tmp + ((tmp << 31) >> 31) 1270 A_OP(icode, ptr, iMAC3, reg_out, A_GPR(tmp), A_GPR(tmp), A_C_80000000); 1271 } 1272 1273 #define ENUM_GPR(name, size) name, name ## _dummy = name + (size) - 1 1210 1274 1211 1275 /* … … 1215 1279 static int _snd_emu10k1_audigy_init_efx(struct snd_emu10k1 *emu) 1216 1280 { 1217 int err, i, z, gpr, nctl; 1218 int bit_shifter16; 1219 const int playback = 10; 1220 const int capture = playback + (SND_EMU10K1_PLAYBACK_CHANNELS * 2); /* we reserve 10 voices */ 1221 const int stereo_mix = capture + 2; 1222 const int tmp = 0x88; 1223 u32 ptr; 1281 int err, z, nctl; 1282 enum { 1283 ENUM_GPR(playback, SND_EMU10K1_PLAYBACK_CHANNELS), 1284 ENUM_GPR(stereo_mix, 2), 1285 ENUM_GPR(capture, 2), 1286 ENUM_GPR(bit_shifter16, 1), 1287 // The fixed allocation of these breaks the pattern, but why not. 1288 // Splitting these into left/right is questionable, as it will break 1289 // down for center/lfe. But it works for stereo/quadro, so whatever. 1290 ENUM_GPR(bass_gpr, 2 * 5), // two sides, five coefficients 1291 ENUM_GPR(treble_gpr, 2 * 5), 1292 ENUM_GPR(bass_tmp, SND_EMU10K1_PLAYBACK_CHANNELS * 4), // four delay stages 1293 ENUM_GPR(treble_tmp, SND_EMU10K1_PLAYBACK_CHANNELS * 4), 1294 ENUM_GPR(tmp, 3), 1295 num_static_gprs 1296 }; 1297 int gpr = num_static_gprs; 1298 u32 ptr, ptr_skip; 1224 1299 struct snd_emu10k1_fx8010_code *icode = NULL; 1225 1300 struct snd_emu10k1_fx8010_control_gpr *controls = NULL, *ctl; … … 1247 1322 1248 1323 /* clear free GPRs */ 1249 for (i = 0; i < 512; i++) 1250 set_bit(i, icode->gpr_valid); 1324 memset(icode->gpr_valid, 0xff, 512 / 8); 1251 1325 1252 1326 /* clear TRAM data & address lines */ 1253 for (i = 0; i < 256; i++) 1254 set_bit(i, icode->tram_valid); 1327 memset(icode->tram_valid, 0xff, 256 / 8); 1255 1328 1256 1329 strcpy(icode->name, "Audigy DSP code for ALSA"); 1257 1330 ptr = 0; 1258 1331 nctl = 0; 1259 gpr = stereo_mix + 10; 1260 gpr_map[gpr++] = 0x00007fff; 1261 gpr_map[gpr++] = 0x00008000; 1262 gpr_map[gpr++] = 0x0000ffff; 1263 bit_shifter16 = gpr; 1264 1265 /* stop FX processor */ 1266 snd_emu10k1_ptr_write(emu, A_DBG, 0, (emu->fx8010.dbg = 0) | A_DBG_SINGLE_STEP); 1332 gpr_map[bit_shifter16] = 0x00008000; 1267 1333 1268 1334 #if 1 1269 1335 /* PCM front Playback Volume (independent from stereo mix) 1270 * playback = 0 + ( gpr * FXBUS_PCM_LEFT_FRONT >> 31)1271 * where gpr contains attenuation from corresponding mixer control1336 * playback = -gpr * FXBUS_PCM_LEFT_FRONT >> 31 1337 * where gpr contains negated attenuation from corresponding mixer control 1272 1338 * (snd_emu10k1_init_stereo_control) 1273 1339 */ 1274 A_OP(icode, &ptr, iMAC 0, A_GPR(playback), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_FRONT));1275 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_FRONT));1340 A_OP(icode, &ptr, iMAC1, A_GPR(playback), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_FRONT)); 1341 A_OP(icode, &ptr, iMAC1, A_GPR(playback+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_FRONT)); 1276 1342 snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Front Playback Volume", gpr, 100); 1277 1343 gpr += 2; 1278 1344 1279 1345 /* PCM Surround Playback (independent from stereo mix) */ 1280 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+2), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_REAR));1281 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+3), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_REAR));1346 A_OP(icode, &ptr, iMAC1, A_GPR(playback+2), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_REAR)); 1347 A_OP(icode, &ptr, iMAC1, A_GPR(playback+3), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_REAR)); 1282 1348 snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Surround Playback Volume", gpr, 100); 1283 1349 gpr += 2; … … 1285 1351 /* PCM Side Playback (independent from stereo mix) */ 1286 1352 if (emu->card_capabilities->spk71) { 1287 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+6), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_SIDE));1288 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+7), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_SIDE));1353 A_OP(icode, &ptr, iMAC1, A_GPR(playback+6), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_SIDE)); 1354 A_OP(icode, &ptr, iMAC1, A_GPR(playback+7), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_SIDE)); 1289 1355 snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Side Playback Volume", gpr, 100); 1290 1356 gpr += 2; … … 1292 1358 1293 1359 /* PCM Center Playback (independent from stereo mix) */ 1294 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+4), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_CENTER));1360 A_OP(icode, &ptr, iMAC1, A_GPR(playback+4), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_CENTER)); 1295 1361 snd_emu10k1_init_mono_control(&controls[nctl++], "PCM Center Playback Volume", gpr, 100); 1296 1362 gpr++; 1297 1363 1298 1364 /* PCM LFE Playback (independent from stereo mix) */ 1299 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+5), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LFE));1365 A_OP(icode, &ptr, iMAC1, A_GPR(playback+5), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LFE)); 1300 1366 snd_emu10k1_init_mono_control(&controls[nctl++], "PCM LFE Playback Volume", gpr, 100); 1301 1367 gpr++; … … 1305 1371 */ 1306 1372 /* Wave (PCM) Playback Volume (will be renamed later) */ 1307 A_OP(icode, &ptr, iMAC 0, A_GPR(stereo_mix), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));1308 A_OP(icode, &ptr, iMAC 0, A_GPR(stereo_mix+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));1373 A_OP(icode, &ptr, iMAC1, A_GPR(stereo_mix), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT)); 1374 A_OP(icode, &ptr, iMAC1, A_GPR(stereo_mix+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT)); 1309 1375 snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Playback Volume", gpr, 100); 1310 1376 gpr += 2; 1311 1377 1312 1378 /* Synth Playback */ 1313 A_OP(icode, &ptr, iMAC 0, A_GPR(stereo_mix+0), A_GPR(stereo_mix+0), A_GPR(gpr), A_FXBUS(FXBUS_MIDI_LEFT));1314 A_OP(icode, &ptr, iMAC 0, A_GPR(stereo_mix+1), A_GPR(stereo_mix+1), A_GPR(gpr+1), A_FXBUS(FXBUS_MIDI_RIGHT));1379 A_OP(icode, &ptr, iMAC1, A_GPR(stereo_mix+0), A_GPR(stereo_mix+0), A_GPR(gpr), A_FXBUS(FXBUS_MIDI_LEFT)); 1380 A_OP(icode, &ptr, iMAC1, A_GPR(stereo_mix+1), A_GPR(stereo_mix+1), A_GPR(gpr+1), A_FXBUS(FXBUS_MIDI_RIGHT)); 1315 1381 snd_emu10k1_init_stereo_control(&controls[nctl++], "Synth Playback Volume", gpr, 100); 1316 1382 gpr += 2; 1317 1383 1318 1384 /* Wave (PCM) Capture */ 1319 A_OP(icode, &ptr, iMAC 0, A_GPR(capture+0), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));1320 A_OP(icode, &ptr, iMAC 0, A_GPR(capture+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));1385 A_OP(icode, &ptr, iMAC1, A_GPR(capture+0), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT)); 1386 A_OP(icode, &ptr, iMAC1, A_GPR(capture+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT)); 1321 1387 snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Capture Volume", gpr, 0); 1322 1388 gpr += 2; 1323 1389 1324 1390 /* Synth Capture */ 1325 A_OP(icode, &ptr, iMAC 0, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_FXBUS(FXBUS_MIDI_LEFT));1326 A_OP(icode, &ptr, iMAC 0, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr+1), A_FXBUS(FXBUS_MIDI_RIGHT));1391 A_OP(icode, &ptr, iMAC1, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_FXBUS(FXBUS_MIDI_LEFT)); 1392 A_OP(icode, &ptr, iMAC1, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr+1), A_FXBUS(FXBUS_MIDI_RIGHT)); 1327 1393 snd_emu10k1_init_stereo_control(&controls[nctl++], "Synth Capture Volume", gpr, 0); 1328 1394 gpr += 2; 1329 1395 1396 // We need to double the volume, as we configure the voices for half volume, 1397 // which is necessary for bit-identical reproduction. 1398 //{ static_assert(stereo_mix == playback + SND_EMU10K1_PLAYBACK_CHANNELS); } 1399 for (z = 0; z < SND_EMU10K1_PLAYBACK_CHANNELS + 2; z++) 1400 A_OP(icode, &ptr, iACC3, A_GPR(playback + z), A_GPR(playback + z), A_GPR(playback + z), A_C_00000000); 1401 1330 1402 /* 1331 1403 * inputs 1332 1404 */ 1333 1405 #define A_ADD_VOLUME_IN(var,vol,input) \ 1334 A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input)) 1335 1336 /* emu1212 DSP 0 and DSP 1 Capture */ 1406 A_OP(icode, &ptr, iMAC1, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input)) 1407 1337 1408 if (emu->card_capabilities->emu_model) { 1409 /* EMU1010 DSP 0 and DSP 1 Capture */ 1410 // The 24 MSB hold the actual value. We implicitly discard the 16 LSB. 1338 1411 if (emu->card_capabilities->ca0108_chip) { 1339 /* Note:JCD:No longer bit shift lower 16bits to upper 16bits of 32bit value. */ 1340 A_OP(icode, &ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A3_EMU32IN(0x0), A_C_00000001); 1341 A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_GPR(tmp)); 1342 A_OP(icode, &ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A3_EMU32IN(0x1), A_C_00000001); 1343 A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr), A_GPR(tmp)); 1412 // For unclear reasons, the EMU32IN cannot be the Y operand! 1413 A_OP(icode, &ptr, iMAC1, A_GPR(capture+0), A_GPR(capture+0), A3_EMU32IN(0x0), A_GPR(gpr)); 1414 // A3_EMU32IN(0) is delayed by one sample, so all other A3_EMU32IN channels 1415 // need to be delayed as well; we use an auxiliary register for that. 1416 A_OP(icode, &ptr, iMAC1, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr+2), A_GPR(gpr+1)); 1417 A_OP(icode, &ptr, iACC3, A_GPR(gpr+2), A3_EMU32IN(0x1), A_C_00000000, A_C_00000000); 1344 1418 } else { 1345 A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_P16VIN(0x0)); 1346 A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr+1), A_P16VIN(0x1)); 1419 A_OP(icode, &ptr, iMAC1, A_GPR(capture+0), A_GPR(capture+0), A_P16VIN(0x0), A_GPR(gpr)); 1420 // A_P16VIN(0) is delayed by one sample, so all other A_P16VIN channels 1421 // need to be delayed as well; we use an auxiliary register for that. 1422 A_OP(icode, &ptr, iMAC1, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr+2), A_GPR(gpr+1)); 1423 A_OP(icode, &ptr, iACC3, A_GPR(gpr+2), A_P16VIN(0x1), A_C_00000000, A_C_00000000); 1347 1424 } 1348 1425 snd_emu10k1_init_stereo_control(&controls[nctl++], "EMU Capture Volume", gpr, 0); 1426 gpr_map[gpr + 2] = 0x00000000; 1427 gpr += 3; 1428 } else { 1429 if (emu->card_capabilities->ac97_chip) { 1430 /* AC'97 Playback Volume - used only for mic (renamed later) */ 1431 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_AC97_L); 1432 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_AC97_R); 1433 snd_emu10k1_init_stereo_control(&controls[nctl++], "AMic Playback Volume", gpr, 0); 1434 gpr += 2; 1435 /* AC'97 Capture Volume - used only for mic */ 1436 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AC97_L); 1437 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AC97_R); 1438 snd_emu10k1_init_stereo_control(&controls[nctl++], "Mic Capture Volume", gpr, 0); 1439 gpr += 2; 1440 1441 /* mic capture buffer */ 1442 A_OP(icode, &ptr, iINTERP, A_EXTOUT(A_EXTOUT_MIC_CAP), A_EXTIN(A_EXTIN_AC97_L), A_C_40000000, A_EXTIN(A_EXTIN_AC97_R)); 1443 } 1444 1445 /* Audigy CD Playback Volume */ 1446 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_SPDIF_CD_L); 1447 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_SPDIF_CD_R); 1448 snd_emu10k1_init_stereo_control(&controls[nctl++], 1449 emu->card_capabilities->ac97_chip ? "Audigy CD Playback Volume" : "CD Playback Volume", 1450 gpr, 0); 1349 1451 gpr += 2; 1350 } 1351 /* AC'97 Playback Volume - used only for mic (renamed later) */ 1352 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_AC97_L); 1353 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_AC97_R); 1354 snd_emu10k1_init_stereo_control(&controls[nctl++], "AMic Playback Volume", gpr, 0); 1355 gpr += 2; 1356 /* AC'97 Capture Volume - used only for mic */ 1357 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AC97_L); 1358 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AC97_R); 1359 snd_emu10k1_init_stereo_control(&controls[nctl++], "Mic Capture Volume", gpr, 0); 1360 gpr += 2; 1361 1362 /* mic capture buffer */ 1363 A_OP(icode, &ptr, iINTERP, A_EXTOUT(A_EXTOUT_MIC_CAP), A_EXTIN(A_EXTIN_AC97_L), 0xcd, A_EXTIN(A_EXTIN_AC97_R)); 1364 1365 /* Audigy CD Playback Volume */ 1366 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_SPDIF_CD_L); 1367 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_SPDIF_CD_R); 1368 snd_emu10k1_init_stereo_control(&controls[nctl++], 1369 emu->card_capabilities->ac97_chip ? "Audigy CD Playback Volume" : "CD Playback Volume", 1370 gpr, 0); 1371 gpr += 2; 1372 /* Audigy CD Capture Volume */ 1373 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_SPDIF_CD_L); 1374 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_SPDIF_CD_R); 1375 snd_emu10k1_init_stereo_control(&controls[nctl++], 1376 emu->card_capabilities->ac97_chip ? "Audigy CD Capture Volume" : "CD Capture Volume", 1377 gpr, 0); 1378 gpr += 2; 1379 1380 /* Optical SPDIF Playback Volume */ 1381 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_OPT_SPDIF_L); 1382 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_OPT_SPDIF_R); 1383 snd_emu10k1_init_stereo_control(&controls[nctl++], SNDRV_CTL_NAME_IEC958("Optical ",PLAYBACK,VOLUME), gpr, 0); 1384 gpr += 2; 1385 /* Optical SPDIF Capture Volume */ 1386 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_OPT_SPDIF_L); 1387 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_OPT_SPDIF_R); 1388 snd_emu10k1_init_stereo_control(&controls[nctl++], SNDRV_CTL_NAME_IEC958("Optical ",CAPTURE,VOLUME), gpr, 0); 1389 gpr += 2; 1390 1391 /* Line2 Playback Volume */ 1392 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_LINE2_L); 1393 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_LINE2_R); 1394 snd_emu10k1_init_stereo_control(&controls[nctl++], 1395 emu->card_capabilities->ac97_chip ? "Line2 Playback Volume" : "Line Playback Volume", 1396 gpr, 0); 1397 gpr += 2; 1398 /* Line2 Capture Volume */ 1399 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_LINE2_L); 1400 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_LINE2_R); 1401 snd_emu10k1_init_stereo_control(&controls[nctl++], 1402 emu->card_capabilities->ac97_chip ? "Line2 Capture Volume" : "Line Capture Volume", 1403 gpr, 0); 1404 gpr += 2; 1405 1406 /* Philips ADC Playback Volume */ 1407 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_ADC_L); 1408 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_ADC_R); 1409 snd_emu10k1_init_stereo_control(&controls[nctl++], "Analog Mix Playback Volume", gpr, 0); 1410 gpr += 2; 1411 /* Philips ADC Capture Volume */ 1412 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_ADC_L); 1413 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_ADC_R); 1414 snd_emu10k1_init_stereo_control(&controls[nctl++], "Analog Mix Capture Volume", gpr, 0); 1415 gpr += 2; 1416 1417 /* Aux2 Playback Volume */ 1418 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_AUX2_L); 1419 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_AUX2_R); 1420 snd_emu10k1_init_stereo_control(&controls[nctl++], 1421 emu->card_capabilities->ac97_chip ? "Aux2 Playback Volume" : "Aux Playback Volume", 1422 gpr, 0); 1423 gpr += 2; 1424 /* Aux2 Capture Volume */ 1425 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AUX2_L); 1426 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AUX2_R); 1427 snd_emu10k1_init_stereo_control(&controls[nctl++], 1428 emu->card_capabilities->ac97_chip ? "Aux2 Capture Volume" : "Aux Capture Volume", 1429 gpr, 0); 1430 gpr += 2; 1452 /* Audigy CD Capture Volume */ 1453 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_SPDIF_CD_L); 1454 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_SPDIF_CD_R); 1455 snd_emu10k1_init_stereo_control(&controls[nctl++], 1456 emu->card_capabilities->ac97_chip ? "Audigy CD Capture Volume" : "CD Capture Volume", 1457 gpr, 0); 1458 gpr += 2; 1459 1460 /* Optical SPDIF Playback Volume */ 1461 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_OPT_SPDIF_L); 1462 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_OPT_SPDIF_R); 1463 snd_emu10k1_init_stereo_control(&controls[nctl++], SNDRV_CTL_NAME_IEC958("Optical ",PLAYBACK,VOLUME), gpr, 0); 1464 gpr += 2; 1465 /* Optical SPDIF Capture Volume */ 1466 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_OPT_SPDIF_L); 1467 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_OPT_SPDIF_R); 1468 snd_emu10k1_init_stereo_control(&controls[nctl++], SNDRV_CTL_NAME_IEC958("Optical ",CAPTURE,VOLUME), gpr, 0); 1469 gpr += 2; 1470 1471 /* Line2 Playback Volume */ 1472 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_LINE2_L); 1473 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_LINE2_R); 1474 snd_emu10k1_init_stereo_control(&controls[nctl++], 1475 emu->card_capabilities->ac97_chip ? "Line2 Playback Volume" : "Line Playback Volume", 1476 gpr, 0); 1477 gpr += 2; 1478 /* Line2 Capture Volume */ 1479 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_LINE2_L); 1480 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_LINE2_R); 1481 snd_emu10k1_init_stereo_control(&controls[nctl++], 1482 emu->card_capabilities->ac97_chip ? "Line2 Capture Volume" : "Line Capture Volume", 1483 gpr, 0); 1484 gpr += 2; 1485 1486 /* Philips ADC Playback Volume */ 1487 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_ADC_L); 1488 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_ADC_R); 1489 snd_emu10k1_init_stereo_control(&controls[nctl++], "Analog Mix Playback Volume", gpr, 0); 1490 gpr += 2; 1491 /* Philips ADC Capture Volume */ 1492 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_ADC_L); 1493 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_ADC_R); 1494 snd_emu10k1_init_stereo_control(&controls[nctl++], "Analog Mix Capture Volume", gpr, 0); 1495 gpr += 2; 1496 1497 /* Aux2 Playback Volume */ 1498 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_AUX2_L); 1499 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_AUX2_R); 1500 snd_emu10k1_init_stereo_control(&controls[nctl++], 1501 emu->card_capabilities->ac97_chip ? "Aux2 Playback Volume" : "Aux Playback Volume", 1502 gpr, 0); 1503 gpr += 2; 1504 /* Aux2 Capture Volume */ 1505 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AUX2_L); 1506 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AUX2_R); 1507 snd_emu10k1_init_stereo_control(&controls[nctl++], 1508 emu->card_capabilities->ac97_chip ? "Aux2 Capture Volume" : "Aux Capture Volume", 1509 gpr, 0); 1510 gpr += 2; 1511 } 1431 1512 1432 1513 /* Stereo Mix Front Playback Volume */ 1433 A_OP(icode, &ptr, iMAC 0, A_GPR(playback), A_GPR(playback), A_GPR(gpr), A_GPR(stereo_mix));1434 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+1), A_GPR(playback+1), A_GPR(gpr+1), A_GPR(stereo_mix+1));1514 A_OP(icode, &ptr, iMAC1, A_GPR(playback), A_GPR(playback), A_GPR(gpr), A_GPR(stereo_mix)); 1515 A_OP(icode, &ptr, iMAC1, A_GPR(playback+1), A_GPR(playback+1), A_GPR(gpr+1), A_GPR(stereo_mix+1)); 1435 1516 snd_emu10k1_init_stereo_control(&controls[nctl++], "Front Playback Volume", gpr, 100); 1436 1517 gpr += 2; 1437 1518 1438 1519 /* Stereo Mix Surround Playback */ 1439 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+2), A_GPR(playback+2), A_GPR(gpr), A_GPR(stereo_mix));1440 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+3), A_GPR(playback+3), A_GPR(gpr+1), A_GPR(stereo_mix+1));1520 A_OP(icode, &ptr, iMAC1, A_GPR(playback+2), A_GPR(playback+2), A_GPR(gpr), A_GPR(stereo_mix)); 1521 A_OP(icode, &ptr, iMAC1, A_GPR(playback+3), A_GPR(playback+3), A_GPR(gpr+1), A_GPR(stereo_mix+1)); 1441 1522 snd_emu10k1_init_stereo_control(&controls[nctl++], "Surround Playback Volume", gpr, 0); 1442 1523 gpr += 2; … … 1444 1525 /* Stereo Mix Center Playback */ 1445 1526 /* Center = sub = Left/2 + Right/2 */ 1446 A_OP(icode, &ptr, iINTERP, A_GPR(tmp), A_GPR(stereo_mix), 0xcd, A_GPR(stereo_mix+1));1447 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+4), A_GPR(playback+4), A_GPR(gpr), A_GPR(tmp));1527 A_OP(icode, &ptr, iINTERP, A_GPR(tmp), A_GPR(stereo_mix), A_C_40000000, A_GPR(stereo_mix+1)); 1528 A_OP(icode, &ptr, iMAC1, A_GPR(playback+4), A_GPR(playback+4), A_GPR(gpr), A_GPR(tmp)); 1448 1529 snd_emu10k1_init_mono_control(&controls[nctl++], "Center Playback Volume", gpr, 0); 1449 1530 gpr++; 1450 1531 1451 1532 /* Stereo Mix LFE Playback */ 1452 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+5), A_GPR(playback+5), A_GPR(gpr), A_GPR(tmp));1533 A_OP(icode, &ptr, iMAC1, A_GPR(playback+5), A_GPR(playback+5), A_GPR(gpr), A_GPR(tmp)); 1453 1534 snd_emu10k1_init_mono_control(&controls[nctl++], "LFE Playback Volume", gpr, 0); 1454 1535 gpr++; … … 1456 1537 if (emu->card_capabilities->spk71) { 1457 1538 /* Stereo Mix Side Playback */ 1458 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+6), A_GPR(playback+6), A_GPR(gpr), A_GPR(stereo_mix));1459 A_OP(icode, &ptr, iMAC 0, A_GPR(playback+7), A_GPR(playback+7), A_GPR(gpr+1), A_GPR(stereo_mix+1));1539 A_OP(icode, &ptr, iMAC1, A_GPR(playback+6), A_GPR(playback+6), A_GPR(gpr), A_GPR(stereo_mix)); 1540 A_OP(icode, &ptr, iMAC1, A_GPR(playback+7), A_GPR(playback+7), A_GPR(gpr+1), A_GPR(stereo_mix+1)); 1460 1541 snd_emu10k1_init_stereo_control(&controls[nctl++], "Side Playback Volume", gpr, 0); 1461 1542 gpr += 2; … … 1482 1563 * Process tone control 1483 1564 */ 1484 A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), A_GPR(playback + 0), A_C_00000000, A_C_00000000); /* left */1485 A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), A_GPR(playback + 1), A_C_00000000, A_C_00000000); /* right */1486 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 */1487 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 */1488 A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), A_GPR(playback + 4), A_C_00000000, A_C_00000000); /* center */1489 A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), A_GPR(playback + 5), A_C_00000000, A_C_00000000); /* LFE */1490 if (emu->card_capabilities->spk71) {1491 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 */1492 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 */1493 }1494 1495 1496 1565 ctl = &controls[nctl + 0]; 1497 1566 ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER; … … 1512 1581 ctl->value[0] = ctl->value[1] = 20; 1513 1582 ctl->translation = EMU10K1_GPR_TRANSLATION_TREBLE; 1514 1515 #define BASS_GPR 0x8c1516 #define TREBLE_GPR 0x961517 1518 1583 for (z = 0; z < 5; z++) { 1519 1584 int j; 1520 1585 for (j = 0; j < 2; j++) { 1521 controls[nctl + 0].gpr[z * 2 + j] = BASS_GPR + z * 2 + j; 1522 controls[nctl + 1].gpr[z * 2 + j] = TREBLE_GPR + z * 2 + j; 1523 } 1524 } 1586 controls[nctl + 0].gpr[z * 2 + j] = bass_gpr + z * 2 + j; 1587 controls[nctl + 1].gpr[z * 2 + j] = treble_gpr + z * 2 + j; 1588 } 1589 } 1590 nctl += 2; 1591 1592 A_OP(icode, &ptr, iACC3, A_C_00000000, A_GPR(gpr), A_C_00000000, A_C_00000000); 1593 snd_emu10k1_init_mono_onoff_control(controls + nctl++, "Tone Control - Switch", gpr, 0); 1594 gpr++; 1595 A_OP(icode, &ptr, iSKIP, A_GPR_COND, A_GPR_COND, A_CC_REG_ZERO, A_GPR(gpr)); 1596 ptr_skip = ptr; 1525 1597 for (z = 0; z < 4; z++) { /* front/rear/center-lfe/side */ 1526 1598 int j, k, l, d; 1527 1599 for (j = 0; j < 2; j++) { /* left/right */ 1528 k = 0xb0+ (z * 8) + (j * 4);1529 l = 0xe0+ (z * 8) + (j * 4);1530 d = playback + SND_EMU10K1_PLAYBACK_CHANNELS +z * 2 + j;1531 1532 A_OP(icode, &ptr, iMAC0, A_C_00000000, A_C_00000000, A_GPR(d), A_GPR( BASS_GPR+ 0 + j));1533 A_OP(icode, &ptr, iMACMV, A_GPR(k+1), A_GPR(k), A_GPR(k+1), A_GPR( BASS_GPR+ 4 + j));1534 A_OP(icode, &ptr, iMACMV, A_GPR(k), A_GPR(d), A_GPR(k), A_GPR( BASS_GPR+ 2 + j));1535 A_OP(icode, &ptr, iMACMV, A_GPR(k+3), A_GPR(k+2), A_GPR(k+3), A_GPR( BASS_GPR+ 8 + j));1536 A_OP(icode, &ptr, iMAC0, A_GPR(k+2), A_GPR_ACCU, A_GPR(k+2), A_GPR( BASS_GPR+ 6 + j));1600 k = bass_tmp + (z * 8) + (j * 4); 1601 l = treble_tmp + (z * 8) + (j * 4); 1602 d = playback + z * 2 + j; 1603 1604 A_OP(icode, &ptr, iMAC0, A_C_00000000, A_C_00000000, A_GPR(d), A_GPR(bass_gpr + 0 + j)); 1605 A_OP(icode, &ptr, iMACMV, A_GPR(k+1), A_GPR(k), A_GPR(k+1), A_GPR(bass_gpr + 4 + j)); 1606 A_OP(icode, &ptr, iMACMV, A_GPR(k), A_GPR(d), A_GPR(k), A_GPR(bass_gpr + 2 + j)); 1607 A_OP(icode, &ptr, iMACMV, A_GPR(k+3), A_GPR(k+2), A_GPR(k+3), A_GPR(bass_gpr + 8 + j)); 1608 A_OP(icode, &ptr, iMAC0, A_GPR(k+2), A_GPR_ACCU, A_GPR(k+2), A_GPR(bass_gpr + 6 + j)); 1537 1609 A_OP(icode, &ptr, iACC3, A_GPR(k+2), A_GPR(k+2), A_GPR(k+2), A_C_00000000); 1538 1610 1539 A_OP(icode, &ptr, iMAC0, A_C_00000000, A_C_00000000, A_GPR(k+2), A_GPR( TREBLE_GPR+ 0 + j));1540 A_OP(icode, &ptr, iMACMV, A_GPR(l+1), A_GPR(l), A_GPR(l+1), A_GPR( TREBLE_GPR+ 4 + j));1541 A_OP(icode, &ptr, iMACMV, A_GPR(l), A_GPR(k+2), A_GPR(l), A_GPR( TREBLE_GPR+ 2 + j));1542 A_OP(icode, &ptr, iMACMV, A_GPR(l+3), A_GPR(l+2), A_GPR(l+3), A_GPR( TREBLE_GPR+ 8 + j));1543 A_OP(icode, &ptr, iMAC0, A_GPR(l+2), A_GPR_ACCU, A_GPR(l+2), A_GPR( TREBLE_GPR+ 6 + j));1611 A_OP(icode, &ptr, iMAC0, A_C_00000000, A_C_00000000, A_GPR(k+2), A_GPR(treble_gpr + 0 + j)); 1612 A_OP(icode, &ptr, iMACMV, A_GPR(l+1), A_GPR(l), A_GPR(l+1), A_GPR(treble_gpr + 4 + j)); 1613 A_OP(icode, &ptr, iMACMV, A_GPR(l), A_GPR(k+2), A_GPR(l), A_GPR(treble_gpr + 2 + j)); 1614 A_OP(icode, &ptr, iMACMV, A_GPR(l+3), A_GPR(l+2), A_GPR(l+3), A_GPR(treble_gpr + 8 + j)); 1615 A_OP(icode, &ptr, iMAC0, A_GPR(l+2), A_GPR_ACCU, A_GPR(l+2), A_GPR(treble_gpr + 6 + j)); 1544 1616 A_OP(icode, &ptr, iMACINT0, A_GPR(l+2), A_C_00000000, A_GPR(l+2), A_C_00000010); 1545 1617 … … 1550 1622 } 1551 1623 } 1552 nctl += 2; 1553 1554 #undef BASS_GPR 1555 #undef TREBLE_GPR 1556 1557 for (z = 0; z < 8; z++) { 1558 A_SWITCH(icode, &ptr, tmp + 0, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, gpr + 0); 1559 A_SWITCH_NEG(icode, &ptr, tmp + 1, gpr + 0); 1560 A_SWITCH(icode, &ptr, tmp + 1, playback + z, tmp + 1); 1561 A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000); 1562 } 1563 snd_emu10k1_init_stereo_onoff_control(controls + nctl++, "Tone Control - Switch", gpr, 0); 1564 gpr += 2; 1624 gpr_map[gpr++] = ptr - ptr_skip; 1565 1625 1566 1626 /* Master volume (will be renamed later) */ 1567 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)); 1568 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)); 1569 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)); 1570 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)); 1571 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)); 1572 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)); 1573 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)); 1574 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)); 1627 for (z = 0; z < 8; z++) 1628 A_OP(icode, &ptr, iMAC1, A_GPR(playback+z), A_C_00000000, A_GPR(gpr), A_GPR(playback+z)); 1575 1629 snd_emu10k1_init_mono_control(&controls[nctl++], "Wave Master Playback Volume", gpr, 0); 1576 gpr += 2; 1577 1578 /* analog speakers */ 1579 A_PUT_STEREO_OUTPUT(A_EXTOUT_AFRONT_L, A_EXTOUT_AFRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); 1580 A_PUT_STEREO_OUTPUT(A_EXTOUT_AREAR_L, A_EXTOUT_AREAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS); 1581 A_PUT_OUTPUT(A_EXTOUT_ACENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS); 1582 A_PUT_OUTPUT(A_EXTOUT_ALFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS); 1583 if (emu->card_capabilities->spk71) 1584 A_PUT_STEREO_OUTPUT(A_EXTOUT_ASIDE_L, A_EXTOUT_ASIDE_R, playback+6 + SND_EMU10K1_PLAYBACK_CHANNELS); 1585 1586 /* headphone */ 1587 A_PUT_STEREO_OUTPUT(A_EXTOUT_HEADPHONE_L, A_EXTOUT_HEADPHONE_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); 1588 1589 /* digital outputs */ 1590 /* A_PUT_STEREO_OUTPUT(A_EXTOUT_FRONT_L, A_EXTOUT_FRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); */ 1630 gpr++; 1631 1591 1632 if (emu->card_capabilities->emu_model) { 1592 1633 /* EMU1010 Outputs from PCM Front, Rear, Center, LFE, Side */ … … 1594 1635 for (z = 0; z < 8; z++) { 1595 1636 if (emu->card_capabilities->ca0108_chip) { 1596 A_OP(icode, &ptr, iACC3, A3_EMU32OUT(z), A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +z), A_C_00000000, A_C_00000000);1637 A_OP(icode, &ptr, iACC3, A3_EMU32OUT(z), A_GPR(playback + z), A_C_00000000, A_C_00000000); 1597 1638 } else { 1598 A_OP(icode, &ptr, iACC3, A_EMU32OUTL(z), A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +z), A_C_00000000, A_C_00000000);1639 A_OP(icode, &ptr, iACC3, A_EMU32OUTL(z), A_GPR(playback + z), A_C_00000000, A_C_00000000); 1599 1640 } 1600 1641 } 1601 } 1602 1603 /* IEC958 Optical Raw Playback Switch */ 1604 gpr_map[gpr++] = 0; 1605 gpr_map[gpr++] = 0x1008; 1606 gpr_map[gpr++] = 0xffff0000; 1607 for (z = 0; z < 2; z++) { 1608 A_OP(icode, &ptr, iMAC0, A_GPR(tmp + 2), A_FXBUS(FXBUS_PT_LEFT + z), A_C_00000000, A_C_00000000); 1609 A_OP(icode, &ptr, iSKIP, A_GPR_COND, A_GPR_COND, A_GPR(gpr - 2), A_C_00000001); 1610 A_OP(icode, &ptr, iACC3, A_GPR(tmp + 2), A_C_00000000, A_C_00010000, A_GPR(tmp + 2)); 1611 A_OP(icode, &ptr, iANDXOR, A_GPR(tmp + 2), A_GPR(tmp + 2), A_GPR(gpr - 1), A_C_00000000); 1612 A_SWITCH(icode, &ptr, tmp + 0, tmp + 2, gpr + z); 1613 A_SWITCH_NEG(icode, &ptr, tmp + 1, gpr + z); 1614 A_SWITCH(icode, &ptr, tmp + 1, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, tmp + 1); 1615 if ((z==1) && (emu->card_capabilities->spdif_bug)) { 1616 /* Due to a SPDIF output bug on some Audigy cards, this code delays the Right channel by 1 sample */ 1617 dev_info(emu->card->dev, 1618 "Installing spdif_bug patch: %s\n", 1619 emu->card_capabilities->name); 1620 A_OP(icode, &ptr, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L + z), A_GPR(gpr - 3), A_C_00000000, A_C_00000000); 1621 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 3), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000); 1622 } else { 1623 A_OP(icode, &ptr, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L + z), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000); 1624 } 1625 } 1626 snd_emu10k1_init_stereo_onoff_control(controls + nctl++, SNDRV_CTL_NAME_IEC958("Optical Raw ",PLAYBACK,SWITCH), gpr, 0); 1627 gpr += 2; 1628 1629 A_PUT_STEREO_OUTPUT(A_EXTOUT_REAR_L, A_EXTOUT_REAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS); 1630 A_PUT_OUTPUT(A_EXTOUT_CENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS); 1631 A_PUT_OUTPUT(A_EXTOUT_LFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS); 1642 } else { 1643 /* analog speakers */ 1644 A_PUT_STEREO_OUTPUT(A_EXTOUT_AFRONT_L, A_EXTOUT_AFRONT_R, playback); 1645 A_PUT_STEREO_OUTPUT(A_EXTOUT_AREAR_L, A_EXTOUT_AREAR_R, playback+2); 1646 A_PUT_OUTPUT(A_EXTOUT_ACENTER, playback+4); 1647 A_PUT_OUTPUT(A_EXTOUT_ALFE, playback+5); 1648 if (emu->card_capabilities->spk71) 1649 A_PUT_STEREO_OUTPUT(A_EXTOUT_ASIDE_L, A_EXTOUT_ASIDE_R, playback+6); 1650 1651 /* headphone */ 1652 A_PUT_STEREO_OUTPUT(A_EXTOUT_HEADPHONE_L, A_EXTOUT_HEADPHONE_R, playback); 1653 1654 /* IEC958 Optical Raw Playback Switch */ 1655 gpr_map[gpr++] = 0; 1656 gpr_map[gpr++] = 0x1008; 1657 gpr_map[gpr++] = 0xffff0000; 1658 for (z = 0; z < 2; z++) { 1659 A_OP(icode, &ptr, iMAC0, A_GPR(tmp + 2), A_FXBUS(FXBUS_PT_LEFT + z), A_C_00000000, A_C_00000000); 1660 A_OP(icode, &ptr, iSKIP, A_GPR_COND, A_GPR_COND, A_GPR(gpr - 2), A_C_00000001); 1661 A_OP(icode, &ptr, iACC3, A_GPR(tmp + 2), A_C_00000000, A_C_00010000, A_GPR(tmp + 2)); 1662 A_OP(icode, &ptr, iANDXOR, A_GPR(tmp + 2), A_GPR(tmp + 2), A_GPR(gpr - 1), A_C_00000000); 1663 A_SWITCH(icode, &ptr, tmp + 0, tmp + 2, gpr + z); 1664 A_SWITCH_NEG(icode, &ptr, tmp + 1, gpr + z); 1665 A_SWITCH(icode, &ptr, tmp + 1, playback + z, tmp + 1); 1666 if ((z==1) && (emu->card_capabilities->spdif_bug)) { 1667 /* Due to a SPDIF output bug on some Audigy cards, this code delays the Right channel by 1 sample */ 1668 dev_info(emu->card->dev, 1669 "Installing spdif_bug patch: %s\n", 1670 emu->card_capabilities->name); 1671 A_OP(icode, &ptr, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L + z), A_GPR(gpr - 3), A_C_00000000, A_C_00000000); 1672 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 3), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000); 1673 } else { 1674 A_OP(icode, &ptr, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L + z), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000); 1675 } 1676 } 1677 snd_emu10k1_init_stereo_onoff_control(controls + nctl++, SNDRV_CTL_NAME_IEC958("Optical Raw ",PLAYBACK,SWITCH), gpr, 0); 1678 gpr += 2; 1679 1680 A_PUT_STEREO_OUTPUT(A_EXTOUT_REAR_L, A_EXTOUT_REAR_R, playback+2); 1681 A_PUT_OUTPUT(A_EXTOUT_CENTER, playback+4); 1682 A_PUT_OUTPUT(A_EXTOUT_LFE, playback+5); 1683 } 1632 1684 1633 1685 /* ADC buffer */ 1634 1686 #ifdef EMU10K1_CAPTURE_DIGITAL_OUT 1635 A_PUT_STEREO_OUTPUT(A_EXTOUT_ADC_CAP_L, A_EXTOUT_ADC_CAP_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);1687 A_PUT_STEREO_OUTPUT(A_EXTOUT_ADC_CAP_L, A_EXTOUT_ADC_CAP_R, playback); 1636 1688 #else 1637 1689 A_PUT_OUTPUT(A_EXTOUT_ADC_CAP_L, capture); … … 1640 1692 1641 1693 if (emu->card_capabilities->emu_model) { 1694 /* Capture 16 channels of S32_LE sound. */ 1642 1695 if (emu->card_capabilities->ca0108_chip) { 1643 1696 dev_info(emu->card->dev, "EMU2 inputs on\n"); 1644 for (z = 0; z < 0x10; z++) { 1697 /* Note that the Tina[2] DSPs have 16 more EMU32 inputs which we don't use. */ 1698 1699 snd_emu10k1_audigy_dsp_convert_32_to_2x16( 1700 icode, &ptr, tmp, bit_shifter16, A3_EMU32IN(0), A_FXBUS2(0)); 1701 // A3_EMU32IN(0) is delayed by one sample, so all other A3_EMU32IN channels 1702 // need to be delayed as well; we use an auxiliary register for that. 1703 for (z = 1; z < 0x10; z++) { 1645 1704 snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, 1646 1705 bit_shifter16, 1647 A 3_EMU32IN(z),1706 A_GPR(gpr), 1648 1707 A_FXBUS2(z*2) ); 1708 A_OP(icode, &ptr, iACC3, A_GPR(gpr), A3_EMU32IN(z), A_C_00000000, A_C_00000000); 1709 gpr_map[gpr++] = 0x00000000; 1649 1710 } 1650 1711 } else { 1651 1712 dev_info(emu->card->dev, "EMU inputs on\n"); 1652 /* Capture 16 (originally 8) channels of S32_LE sound*/1713 /* Note that the Alice2 DSPs have 6 I2S inputs which we don't use. */ 1653 1714 1654 1715 /* … … 1656 1717 gpr, tmp); 1657 1718 */ 1658 /* For the EMU1010: How to get 32bit values from the DSP. High 16bits into L, low 16bits into R. */1659 /* A_P16VIN(0) is delayed by one sample,1660 * so all other A_P16VIN channels will need to also be delayed1661 */1662 /* Left ADC in. 1 of 2 */1663 1719 snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_P16VIN(0x0), A_FXBUS2(0) ); 1664 /* Right ADC in 1 of 2 */ 1665 gpr_map[gpr++] = 0x00000000; 1666 /* Delaying by one sample: instead of copying the input 1667 * value A_P16VIN to output A_FXBUS2 as in the first channel, 1668 * we use an auxiliary register, delaying the value by one 1669 * sample 1670 */ 1671 snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(2) ); 1672 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x1), A_C_00000000, A_C_00000000); 1673 gpr_map[gpr++] = 0x00000000; 1674 snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(4) ); 1675 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x2), A_C_00000000, A_C_00000000); 1676 gpr_map[gpr++] = 0x00000000; 1677 snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(6) ); 1678 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x3), A_C_00000000, A_C_00000000); 1679 /* For 96kHz mode */ 1680 /* Left ADC in. 2 of 2 */ 1681 gpr_map[gpr++] = 0x00000000; 1682 snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0x8) ); 1683 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x4), A_C_00000000, A_C_00000000); 1684 /* Right ADC in 2 of 2 */ 1685 gpr_map[gpr++] = 0x00000000; 1686 snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xa) ); 1687 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x5), A_C_00000000, A_C_00000000); 1688 gpr_map[gpr++] = 0x00000000; 1689 snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xc) ); 1690 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x6), A_C_00000000, A_C_00000000); 1691 gpr_map[gpr++] = 0x00000000; 1692 snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xe) ); 1693 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x7), A_C_00000000, A_C_00000000); 1694 /* Pavel Hofman - we still have voices, A_FXBUS2s, and 1695 * A_P16VINs available - 1696 * let's add 8 more capture channels - total of 16 1697 */ 1698 gpr_map[gpr++] = 0x00000000; 1699 snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp, 1700 bit_shifter16, 1701 A_GPR(gpr - 1), 1702 A_FXBUS2(0x10)); 1703 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x8), 1704 A_C_00000000, A_C_00000000); 1705 gpr_map[gpr++] = 0x00000000; 1706 snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp, 1707 bit_shifter16, 1708 A_GPR(gpr - 1), 1709 A_FXBUS2(0x12)); 1710 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x9), 1711 A_C_00000000, A_C_00000000); 1712 gpr_map[gpr++] = 0x00000000; 1713 snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp, 1714 bit_shifter16, 1715 A_GPR(gpr - 1), 1716 A_FXBUS2(0x14)); 1717 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xa), 1718 A_C_00000000, A_C_00000000); 1719 gpr_map[gpr++] = 0x00000000; 1720 snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp, 1721 bit_shifter16, 1722 A_GPR(gpr - 1), 1723 A_FXBUS2(0x16)); 1724 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xb), 1725 A_C_00000000, A_C_00000000); 1726 gpr_map[gpr++] = 0x00000000; 1727 snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp, 1728 bit_shifter16, 1729 A_GPR(gpr - 1), 1730 A_FXBUS2(0x18)); 1731 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xc), 1732 A_C_00000000, A_C_00000000); 1733 gpr_map[gpr++] = 0x00000000; 1734 snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp, 1735 bit_shifter16, 1736 A_GPR(gpr - 1), 1737 A_FXBUS2(0x1a)); 1738 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xd), 1739 A_C_00000000, A_C_00000000); 1740 gpr_map[gpr++] = 0x00000000; 1741 snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp, 1742 bit_shifter16, 1743 A_GPR(gpr - 1), 1744 A_FXBUS2(0x1c)); 1745 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xe), 1746 A_C_00000000, A_C_00000000); 1747 gpr_map[gpr++] = 0x00000000; 1748 snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp, 1749 bit_shifter16, 1750 A_GPR(gpr - 1), 1751 A_FXBUS2(0x1e)); 1752 A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xf), 1753 A_C_00000000, A_C_00000000); 1720 /* A_P16VIN(0) is delayed by one sample, so all other A_P16VIN channels 1721 * will need to also be delayed; we use an auxiliary register for that. */ 1722 for (z = 1; z < 0x10; z++) { 1723 snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr), A_FXBUS2(z * 2) ); 1724 A_OP(icode, &ptr, iACC3, A_GPR(gpr), A_P16VIN(z), A_C_00000000, A_C_00000000); 1725 gpr_map[gpr++] = 0x00000000; 1726 } 1754 1727 } 1755 1728 … … 1775 1748 */ 1776 1749 1777 if (gpr > tmp) {1750 if (gpr > 512) { 1778 1751 snd_BUG(); 1779 1752 err = -EIO; 1780 1753 goto __err; 1781 1754 } 1755 1782 1756 /* clear remaining instruction memory */ 1783 1757 while (ptr < 0x400) … … 1804 1778 */ 1805 1779 1806 /* when volume = max, then copy only to avoid volume modification */ 1807 /* with iMAC0 (negative values) */ 1780 /* Volumes are in the [-2^31, 0] range, zero being mute. */ 1808 1781 static void _volume(struct snd_emu10k1_fx8010_code *icode, u32 *ptr, u32 dst, u32 src, u32 vol) 1809 1782 { 1810 OP(icode, ptr, iMAC0, dst, C_00000000, src, vol); 1811 OP(icode, ptr, iANDXOR, C_00000000, vol, C_ffffffff, C_7fffffff); 1812 OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000001); 1813 OP(icode, ptr, iACC3, dst, src, C_00000000, C_00000000); 1783 OP(icode, ptr, iMAC1, dst, C_00000000, src, vol); 1814 1784 } 1815 1785 static void _volume_add(struct snd_emu10k1_fx8010_code *icode, u32 *ptr, u32 dst, u32 src, u32 vol) 1816 1786 { 1817 OP(icode, ptr, iANDXOR, C_00000000, vol, C_ffffffff, C_7fffffff); 1818 OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000002); 1819 OP(icode, ptr, iMACINT0, dst, dst, src, C_00000001); 1820 OP(icode, ptr, iSKIP, C_00000000, C_7fffffff, C_7fffffff, C_00000001); 1821 OP(icode, ptr, iMAC0, dst, dst, src, vol); 1822 } 1823 static void _volume_out(struct snd_emu10k1_fx8010_code *icode, u32 *ptr, u32 dst, u32 src, u32 vol) 1824 { 1825 OP(icode, ptr, iANDXOR, C_00000000, vol, C_ffffffff, C_7fffffff); 1826 OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000002); 1827 OP(icode, ptr, iACC3, dst, src, C_00000000, C_00000000); 1828 OP(icode, ptr, iSKIP, C_00000000, C_7fffffff, C_7fffffff, C_00000001); 1829 OP(icode, ptr, iMAC0, dst, C_00000000, src, vol); 1787 OP(icode, ptr, iMAC1, dst, dst, src, vol); 1830 1788 } 1831 1789 … … 1839 1797 _volume_add(icode, ptr, GPR(dst), EXTIN(src), GPR(vol)) 1840 1798 #define VOLUME_OUT(icode, ptr, dst, src, vol) \ 1841 _volume _out(icode, ptr, EXTOUT(dst), GPR(src), GPR(vol))1799 _volume(icode, ptr, EXTOUT(dst), GPR(src), GPR(vol)) 1842 1800 #define _SWITCH(icode, ptr, dst, src, sw) \ 1843 1801 OP((icode), ptr, iMACINT0, dst, C_00000000, src, sw); … … 1855 1813 { 1856 1814 int err, i, z, gpr, tmp, playback, capture; 1857 u32 ptr ;1815 u32 ptr, ptr_skip; 1858 1816 struct snd_emu10k1_fx8010_code *icode; 1859 1817 struct snd_emu10k1_fx8010_pcm_rec *ipcm = NULL; … … 1888 1846 1889 1847 /* clear free GPRs */ 1890 for (i = 0; i < 256; i++) 1891 set_bit(i, icode->gpr_valid); 1848 memset(icode->gpr_valid, 0xff, 256 / 8); 1892 1849 1893 1850 /* clear TRAM data & address lines */ 1894 for (i = 0; i < 160; i++) 1895 set_bit(i, icode->tram_valid); 1851 memset(icode->tram_valid, 0xff, 160 / 8); 1896 1852 1897 1853 strcpy(icode->name, "SB Live! FX8010 code for ALSA v1.2 by Jaroslav Kysela"); … … 1900 1856 playback = SND_EMU10K1_INPUTS; 1901 1857 /* we have 6 playback channels and tone control doubles */ 1902 capture = playback + (SND_EMU10K1_PLAYBACK_CHANNELS * 2);1858 capture = playback + SND_EMU10K1_PLAYBACK_CHANNELS; 1903 1859 gpr = capture + SND_EMU10K1_CAPTURE_CHANNELS; 1904 1860 tmp = 0x88; /* we need 4 temporary GPR */ 1905 1861 /* from 0x8c to 0xff is the area for tone control */ 1906 1862 1907 /* stop FX processor */1908 snd_emu10k1_ptr_write(emu, DBG, 0, (emu->fx8010.dbg = 0) | EMU10K1_DBG_SINGLE_STEP);1909 1910 1863 /* 1911 1864 * Process FX Buses 1912 1865 */ 1913 OP(icode, &ptr, iMACINT0, GPR(0), C_00000000, FXBUS(FXBUS_PCM_LEFT), C_0000000 4);1914 OP(icode, &ptr, iMACINT0, GPR(1), C_00000000, FXBUS(FXBUS_PCM_RIGHT), C_0000000 4);1915 OP(icode, &ptr, iMACINT0, GPR(2), C_00000000, FXBUS(FXBUS_MIDI_LEFT), C_0000000 4);1916 OP(icode, &ptr, iMACINT0, GPR(3), C_00000000, FXBUS(FXBUS_MIDI_RIGHT), C_0000000 4);1917 OP(icode, &ptr, iMACINT0, GPR(4), C_00000000, FXBUS(FXBUS_PCM_LEFT_REAR), C_0000000 4);1918 OP(icode, &ptr, iMACINT0, GPR(5), C_00000000, FXBUS(FXBUS_PCM_RIGHT_REAR), C_0000000 4);1919 OP(icode, &ptr, iMACINT0, GPR(6), C_00000000, FXBUS(FXBUS_PCM_CENTER), C_0000000 4);1920 OP(icode, &ptr, iMACINT0, GPR(7), C_00000000, FXBUS(FXBUS_PCM_LFE), C_0000000 4);1866 OP(icode, &ptr, iMACINT0, GPR(0), C_00000000, FXBUS(FXBUS_PCM_LEFT), C_00000008); 1867 OP(icode, &ptr, iMACINT0, GPR(1), C_00000000, FXBUS(FXBUS_PCM_RIGHT), C_00000008); 1868 OP(icode, &ptr, iMACINT0, GPR(2), C_00000000, FXBUS(FXBUS_MIDI_LEFT), C_00000008); 1869 OP(icode, &ptr, iMACINT0, GPR(3), C_00000000, FXBUS(FXBUS_MIDI_RIGHT), C_00000008); 1870 OP(icode, &ptr, iMACINT0, GPR(4), C_00000000, FXBUS(FXBUS_PCM_LEFT_REAR), C_00000008); 1871 OP(icode, &ptr, iMACINT0, GPR(5), C_00000000, FXBUS(FXBUS_PCM_RIGHT_REAR), C_00000008); 1872 OP(icode, &ptr, iMACINT0, GPR(6), C_00000000, FXBUS(FXBUS_PCM_CENTER), C_00000008); 1873 OP(icode, &ptr, iMACINT0, GPR(7), C_00000000, FXBUS(FXBUS_PCM_LFE), C_00000008); 1921 1874 OP(icode, &ptr, iMACINT0, GPR(8), C_00000000, C_00000000, C_00000000); /* S/PDIF left */ 1922 1875 OP(icode, &ptr, iMACINT0, GPR(9), C_00000000, C_00000000, C_00000000); /* S/PDIF right */ 1923 OP(icode, &ptr, iMACINT0, GPR(10), C_00000000, FXBUS(FXBUS_PCM_LEFT_FRONT), C_0000000 4);1924 OP(icode, &ptr, iMACINT0, GPR(11), C_00000000, FXBUS(FXBUS_PCM_RIGHT_FRONT), C_0000000 4);1876 OP(icode, &ptr, iMACINT0, GPR(10), C_00000000, FXBUS(FXBUS_PCM_LEFT_FRONT), C_00000008); 1877 OP(icode, &ptr, iMACINT0, GPR(11), C_00000000, FXBUS(FXBUS_PCM_RIGHT_FRONT), C_00000008); 1925 1878 1926 1879 /* Raw S/PDIF PCM */ … … 2016 1969 /* Wave Center/LFE Playback Volume */ 2017 1970 OP(icode, &ptr, iACC3, GPR(tmp + 0), FXBUS(FXBUS_PCM_LEFT), FXBUS(FXBUS_PCM_RIGHT), C_00000000); 2018 OP(icode, &ptr, iMACINT0, GPR(tmp + 0), C_00000000, GPR(tmp + 0), C_0000000 2);1971 OP(icode, &ptr, iMACINT0, GPR(tmp + 0), C_00000000, GPR(tmp + 0), C_00000004); 2019 1972 VOLUME(icode, &ptr, playback + 4, tmp + 0, gpr); 2020 1973 snd_emu10k1_init_mono_control(controls + i++, "Wave Center Playback Volume", gpr++, 0); … … 2207 2160 * Process tone control 2208 2161 */ 2209 OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), GPR(playback + 0), C_00000000, C_00000000); /* left */2210 OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), GPR(playback + 1), C_00000000, C_00000000); /* right */2211 OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 2), GPR(playback + 2), C_00000000, C_00000000); /* rear left */2212 OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 3), GPR(playback + 3), C_00000000, C_00000000); /* rear right */2213 OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), GPR(playback + 4), C_00000000, C_00000000); /* center */2214 OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), GPR(playback + 5), C_00000000, C_00000000); /* LFE */2215 2216 2162 ctl = &controls[i + 0]; 2217 2163 ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER; … … 2245 2191 } 2246 2192 } 2193 i += 2; 2194 2195 OP(icode, &ptr, iACC3, C_00000000, GPR(gpr), C_00000000, C_00000000); 2196 snd_emu10k1_init_mono_onoff_control(controls + i++, "Tone Control - Switch", gpr, 0); 2197 gpr++; 2198 OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_ZERO, GPR(gpr)); 2199 ptr_skip = ptr; 2247 2200 for (z = 0; z < 3; z++) { /* front/rear/center-lfe */ 2248 2201 int j, k, l, d; … … 2250 2203 k = 0xa0 + (z * 8) + (j * 4); 2251 2204 l = 0xd0 + (z * 8) + (j * 4); 2252 d = playback + SND_EMU10K1_PLAYBACK_CHANNELS +z * 2 + j;2205 d = playback + z * 2 + j; 2253 2206 2254 2207 OP(icode, &ptr, iMAC0, C_00000000, C_00000000, GPR(d), GPR(BASS_GPR + 0 + j)); … … 2272 2225 } 2273 2226 } 2274 i += 2;2227 gpr_map[gpr++] = ptr - ptr_skip; 2275 2228 2276 2229 #undef BASS_GPR 2277 2230 #undef TREBLE_GPR 2278 2279 for (z = 0; z < 6; z++) {2280 SWITCH(icode, &ptr, tmp + 0, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, gpr + 0);2281 SWITCH_NEG(icode, &ptr, tmp + 1, gpr + 0);2282 SWITCH(icode, &ptr, tmp + 1, playback + z, tmp + 1);2283 OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), GPR(tmp + 0), GPR(tmp + 1), C_00000000);2284 }2285 snd_emu10k1_init_stereo_onoff_control(controls + i++, "Tone Control - Switch", gpr, 0);2286 gpr += 2;2287 2231 2288 2232 /* … … 2293 2237 2294 2238 for (z = 0; z < 2; z++) 2295 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_L + z), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +z), C_00000000, C_00000000);2239 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_L + z), GPR(playback + z), C_00000000, C_00000000); 2296 2240 } 2297 2241 … … 2302 2246 SWITCH(icode, &ptr, tmp + 0, 8 + z, gpr + z); 2303 2247 SWITCH_NEG(icode, &ptr, tmp + 1, gpr + z); 2304 SWITCH(icode, &ptr, tmp + 1, playback + SND_EMU10K1_PLAYBACK_CHANNELS +z, tmp + 1);2248 SWITCH(icode, &ptr, tmp + 1, playback + z, tmp + 1); 2305 2249 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_TOSLINK_L + z), GPR(tmp + 0), GPR(tmp + 1), C_00000000); 2306 2250 #ifdef EMU10K1_CAPTURE_DIGITAL_OUT … … 2317 2261 2318 2262 for (z = 0; z < 2; z++) { 2319 SWITCH(icode, &ptr, tmp + 0, playback + SND_EMU10K1_PLAYBACK_CHANNELS +4 + z, gpr + 2 + z);2263 SWITCH(icode, &ptr, tmp + 0, playback + 4 + z, gpr + 2 + z); 2320 2264 SWITCH_NEG(icode, &ptr, tmp + 1, gpr + 2 + z); 2321 SWITCH(icode, &ptr, tmp + 1, playback + SND_EMU10K1_PLAYBACK_CHANNELS +z, tmp + 1);2265 SWITCH(icode, &ptr, tmp + 1, playback + z, tmp + 1); 2322 2266 OP(icode, &ptr, iACC3, GPR(tmp + 0), GPR(tmp + 0), GPR(tmp + 1), C_00000000); 2323 2267 VOLUME_OUT(icode, &ptr, EXTOUT_HEADPHONE_L + z, tmp + 0, gpr + z); … … 2336 2280 if (emu->fx8010.extout_mask & ((1<<EXTOUT_REAR_L)|(1<<EXTOUT_REAR_R))) 2337 2281 for (z = 0; z < 2; z++) 2338 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_REAR_L + z), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +2 + z), C_00000000, C_00000000);2282 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_REAR_L + z), GPR(playback + 2 + z), C_00000000, C_00000000); 2339 2283 2340 2284 if (emu->fx8010.extout_mask & ((1<<EXTOUT_AC97_REAR_L)|(1<<EXTOUT_AC97_REAR_R))) 2341 2285 for (z = 0; z < 2; z++) 2342 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_REAR_L + z), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +2 + z), C_00000000, C_00000000);2286 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_REAR_L + z), GPR(playback + 2 + z), C_00000000, C_00000000); 2343 2287 2344 2288 if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_CENTER)) { 2345 2289 #ifndef EMU10K1_CENTER_LFE_FROM_FRONT 2346 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_CENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +4), C_00000000, C_00000000);2347 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ACENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +4), C_00000000, C_00000000);2290 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_CENTER), GPR(playback + 4), C_00000000, C_00000000); 2291 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ACENTER), GPR(playback + 4), C_00000000, C_00000000); 2348 2292 #else 2349 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_CENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +0), C_00000000, C_00000000);2350 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ACENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +0), C_00000000, C_00000000);2293 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_CENTER), GPR(playback + 0), C_00000000, C_00000000); 2294 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ACENTER), GPR(playback + 0), C_00000000, C_00000000); 2351 2295 #endif 2352 2296 } … … 2354 2298 if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_LFE)) { 2355 2299 #ifndef EMU10K1_CENTER_LFE_FROM_FRONT 2356 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_LFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +5), C_00000000, C_00000000);2357 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ALFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +5), C_00000000, C_00000000);2300 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_LFE), GPR(playback + 5), C_00000000, C_00000000); 2301 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ALFE), GPR(playback + 5), C_00000000, C_00000000); 2358 2302 #else 2359 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_LFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +1), C_00000000, C_00000000);2360 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ALFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS +1), C_00000000, C_00000000);2303 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_LFE), GPR(playback + 1), C_00000000, C_00000000); 2304 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ALFE), GPR(playback + 1), C_00000000, C_00000000); 2361 2305 #endif 2362 2306 } … … 2372 2316 /* EFX capture - capture the 16 EXTINS */ 2373 2317 if (emu->card_capabilities->sblive51) { 2374 /* On the Live! 5.1, FXBUS2(1) and FXBUS(2) are shared with EXTOUT_ACENTER 2375 * and EXTOUT_ALFE, so we can't connect inputs to them for multitrack recording. 2376 * 2377 * Since only 14 of the 16 EXTINs are used, this is not a big problem. 2378 * We route AC97L and R to FX capture 14 and 15, SPDIF CD in to FX capture 2379 * 0 and 3, then the rest of the EXTINs to the corresponding FX capture 2380 * channel. Multitrack recorders will still see the center/lfe output signal 2381 * on the second and third channels. 2382 */ 2383 OP(icode, &ptr, iACC3, FXBUS2(14), C_00000000, C_00000000, EXTIN(0)); 2384 OP(icode, &ptr, iACC3, FXBUS2(15), C_00000000, C_00000000, EXTIN(1)); 2385 OP(icode, &ptr, iACC3, FXBUS2(0), C_00000000, C_00000000, EXTIN(2)); 2386 OP(icode, &ptr, iACC3, FXBUS2(3), C_00000000, C_00000000, EXTIN(3)); 2387 for (z = 4; z < 14; z++) 2388 OP(icode, &ptr, iACC3, FXBUS2(z), C_00000000, C_00000000, EXTIN(z)); 2318 for (z = 0; z < 16; z++) { 2319 s8 c = snd_emu10k1_sblive51_fxbus2_map[z]; 2320 if (c != -1) 2321 OP(icode, &ptr, iACC3, FXBUS2(z), C_00000000, C_00000000, EXTIN(c)); 2322 } 2389 2323 } else { 2390 2324 for (z = 0; z < 16; z++) … … 2486 2420 spin_unlock_irq(&emu->emu_lock); 2487 2421 snd_emu10k1_ptr_write(emu, TCB, 0, 0); 2488 snd_emu10k1_ptr_write(emu, TCBS, 0, 0);2422 snd_emu10k1_ptr_write(emu, TCBS, 0, TCBS_BUFFSIZE_16K); 2489 2423 if (emu->fx8010.etram_pages.area != NULL) { 2490 2424 snd_dma_free_pages(&emu->fx8010.etram_pages); … … 2525 2459 { 2526 2460 const char * const *fxbus, * const *extin, * const *extout; 2527 unsigned short fxbus_mask,extin_mask, extout_mask;2461 unsigned short extin_mask, extout_mask; 2528 2462 int res; 2529 2463 2530 2464 info->internal_tram_size = emu->fx8010.itram_size; 2531 2465 info->external_tram_size = emu->fx8010.etram_pages.bytes / 2; 2532 fxbus = fxbuses; 2533 extin = emu->audigy ? audigy_ins : creative_ins; 2534 extout = emu->audigy ? audigy_outs : creative_outs; 2535 fxbus_mask = emu->fx8010.fxbus_mask; 2536 extin_mask = emu->fx8010.extin_mask; 2537 extout_mask = emu->fx8010.extout_mask; 2466 fxbus = snd_emu10k1_fxbus; 2467 extin = emu->audigy ? snd_emu10k1_audigy_ins : snd_emu10k1_sblive_ins; 2468 extout = emu->audigy ? snd_emu10k1_audigy_outs : snd_emu10k1_sblive_outs; 2469 extin_mask = emu->audigy ? ~0 : emu->fx8010.extin_mask; 2470 extout_mask = emu->audigy ? ~0 : emu->fx8010.extout_mask; 2538 2471 for (res = 0; res < 16; res++, fxbus++, extin++, extout++) { 2539 copy_string(info->fxbus_names[res], fxbus_mask & (1 << res) ? *fxbus : NULL, "FXBUS", res);2472 copy_string(info->fxbus_names[res], *fxbus, "FXBUS", res); 2540 2473 copy_string(info->extin_names[res], extin_mask & (1 << res) ? *extin : NULL, "Unused", res); 2541 2474 copy_string(info->extout_names[res], extout_mask & (1 << res) ? *extout : NULL, "Unused", res); … … 2653 2586 if (get_user(addr, (unsigned int __user *)argp)) 2654 2587 return -EFAULT; 2655 if (addr > 0x1ff) 2656 return -EINVAL; 2657 if (emu->audigy) 2658 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP | addr); 2659 else 2660 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP | addr); 2661 udelay(10); 2662 if (emu->audigy) 2663 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP | A_DBG_STEP_ADDR | addr); 2664 else 2665 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP | EMU10K1_DBG_STEP | addr); 2588 if (emu->audigy) { 2589 if (addr > A_DBG_STEP_ADDR) 2590 return -EINVAL; 2591 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP); 2592 udelay(10); 2593 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_STEP | addr); 2594 } else { 2595 if (addr > EMU10K1_DBG_SINGLE_STEP_ADDR) 2596 return -EINVAL; 2597 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP); 2598 udelay(10); 2599 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_STEP | addr); 2600 } 2666 2601 return 0; 2667 2602 case SNDRV_EMU10K1_IOCTL_DBG_READ:
Note:
See TracChangeset
for help on using the changeset viewer.