[alsa-devel] [PATCH] ALSA: hda - Don't be too specific for conflicting boost ctl names
David Henningsson
david.henningsson at canonical.com
Thu Dec 19 06:34:59 CET 2013
On 12/18/2013 06:39 PM, Takashi Iwai wrote:
> When a boost control influences on multiple input paths, we shouldn't
> pick up the name string specific to one input but rather choose a more
> generic name. A problem seen often is that a single mic boost
> controls both internal and external mics although the driver picks up
> the very first name randomly like "Internal Mic Boost". This should
> have been "Mic Boost", instead.
>
> This patch tries to correct that behavior: when a boost control is
> available, check whether it conflicts with other inputs. If it does,
> use a common string ("Mic", "Line") as long as possible, or take a
> generic name "Input".
Hrm. I thought today "Mic Boost" is quite common, and meaning the mic
boost of the non-internal mic. So I agree there is a problem - and thank
you for trying to fix it - but isn't this just changing one problem for
another? Now we don't know if a "Mic Boost" control controls the
internal mic or not.
>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> ---
> sound/pci/hda/hda_generic.c | 44 ++++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 40 insertions(+), 4 deletions(-)
>
> diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
> index 8cebdcfdcfdc..e3f934703aa2 100644
> --- a/sound/pci/hda/hda_generic.c
> +++ b/sound/pci/hda/hda_generic.c
> @@ -3651,6 +3651,8 @@ static int parse_mic_boost(struct hda_codec *codec)
> struct hda_gen_spec *spec = codec->spec;
> struct auto_pin_cfg *cfg = &spec->autocfg;
> struct hda_input_mux *imux = &spec->input_mux;
> + static const char *input_type_labels[3] = { "Mic", "Line", "Input" };
> + int input_type_idxs[3] = {};
> int i;
>
> if (!spec->num_adc_nids)
> @@ -3659,7 +3661,9 @@ static int parse_mic_boost(struct hda_codec *codec)
> for (i = 0; i < imux->num_items; i++) {
> struct nid_path *path;
> unsigned int val;
> - int idx;
> + int idx, type, j;
> + bool conflict;
> + const char *pfx;
> char boost_label[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
>
> idx = imux->items[i].index;
> @@ -3678,11 +3682,43 @@ static int parse_mic_boost(struct hda_codec *codec)
> if (!val)
> continue;
>
> + /* check whether conflicting with other input paths */
> + type = cfg->inputs[idx].type;
> + conflict = false;
> + for (j = i + 1; j < imux->num_items; j++) {
> + int idx_next = imux->items[i].index;
> + int type_next;
> + struct nid_path *path_next;
> + if (idx_next >= imux->num_items)
> + continue;
> + type_next = cfg->inputs[idx_next].type;
> + if (type_next > AUTO_PIN_LINE_IN)
> + continue;
> + path_next = get_input_path(codec, 0, j);
> + if (!path_next)
> + continue;
> + /* conflicting value? */
> + if (look_for_boost_amp(codec, path_next) == val) {
> + conflict = true;
> + if (type != type_next) {
> + type = 2; /* generic input */
> + break;
> + }
> + }
> + }
> +
> /* create a boost control */
> + if (!conflict) {
> + pfx = spec->input_labels[idx];
> + idx = spec->input_label_idxs[idx];
> + } else {
> + pfx = input_type_labels[type];
> + idx = input_type_idxs[type]++;
> + }
> +
> snprintf(boost_label, sizeof(boost_label),
> - "%s Boost Volume", spec->input_labels[idx]);
> - if (!add_control(spec, HDA_CTL_WIDGET_VOL, boost_label,
> - spec->input_label_idxs[idx], val))
> + "%s Boost Volume", pfx);
> + if (!add_control(spec, HDA_CTL_WIDGET_VOL, boost_label, idx, val))
> return -ENOMEM;
>
> path->ctls[NID_PATH_BOOST_CTL] = val;
>
--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
More information about the Alsa-devel
mailing list