On the Thinkpad W520 - and probably several other machines with
Conexant 506x chips - the Dock Mic and Mic are connected to the
same two selector nodes. This patch will make Dock Mic take one
selector node and Mic take the other, when possible.

Without the patch, both paths would take the first selector,
leading to the normal Mic's volume being controlled by
"Dock Mic Boost".
(On other machines, this could instead fixup similar problems between
Mic and Line In, for example.)

BugLink: https://bugs.launchpad.net/bugs/1037642
Signed-off-by: David Henningsson <[email protected]>
---

I asked for alsa-info on this one but got Ubuntu apport info instead,
see e g
https://bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/1037642/+attachment/3323954/+files/Card0.Codecs.codec.0.txt

In general I guess this could be sent to stable but it always feels scary
when it's generic code :-) what do you think?

 sound/pci/hda/patch_conexant.c |   20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
index b871b013..c03d3b8 100644
--- a/sound/pci/hda/patch_conexant.c
+++ b/sound/pci/hda/patch_conexant.c
@@ -3540,8 +3540,9 @@ static int __select_input_connection(struct hda_codec 
*codec, hda_nid_t mux,
                                     hda_nid_t pin, hda_nid_t *srcp,
                                     bool do_select, int depth)
 {
+       struct conexant_spec *spec = codec->spec;
        hda_nid_t conn[HDA_MAX_NUM_INPUTS];
-       int i, nums;
+       int startidx, i, nums;
 
        switch (get_wcaps_type(get_wcaps(codec, mux))) {
        case AC_WID_AUD_IN:
@@ -3565,14 +3566,25 @@ static int __select_input_connection(struct hda_codec 
*codec, hda_nid_t mux,
        depth++;
        if (depth == 2)
                return -1;
+
+       /* Try to rotate around connections to avoid one boost controlling
+          another input path as well */
+       startidx = 0;
+       for (i = 0; i < spec->private_imux.num_items; i++)
+               if (spec->imux_info[i].pin == pin) {
+                       startidx = i;
+                       break;
+               }
+
        for (i = 0; i < nums; i++) {
-               int ret  = __select_input_connection(codec, conn[i], pin, srcp,
+               int j = (i + startidx) % nums;
+               int ret  = __select_input_connection(codec, conn[j], pin, srcp,
                                                     do_select, depth);
                if (ret >= 0) {
                        if (do_select)
                                snd_hda_codec_write(codec, mux, 0,
-                                                   AC_VERB_SET_CONNECT_SEL, i);
-                       return i;
+                                                   AC_VERB_SET_CONNECT_SEL, j);
+                       return j;
                }
        }
        return -1;
-- 
1.7.9.5


** Package changed: pulseaudio (Ubuntu Quantal) => linux (Ubuntu
Quantal)

** Changed in: linux (Ubuntu Quantal)
       Status: Confirmed => In Progress

** Summary changed:

- headset microphone no longer detected and therefore won't record
+ [Thinkpad W520] headset microphone no longer detected and therefore won't 
record

** Summary changed:

- [Thinkpad W520] headset microphone no longer detected and therefore won't 
record
+ [Thinkpad W520] headset microphone controlled by dock mic path

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1037642

Title:
  [Thinkpad W520] headset microphone controlled by dock mic path

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1037642/+subscriptions

-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to