emumixer.c (f69d705d3972fae19b4b00c7643efdd3d2953f25) | emumixer.c (6f3609f8a3da1214cd78f8a8a2ee2dab8fcc4505) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright (c) by Jaroslav Kysela <perex@perex.cz>, 4 * Takashi Iwai <tiwai@suse.de> 5 * Creative Labs, Inc. 6 * Routines for control of EMU10K1 chips / mixer routines 7 * Multichannel PCM support Copyright (c) Lee Revell <rlrevell@joe-job.com> 8 * --- 130 unchanged lines hidden (view full) --- 139 EMU_SRC_ALICE_EMU32B+9, \ 140 EMU_SRC_ALICE_EMU32B+0xa, \ 141 EMU_SRC_ALICE_EMU32B+0xb, \ 142 EMU_SRC_ALICE_EMU32B+0xc, \ 143 EMU_SRC_ALICE_EMU32B+0xd, \ 144 EMU_SRC_ALICE_EMU32B+0xe, \ 145 EMU_SRC_ALICE_EMU32B+0xf 146 | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright (c) by Jaroslav Kysela <perex@perex.cz>, 4 * Takashi Iwai <tiwai@suse.de> 5 * Creative Labs, Inc. 6 * Routines for control of EMU10K1 chips / mixer routines 7 * Multichannel PCM support Copyright (c) Lee Revell <rlrevell@joe-job.com> 8 * --- 130 unchanged lines hidden (view full) --- 139 EMU_SRC_ALICE_EMU32B+9, \ 140 EMU_SRC_ALICE_EMU32B+0xa, \ 141 EMU_SRC_ALICE_EMU32B+0xb, \ 142 EMU_SRC_ALICE_EMU32B+0xc, \ 143 EMU_SRC_ALICE_EMU32B+0xd, \ 144 EMU_SRC_ALICE_EMU32B+0xe, \ 145 EMU_SRC_ALICE_EMU32B+0xf 146 |
147/* 1010 rev1 */ 148 |
|
147#define EMU1010_COMMON_TEXTS \ 148 "Silence", \ 149 PAIR_TEXTS("Dock Mic", "A", "B"), \ 150 LR_TEXTS("Dock ADC1"), \ 151 LR_TEXTS("Dock ADC2"), \ 152 LR_TEXTS("Dock ADC3"), \ 153 LR_TEXTS("0202 ADC"), \ 154 LR_TEXTS("1010 SPDIF"), \ --- 70 unchanged lines hidden (view full) --- 225 LR_REGS(EMU_SRC_DOCK_ADC1), 226 LR_REGS(EMU_SRC_DOCK_ADC2), 227 LR_REGS(EMU_SRC_MDOCK_SPDIF), 228 ADAT_REGS(EMU_SRC_MDOCK_ADAT), 229 EMU32_SRC_REGS, 230}; 231static_assert(ARRAY_SIZE(emu1616_src_regs) == ARRAY_SIZE(emu1616_src_texts)); 232 | 149#define EMU1010_COMMON_TEXTS \ 150 "Silence", \ 151 PAIR_TEXTS("Dock Mic", "A", "B"), \ 152 LR_TEXTS("Dock ADC1"), \ 153 LR_TEXTS("Dock ADC2"), \ 154 LR_TEXTS("Dock ADC3"), \ 155 LR_TEXTS("0202 ADC"), \ 156 LR_TEXTS("1010 SPDIF"), \ --- 70 unchanged lines hidden (view full) --- 227 LR_REGS(EMU_SRC_DOCK_ADC1), 228 LR_REGS(EMU_SRC_DOCK_ADC2), 229 LR_REGS(EMU_SRC_MDOCK_SPDIF), 230 ADAT_REGS(EMU_SRC_MDOCK_ADAT), 231 EMU32_SRC_REGS, 232}; 233static_assert(ARRAY_SIZE(emu1616_src_regs) == ARRAY_SIZE(emu1616_src_texts)); 234 |
235/* 0404 rev1 & rev2 */ 236 237#define EMU0404_COMMON_TEXTS \ 238 "Silence", \ 239 LR_TEXTS("ADC"), \ 240 LR_TEXTS("SPDIF") 241 242static const char * const emu0404_src_texts[] = { 243 EMU0404_COMMON_TEXTS, 244 DSP_TEXTS, 245}; 246 247static const unsigned short emu0404_src_regs[] = { 248 EMU_SRC_SILENCE, 249 LR_REGS(EMU_SRC_HAMOA_ADC), 250 LR_REGS(EMU_SRC_HANA_SPDIF), 251 EMU32_SRC_REGS, 252}; 253static_assert(ARRAY_SIZE(emu0404_src_regs) == ARRAY_SIZE(emu0404_src_texts)); 254 |
|
233/* 234 * Data destinations - physical EMU outputs. 235 * Each destination has an enum mixer control to choose a data source 236 */ 237 238#define LR_CTLS(base) LR_PS(base, " Playback Enum") 239#define ADAT_CTLS(pfx) ADAT_PS(pfx, " Playback Enum") 240 | 255/* 256 * Data destinations - physical EMU outputs. 257 * Each destination has an enum mixer control to choose a data source 258 */ 259 260#define LR_CTLS(base) LR_PS(base, " Playback Enum") 261#define ADAT_CTLS(pfx) ADAT_PS(pfx, " Playback Enum") 262 |
263/* 1010 rev1 */ 264 |
|
241static const char * const emu1010_output_texts[] = { 242 LR_CTLS("Dock DAC1"), 243 LR_CTLS("Dock DAC2"), 244 LR_CTLS("Dock DAC3"), 245 LR_CTLS("Dock DAC4"), 246 LR_CTLS("Dock Phones"), 247 LR_CTLS("Dock SPDIF"), 248 LR_CTLS("0202 DAC"), --- 93 unchanged lines hidden (view full) --- 342 EMU_SRC_ALICE_EMU32A+4, EMU_SRC_ALICE_EMU32A+5, 343 EMU_SRC_ALICE_EMU32A+0, EMU_SRC_ALICE_EMU32A+1, 344 EMU_SRC_ALICE_EMU32A+0, EMU_SRC_ALICE_EMU32A+1, EMU_SRC_ALICE_EMU32A+2, EMU_SRC_ALICE_EMU32A+3, 345 EMU_SRC_ALICE_EMU32A+4, EMU_SRC_ALICE_EMU32A+5, EMU_SRC_ALICE_EMU32A+6, EMU_SRC_ALICE_EMU32A+7, 346 EMU_SRC_ALICE_EMU32A+0, EMU_SRC_ALICE_EMU32A+1, 347}; 348static_assert(ARRAY_SIZE(emu1616_output_dflt) == ARRAY_SIZE(emu1616_output_dst)); 349 | 265static const char * const emu1010_output_texts[] = { 266 LR_CTLS("Dock DAC1"), 267 LR_CTLS("Dock DAC2"), 268 LR_CTLS("Dock DAC3"), 269 LR_CTLS("Dock DAC4"), 270 LR_CTLS("Dock Phones"), 271 LR_CTLS("Dock SPDIF"), 272 LR_CTLS("0202 DAC"), --- 93 unchanged lines hidden (view full) --- 366 EMU_SRC_ALICE_EMU32A+4, EMU_SRC_ALICE_EMU32A+5, 367 EMU_SRC_ALICE_EMU32A+0, EMU_SRC_ALICE_EMU32A+1, 368 EMU_SRC_ALICE_EMU32A+0, EMU_SRC_ALICE_EMU32A+1, EMU_SRC_ALICE_EMU32A+2, EMU_SRC_ALICE_EMU32A+3, 369 EMU_SRC_ALICE_EMU32A+4, EMU_SRC_ALICE_EMU32A+5, EMU_SRC_ALICE_EMU32A+6, EMU_SRC_ALICE_EMU32A+7, 370 EMU_SRC_ALICE_EMU32A+0, EMU_SRC_ALICE_EMU32A+1, 371}; 372static_assert(ARRAY_SIZE(emu1616_output_dflt) == ARRAY_SIZE(emu1616_output_dst)); 373 |
374/* 0404 rev1 & rev2 */ 375 376static const char * const snd_emu0404_output_texts[] = { 377 LR_CTLS("DAC"), 378 LR_CTLS("SPDIF"), 379}; 380 381static const unsigned short emu0404_output_dst[] = { 382 LR_REGS(EMU_DST_HAMOA_DAC), 383 LR_REGS(EMU_DST_HANA_SPDIF), 384}; 385static_assert(ARRAY_SIZE(emu0404_output_dst) == ARRAY_SIZE(snd_emu0404_output_texts)); 386 387static const unsigned short emu0404_output_dflt[] = { 388 EMU_SRC_ALICE_EMU32A+0, EMU_SRC_ALICE_EMU32A+1, 389 EMU_SRC_ALICE_EMU32A+0, EMU_SRC_ALICE_EMU32A+1, 390}; 391static_assert(ARRAY_SIZE(emu0404_output_dflt) == ARRAY_SIZE(emu0404_output_dst)); 392 |
|
350/* 351 * Data destinations - FPGA outputs going to Alice2 (Audigy) for 352 * capture (EMU32 + I2S links) 353 * Each destination has an enum mixer control to choose a data source 354 */ 355 356static const char * const emu1010_input_texts[] = { 357 "DSP 0 Capture Enum", --- 73 unchanged lines hidden (view full) --- 431 EMU_SRC_DOCK_ADC1_RIGHT1, 432 EMU_SRC_DOCK_ADC2_LEFT1, 433 EMU_SRC_DOCK_ADC2_RIGHT1, 434 EMU_SRC_DOCK_ADC3_LEFT1, 435 EMU_SRC_DOCK_ADC3_RIGHT1, 436}; 437static_assert(ARRAY_SIZE(emu1010_input_dflt) == ARRAY_SIZE(emu1010_input_dst)); 438 | 393/* 394 * Data destinations - FPGA outputs going to Alice2 (Audigy) for 395 * capture (EMU32 + I2S links) 396 * Each destination has an enum mixer control to choose a data source 397 */ 398 399static const char * const emu1010_input_texts[] = { 400 "DSP 0 Capture Enum", --- 73 unchanged lines hidden (view full) --- 474 EMU_SRC_DOCK_ADC1_RIGHT1, 475 EMU_SRC_DOCK_ADC2_LEFT1, 476 EMU_SRC_DOCK_ADC2_RIGHT1, 477 EMU_SRC_DOCK_ADC3_LEFT1, 478 EMU_SRC_DOCK_ADC3_RIGHT1, 479}; 480static_assert(ARRAY_SIZE(emu1010_input_dflt) == ARRAY_SIZE(emu1010_input_dst)); 481 |
482static const unsigned short emu0404_input_dflt[] = { 483 EMU_SRC_HAMOA_ADC_LEFT1, 484 EMU_SRC_HAMOA_ADC_RIGHT1, 485 EMU_SRC_SILENCE, 486 EMU_SRC_SILENCE, 487 EMU_SRC_SILENCE, 488 EMU_SRC_SILENCE, 489 EMU_SRC_SILENCE, 490 EMU_SRC_SILENCE, 491 EMU_SRC_HANA_SPDIF_LEFT1, 492 EMU_SRC_HANA_SPDIF_RIGHT1, 493 EMU_SRC_SILENCE, 494 EMU_SRC_SILENCE, 495 EMU_SRC_SILENCE, 496 EMU_SRC_SILENCE, 497 EMU_SRC_SILENCE, 498 EMU_SRC_SILENCE, 499}; 500 |
|
439struct snd_emu1010_routing_info { 440 const char * const *src_texts; 441 const char * const *out_texts; 442 const unsigned short *src_regs; 443 const unsigned short *out_regs; 444 const unsigned short *in_regs; 445 const unsigned short *out_dflts; 446 const unsigned short *in_dflts; 447 unsigned n_srcs; 448 unsigned n_outs; 449 unsigned n_ins; 450}; 451 452const struct snd_emu1010_routing_info emu1010_routing_info[] = { 453 { | 501struct snd_emu1010_routing_info { 502 const char * const *src_texts; 503 const char * const *out_texts; 504 const unsigned short *src_regs; 505 const unsigned short *out_regs; 506 const unsigned short *in_regs; 507 const unsigned short *out_dflts; 508 const unsigned short *in_dflts; 509 unsigned n_srcs; 510 unsigned n_outs; 511 unsigned n_ins; 512}; 513 514const struct snd_emu1010_routing_info emu1010_routing_info[] = { 515 { |
516 /* rev1 1010 */ |
|
454 .src_regs = emu1010_src_regs, 455 .src_texts = emu1010_src_texts, 456 .n_srcs = ARRAY_SIZE(emu1010_src_texts), 457 458 .out_dflts = emu1010_output_dflt, 459 .out_regs = emu1010_output_dst, 460 .out_texts = emu1010_output_texts, 461 .n_outs = ARRAY_SIZE(emu1010_output_dst), --- 27 unchanged lines hidden (view full) --- 489 .out_regs = emu1616_output_dst, 490 .out_texts = snd_emu1616_output_texts, 491 .n_outs = ARRAY_SIZE(emu1616_output_dst), 492 493 .in_dflts = emu1010_input_dflt, 494 .in_regs = emu1010_input_dst, 495 .n_ins = ARRAY_SIZE(emu1010_input_dst) - 6, 496 }, | 517 .src_regs = emu1010_src_regs, 518 .src_texts = emu1010_src_texts, 519 .n_srcs = ARRAY_SIZE(emu1010_src_texts), 520 521 .out_dflts = emu1010_output_dflt, 522 .out_regs = emu1010_output_dst, 523 .out_texts = emu1010_output_texts, 524 .n_outs = ARRAY_SIZE(emu1010_output_dst), --- 27 unchanged lines hidden (view full) --- 552 .out_regs = emu1616_output_dst, 553 .out_texts = snd_emu1616_output_texts, 554 .n_outs = ARRAY_SIZE(emu1616_output_dst), 555 556 .in_dflts = emu1010_input_dflt, 557 .in_regs = emu1010_input_dst, 558 .n_ins = ARRAY_SIZE(emu1010_input_dst) - 6, 559 }, |
560 { 561 /* 0404 */ 562 .src_regs = emu0404_src_regs, 563 .src_texts = emu0404_src_texts, 564 .n_srcs = ARRAY_SIZE(emu0404_src_texts), 565 566 .out_dflts = emu0404_output_dflt, 567 .out_regs = emu0404_output_dst, 568 .out_texts = snd_emu0404_output_texts, 569 .n_outs = ARRAY_SIZE(emu0404_output_dflt), 570 571 .in_dflts = emu0404_input_dflt, 572 .in_regs = emu1010_input_dst, 573 .n_ins = ARRAY_SIZE(emu1010_input_dst) - 6, 574 }, |
|
497}; 498 499static unsigned emu1010_idx(struct snd_emu10k1 *emu) 500{ | 575}; 576 577static unsigned emu1010_idx(struct snd_emu10k1 *emu) 578{ |
501 if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) 502 return 2; 503 else if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1010B) 504 return 1; 505 else 506 return 0; | 579 return emu->card_capabilities->emu_model - 1; |
507} 508 509static void snd_emu1010_output_source_apply(struct snd_emu10k1 *emu, 510 int channel, int src) 511{ 512 const struct snd_emu1010_routing_info *emu_ri = 513 &emu1010_routing_info[emu1010_idx(emu)]; 514 --- 260 unchanged lines hidden (view full) --- 775 776struct snd_emu1010_pads_info { 777 const char * const *adc_ctls, * const *dac_ctls; 778 unsigned n_adc_ctls, n_dac_ctls; 779}; 780 781const struct snd_emu1010_pads_info emu1010_pads_info[] = { 782 { | 580} 581 582static void snd_emu1010_output_source_apply(struct snd_emu10k1 *emu, 583 int channel, int src) 584{ 585 const struct snd_emu1010_routing_info *emu_ri = 586 &emu1010_routing_info[emu1010_idx(emu)]; 587 --- 260 unchanged lines hidden (view full) --- 848 849struct snd_emu1010_pads_info { 850 const char * const *adc_ctls, * const *dac_ctls; 851 unsigned n_adc_ctls, n_dac_ctls; 852}; 853 854const struct snd_emu1010_pads_info emu1010_pads_info[] = { 855 { |
783 /* all other e-mu cards for now */ | 856 /* rev1 1010 */ |
784 .adc_ctls = snd_emu1010_adc_pads, 785 .n_adc_ctls = ARRAY_SIZE(snd_emu1010_adc_pads), 786 .dac_ctls = snd_emu1010_dac_pads, 787 .n_dac_ctls = ARRAY_SIZE(snd_emu1010_dac_pads), 788 }, 789 { 790 /* rev2 1010 */ 791 .adc_ctls = snd_emu1010_adc_pads, 792 .n_adc_ctls = ARRAY_SIZE(snd_emu1010_adc_pads) - 1, 793 .dac_ctls = snd_emu1010_dac_pads, 794 .n_dac_ctls = ARRAY_SIZE(snd_emu1010_dac_pads) - 1, 795 }, 796 { 797 /* 1616(m) cardbus */ 798 .adc_ctls = snd_emu1010_adc_pads + 1, 799 .n_adc_ctls = ARRAY_SIZE(snd_emu1010_adc_pads) - 2, 800 .dac_ctls = snd_emu1010_dac_pads + 1, 801 .n_dac_ctls = ARRAY_SIZE(snd_emu1010_dac_pads) - 2, 802 }, | 857 .adc_ctls = snd_emu1010_adc_pads, 858 .n_adc_ctls = ARRAY_SIZE(snd_emu1010_adc_pads), 859 .dac_ctls = snd_emu1010_dac_pads, 860 .n_dac_ctls = ARRAY_SIZE(snd_emu1010_dac_pads), 861 }, 862 { 863 /* rev2 1010 */ 864 .adc_ctls = snd_emu1010_adc_pads, 865 .n_adc_ctls = ARRAY_SIZE(snd_emu1010_adc_pads) - 1, 866 .dac_ctls = snd_emu1010_dac_pads, 867 .n_dac_ctls = ARRAY_SIZE(snd_emu1010_dac_pads) - 1, 868 }, 869 { 870 /* 1616(m) cardbus */ 871 .adc_ctls = snd_emu1010_adc_pads + 1, 872 .n_adc_ctls = ARRAY_SIZE(snd_emu1010_adc_pads) - 2, 873 .dac_ctls = snd_emu1010_dac_pads + 1, 874 .n_dac_ctls = ARRAY_SIZE(snd_emu1010_dac_pads) - 2, 875 }, |
876 { 877 /* 0404 */ 878 .adc_ctls = NULL, 879 .n_adc_ctls = 0, 880 .dac_ctls = NULL, 881 .n_dac_ctls = 0, 882 }, |
|
803}; 804 805 806static int snd_emu1010_internal_clock_info(struct snd_kcontrol *kcontrol, 807 struct snd_ctl_elem_info *uinfo) 808{ 809 static const char * const texts[4] = { 810 "44100", "48000", "SPDIF", "ADAT" --- 1409 unchanged lines hidden (view full) --- 2220 emu_pi->adc_ctls, emu_pi->n_adc_ctls); 2221 if (err < 0) 2222 return err; 2223 err = add_ctls(emu, &emu1010_dac_pads_ctl, 2224 emu_pi->dac_ctls, emu_pi->n_dac_ctls); 2225 if (err < 0) 2226 return err; 2227 | 883}; 884 885 886static int snd_emu1010_internal_clock_info(struct snd_kcontrol *kcontrol, 887 struct snd_ctl_elem_info *uinfo) 888{ 889 static const char * const texts[4] = { 890 "44100", "48000", "SPDIF", "ADAT" --- 1409 unchanged lines hidden (view full) --- 2300 emu_pi->adc_ctls, emu_pi->n_adc_ctls); 2301 if (err < 0) 2302 return err; 2303 err = add_ctls(emu, &emu1010_dac_pads_ctl, 2304 emu_pi->dac_ctls, emu_pi->n_dac_ctls); 2305 if (err < 0) 2306 return err; 2307 |
2228 err = snd_ctl_add(card, 2229 snd_ctl_new1(&snd_emu1010_optical_out, emu)); 2230 if (err < 0) 2231 return err; 2232 err = snd_ctl_add(card, 2233 snd_ctl_new1(&snd_emu1010_optical_in, emu)); 2234 if (err < 0) 2235 return err; | 2308 if (!emu->card_capabilities->no_adat) { 2309 err = snd_ctl_add(card, 2310 snd_ctl_new1(&snd_emu1010_optical_out, emu)); 2311 if (err < 0) 2312 return err; 2313 err = snd_ctl_add(card, 2314 snd_ctl_new1(&snd_emu1010_optical_in, emu)); 2315 if (err < 0) 2316 return err; 2317 } |
2236 2237 err = add_emu1010_source_mixers(emu); 2238 if (err < 0) 2239 return err; 2240 } 2241 2242 if ( emu->card_capabilities->i2c_adc) { 2243 err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_capture_source, emu)); --- 19 unchanged lines hidden --- | 2318 2319 err = add_emu1010_source_mixers(emu); 2320 if (err < 0) 2321 return err; 2322 } 2323 2324 if ( emu->card_capabilities->i2c_adc) { 2325 err = snd_ctl_add(card, snd_ctl_new1(&snd_audigy_i2c_capture_source, emu)); --- 19 unchanged lines hidden --- |