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 ---