Commit 97f1582e authored by Oswald Buddenhagen's avatar Oswald Buddenhagen Committed by Takashi Iwai
Browse files

ALSA: emu10k1: make E-MU mixer control creation more data-driven



The more card models are handled separately, the more code duplication
this saves.

add_emu1010_source_mixers() is factored out the save duplication in a
later commit.

Signed-off-by: default avatarOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Link: https://lore.kernel.org/r/20230516093612.3536508-8-oswald.buddenhagen@gmx.de


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 1fc710f0
Loading
Loading
Loading
Loading
+49 −51
Original line number Diff line number Diff line
@@ -368,6 +368,7 @@ static_assert(ARRAY_SIZE(emu1010_input_dflt) == ARRAY_SIZE(emu1010_input_dst));

struct snd_emu1010_routing_info {
	const char * const *src_texts;
	const char * const *out_texts;
	const unsigned short *src_regs;
	const unsigned short *out_regs;
	const unsigned short *in_regs;
@@ -386,6 +387,7 @@ const struct snd_emu1010_routing_info emu1010_routing_info[] = {

		.out_dflts = emu1010_output_dflt,
		.out_regs = emu1010_output_dst,
		.out_texts = emu1010_output_texts,
		.n_outs = ARRAY_SIZE(emu1010_output_dst),

		.in_dflts = emu1010_input_dflt,
@@ -400,6 +402,7 @@ const struct snd_emu1010_routing_info emu1010_routing_info[] = {

		.out_dflts = emu1616_output_dflt,
		.out_regs = emu1616_output_dst,
		.out_texts = snd_emu1616_output_texts,
		.n_outs = ARRAY_SIZE(emu1616_output_dst),

		.in_dflts = emu1010_input_dflt,
@@ -556,6 +559,21 @@ static const struct snd_kcontrol_new emu1010_input_source_ctl = {
	.put = snd_emu1010_input_source_put
};

static int add_emu1010_source_mixers(struct snd_emu10k1 *emu)
{
	const struct snd_emu1010_routing_info *emu_ri =
		&emu1010_routing_info[emu1010_idx(emu)];
	int err;

	err = add_ctls(emu, &emu1010_output_source_ctl,
		       emu_ri->out_texts, emu_ri->n_outs);
	if (err < 0)
		return err;
	err = add_ctls(emu, &emu1010_input_source_ctl,
		       emu1010_input_texts, emu_ri->n_ins);
	return err;
}


static const char * const snd_emu1010_adc_pads[] = {
	"ADC1 14dB PAD Audio Dock Capture Switch",
@@ -668,6 +686,29 @@ static const struct snd_kcontrol_new emu1010_dac_pads_ctl = {
};


struct snd_emu1010_pads_info {
	const char * const *adc_ctls, * const *dac_ctls;
	unsigned n_adc_ctls, n_dac_ctls;
};

const struct snd_emu1010_pads_info emu1010_pads_info[] = {
	{
		/* all other e-mu cards for now */
		.adc_ctls = snd_emu1010_adc_pads,
		.n_adc_ctls = ARRAY_SIZE(snd_emu1010_adc_pads),
		.dac_ctls = snd_emu1010_dac_pads,
		.n_dac_ctls = ARRAY_SIZE(snd_emu1010_dac_pads),
	},
	{
		/* 1616(m) cardbus */
		.adc_ctls = snd_emu1010_adc_pads,
		.n_adc_ctls = ARRAY_SIZE(snd_emu1010_adc_pads) - 2,
		.dac_ctls = snd_emu1010_dac_pads,
		.n_dac_ctls = ARRAY_SIZE(snd_emu1010_dac_pads) - 2,
	},
};


static int snd_emu1010_internal_clock_info(struct snd_kcontrol *kcontrol,
					  struct snd_ctl_elem_info *uinfo)
{
@@ -2066,6 +2107,7 @@ int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
		unsigned i, emu_idx = emu1010_idx(emu);
		const struct snd_emu1010_routing_info *emu_ri =
			&emu1010_routing_info[emu_idx];
		const struct snd_emu1010_pads_info *emu_pi = &emu1010_pads_info[emu_idx];

		for (i = 0; i < emu_ri->n_ins; i++)
			emu->emu1010.input_source[i] =
@@ -2074,69 +2116,21 @@ int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
			emu->emu1010.output_source[i] =
				emu1010_map_source(emu_ri, emu_ri->out_dflts[i]);
		snd_emu1010_apply_sources(emu);
	}

	if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) {
		/* 1616(m) cardbus */
		err = add_ctls(emu, &emu1010_output_source_ctl,
			       snd_emu1616_output_texts,
			       ARRAY_SIZE(snd_emu1616_output_texts));
		if (err < 0)
			return err;
		err = add_ctls(emu, &emu1010_input_source_ctl,
			       emu1010_input_texts,
			       ARRAY_SIZE(emu1010_input_texts));
		if (err < 0)
			return err;
		err = add_ctls(emu, &emu1010_adc_pads_ctl,
			       snd_emu1010_adc_pads,
			       ARRAY_SIZE(snd_emu1010_adc_pads) - 2);
		if (err < 0)
			return err;
		err = add_ctls(emu, &emu1010_dac_pads_ctl,
			       snd_emu1010_dac_pads,
			       ARRAY_SIZE(snd_emu1010_dac_pads) - 2);
		if (err < 0)
			return err;
		err = snd_ctl_add(card,
			snd_ctl_new1(&snd_emu1010_internal_clock, emu));
		if (err < 0)
			return err;
		err = snd_ctl_add(card,
			snd_ctl_new1(&snd_emu1010_optical_out, emu));
		if (err < 0)
			return err;
		err = snd_ctl_add(card,
			snd_ctl_new1(&snd_emu1010_optical_in, emu));
		if (err < 0)
			return err;

	} else if (emu->card_capabilities->emu_model) {
		/* all other e-mu cards for now */
		err = add_ctls(emu, &emu1010_output_source_ctl,
			       emu1010_output_texts,
			       ARRAY_SIZE(emu1010_output_texts));
		if (err < 0)
			return err;
		err = add_ctls(emu, &emu1010_input_source_ctl,
			       emu1010_input_texts,
			       ARRAY_SIZE(emu1010_input_texts));
		if (err < 0)
			return err;
		err = add_ctls(emu, &emu1010_adc_pads_ctl,
			       snd_emu1010_adc_pads,
			       ARRAY_SIZE(snd_emu1010_adc_pads));
			       emu_pi->adc_ctls, emu_pi->n_adc_ctls);
		if (err < 0)
			return err;
		err = add_ctls(emu, &emu1010_dac_pads_ctl,
			       snd_emu1010_dac_pads,
			       ARRAY_SIZE(snd_emu1010_dac_pads));
		if (err < 0)
			return err;
		err = snd_ctl_add(card,
			snd_ctl_new1(&snd_emu1010_internal_clock, emu));
			       emu_pi->dac_ctls, emu_pi->n_dac_ctls);
		if (err < 0)
			return err;

		err = snd_ctl_add(card,
			snd_ctl_new1(&snd_emu1010_optical_out, emu));
		if (err < 0)
@@ -2145,6 +2139,10 @@ int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
			snd_ctl_new1(&snd_emu1010_optical_in, emu));
		if (err < 0)
			return err;

		err = add_emu1010_source_mixers(emu);
		if (err < 0)
			return err;
	}

	if ( emu->card_capabilities->i2c_adc) {