[alsa-devel] [PATCH] ALSA: HDA: Fix jack creation for codecs with front and rear Line In
Takashi Iwai
tiwai at suse.de
Tue Jan 31 15:17:29 CET 2012
At Tue, 31 Jan 2012 09:04:15 +0100,
David Henningsson wrote:
>
> If a codec has both a front and a rear Line In, two controls both
> named "Line Jack" will be created, which causes parsing to fail.
> While a long term solution might be to name the jacks differently,
> this extra check is consistent with what is already being done in many
> auto-parsers, and will also protect against other cases when two
> inputs have the same label.
>
> BugLink: https://bugs.launchpad.net/bugs/923409
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
Thanks, applied now.
BTW, any chance to change apport to gather alsa-info.sh output?
It'd be a great help, so that we can check it via hda-emu.
Takashi
> ---
> sound/pci/hda/hda_jack.c | 24 +++++++++++++++---------
> 1 files changed, 15 insertions(+), 9 deletions(-)
>
> diff --git a/sound/pci/hda/hda_jack.c b/sound/pci/hda/hda_jack.c
> index d8a35da..9d819c4 100644
> --- a/sound/pci/hda/hda_jack.c
> +++ b/sound/pci/hda/hda_jack.c
> @@ -282,7 +282,8 @@ int snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid,
> EXPORT_SYMBOL_HDA(snd_hda_jack_add_kctl);
>
> static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid,
> - const struct auto_pin_cfg *cfg)
> + const struct auto_pin_cfg *cfg,
> + char *lastname, int *lastidx)
> {
> unsigned int def_conf, conn;
> char name[44];
> @@ -298,6 +299,10 @@ static int add_jack_kctl(struct hda_codec *codec, hda_nid_t nid,
> return 0;
>
> snd_hda_get_pin_label(codec, nid, cfg, name, sizeof(name), &idx);
> + if (!strcmp(name, lastname) && idx == *lastidx)
> + idx++;
> + strncpy(lastname, name, 44);
> + *lastidx = idx;
> err = snd_hda_jack_add_kctl(codec, nid, name, idx);
> if (err < 0)
> return err;
> @@ -311,41 +316,42 @@ int snd_hda_jack_add_kctls(struct hda_codec *codec,
> const struct auto_pin_cfg *cfg)
> {
> const hda_nid_t *p;
> - int i, err;
> + int i, err, lastidx = 0;
> + char lastname[44] = "";
>
> for (i = 0, p = cfg->line_out_pins; i < cfg->line_outs; i++, p++) {
> - err = add_jack_kctl(codec, *p, cfg);
> + err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx);
> if (err < 0)
> return err;
> }
> for (i = 0, p = cfg->hp_pins; i < cfg->hp_outs; i++, p++) {
> if (*p == *cfg->line_out_pins) /* might be duplicated */
> break;
> - err = add_jack_kctl(codec, *p, cfg);
> + err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx);
> if (err < 0)
> return err;
> }
> for (i = 0, p = cfg->speaker_pins; i < cfg->speaker_outs; i++, p++) {
> if (*p == *cfg->line_out_pins) /* might be duplicated */
> break;
> - err = add_jack_kctl(codec, *p, cfg);
> + err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx);
> if (err < 0)
> return err;
> }
> for (i = 0; i < cfg->num_inputs; i++) {
> - err = add_jack_kctl(codec, cfg->inputs[i].pin, cfg);
> + err = add_jack_kctl(codec, cfg->inputs[i].pin, cfg, lastname, &lastidx);
> if (err < 0)
> return err;
> }
> for (i = 0, p = cfg->dig_out_pins; i < cfg->dig_outs; i++, p++) {
> - err = add_jack_kctl(codec, *p, cfg);
> + err = add_jack_kctl(codec, *p, cfg, lastname, &lastidx);
> if (err < 0)
> return err;
> }
> - err = add_jack_kctl(codec, cfg->dig_in_pin, cfg);
> + err = add_jack_kctl(codec, cfg->dig_in_pin, cfg, lastname, &lastidx);
> if (err < 0)
> return err;
> - err = add_jack_kctl(codec, cfg->mono_out_pin, cfg);
> + err = add_jack_kctl(codec, cfg->mono_out_pin, cfg, lastname, &lastidx);
> if (err < 0)
> return err;
> return 0;
> --
> 1.7.8.3
>
More information about the Alsa-devel
mailing list