[alsa-devel] [ALC668]: Asus N751JK - mic selection not working

Arthur Borsboom arthurborsboom at gmail.com
Mon Aug 3 21:42:06 CEST 2015


Result of "pactl list sources" plugged and unplugged in this order, with
your previous patches applied.

Nothing: http://pastebin.com/RWuiW0RG
Headphones: http://pastebin.com/GvEkQ8HB
Microphone: http://pastebin.com/NRiREULS
Headset: http://pastebin.com/QuGLFD8A
Subwoofer: http://pastebin.com/nxZNGgyY


On 1 August 2015 at 03:41, Raymond Yau <superquad.vortex2 at gmail.com> wrote:

> >>
> >>   Ports:
> >>
> >>                 analog-output-speaker: Speakers (priority: 10000)
> >>                 analog-output-headphones: Headphones (priority: 9000,
> not available)
> >>         Active Port: analog-output-speaker
> >>
> >>
> >> When you select model=dell-headset-multi, the driver create "Headphone
> Mic Jack" kctl with type 1 which is SND_JACK_HEADPHONE
> >>
> >> type 2 is SND_JACK_MICROPHONE
> >>
> >> type 3 is SND_JACK_HEADSET but hda jack does not use this type
> >>
> >>
> https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/tree/include/sound/jack.h
> >>
> >> JACK created Headphone Mic, type 1
> >> CTRL: add: Headphone Mic Jack:0
> >> JACK report Headphone Mic, status 0
> >> JACK created Headset Mic Phantom, type 2
> >> CTRL: add: Headset Mic Phantom Jack:0
> >> JACK report Headset Mic Phantom, status 2
> >> CTL Notify: Headset Mic Phantom Jack:0, mask=1
> >> JACK created Internal Mic Phantom, type 2
> >> CTRL: add: Internal Mic Phantom Jack:0
> >> JACK report Internal Mic Phantom, status 2
> >> CTL Notify: Internal Mic Phantom Jack:0, mask=1
> >> JACK created Speaker Front Phantom, type 4
> >> CTRL: add: Speaker Front Phantom Jack:0
> >> JACK report Speaker Front Phantom, status 4
> >> CTL Notify: Speaker Front Phantom Jack:0, mask=1
> >> JACK created External Subwoofer, type 4
> >> CTRL: add: External Subwoofer Jack:0
> >>
> >> The problem of hda jack kctls are those retaskable I/O jack controls
> >>
> >> 1) multi io jacks in those 3 stack desktop
> >> 2) headphone/mic jack in asus netbook
> >> 3) dell-headset-multi combo jack
> >>
> >> the role of the jack in 1) change from input to output when "Channel
> mode" change from "2ch" to "4ch" or "6ch"
> >>
> >> the role of the jack in 2) and 3) change from Output to Input when
> "Capture Source" change from Internal Mic/Headset Mic to Headphone Mic
> >>
> >> In your case, Headphone Mic Jack kctl return the presence of HP jack
> except when the combo jack is set to support conventional mic (i.e. when
> the driver change pin ctl of hp pin node 0x15 to zero and set pin ctl of
> mic pin to IN),
> >>
> >> The driver already unmute the internal speaker when you change capture
> source to Headphone Mic
> >>
> >> The only point is whether pulseaudio still regard this Headphone Mic
> Jack as the availability of the headphone port when the capture source is
> Headphone Mic
> >>
> >>
> http://cgit.freedesktop.org/pulseaudio/pulseaudio/commit/?id=ca4942e89cf462e5f8c36ca9b8b689879083af6b
> >>
> >>
> >
>
> >
> > I really appreciate your efforts in this matter. Unfortunately I
> understand parts of our talks and I am unsure what I can do.
> > I am not a kernel / driver developer.
> >
> > Are there any steps I can do knowing my limited skills on driver
> development?
> > If so, would you mind to describe them step by step, so this beginner
> understands? :D
>
> Don't forget cc David since he implement dell-headset-multi
>
>
> https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/commit/sound/pci/hda?id=73bdd597823e2231dc882577dbbaf8df92fe1775
>
> static void alc_update_headset_mode(struct hda_codec *codec)
> +{
> + struct alc_spec *spec = codec->spec;
> +
> + hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
> + hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
> +
> + int new_headset_mode;
> if (!snd_hda_jack_detect(codec, hp_pin))
> + new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
> + else if (mux_pin == spec->headset_mic_pin)
> + new_headset_mode = ALC_HEADSET_MODE_HEADSET;
> + else if (mux_pin == spec->headphone_mic_pin)
> + new_headset_mode = ALC_HEADSET_MODE_MIC;
> + else
> + new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
> +
> + if (new_headset_mode == spec->current_headset_mode)
> + return;
> +
> + switch (new_headset_mode) {
> + case ALC_HEADSET_MODE_UNPLUGGED:
> + alc_headset_mode_unplugged(codec);
> + spec->gen.hp_jack_present = false;
> + break;
> + case ALC_HEADSET_MODE_HEADSET:
> + if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
> + alc_determine_headset_type(codec);
> + if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
> + alc_headset_mode_ctia(codec);
> + else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
> + alc_headset_mode_omtp(codec);
> + spec->gen.hp_jack_present = true;
> + break;
> + case ALC_HEADSET_MODE_MIC:
> + alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
> + spec->gen.hp_jack_present = false;
> + break;
> + case ALC_HEADSET_MODE_HEADPHONE:
> + alc_headset_mode_default(codec);
> + spec->gen.hp_jack_present = true;
> + break;
> + }
> + if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
> + snd_hda_set_pin_ctl_cache(codec, hp_pin,
> +   AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
> + if (spec->headphone_mic_pin)
> + snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
> +   PIN_VREFHIZ);
> + }
> + spec->current_headset_mode = new_headset_mode;
> +
> + snd_hda_gen_update_outputs(codec);
> +}
>
> You have to post the output of
>
> pactl list sources
>
> when the is no jack plugged, headphone plugged, headset plugged and mic
> jack plugged
>
> The logic is defined in alc_update_headset_mode()
>
> Although auto mic selection is disabled when the combo jack can support
> conventional mic and headset mic
>
> The capture source of these kind of laptop is not as same as the capture
> source of ac97 codec of pci sound cards, it is not really manually selected
> in sound preference
>
> When there is no jack plugged in, the  capture source should be internal
> mic.
>
> As the codec cannot differentitate headset, headphone and mic when there
> is jack plugged in and driver use mux_pin to determine the type of the jack
>
> In pulseaudio term,
>
> [Jack Headphone Mic] can determine the availability of internal mic is YES
> when unplugged but unknown when plugged
>
>
> http://cgit.freedesktop.org/pulseaudio/pulseaudio/tree/src/modules/alsa/mixer/paths/analog-input-internal-mic.conf
>
> [Jack Headphone Mic]
>
> The availability of headphone mic is unknown when plugged and NO when
> unplugged
>
>
> http://cgit.freedesktop.org/pulseaudio/pulseaudio/tree/src/modules/alsa/mixer/paths/analog-input-headphone-mic.conf
>
> [Jack Headphone Mic]
>
> The availability of headset mic is unknown when plugged and NO when
> unplugged
>
>
> http://cgit.freedesktop.org/pulseaudio/pulseaudio/tree/src/modules/alsa/mixer/paths/analog-input-headset-mic.conf
>
> It is not exactly UNKNOWN but determined by the capture source when plugged
>



-- 
Arthur Borsboom
Lieven de Keystraat 77
3067 KG, Rotterdam
The Netherlands
Mob: +31629089953
Email: arthurborsboom at gmail.com
Skype: Arthur Borsboom, The Hague, The Netherlands

[image: View Arthur's LinkedIn profile]
<http://uk.linkedin.com/in/arthurborsboom>


More information about the Alsa-devel mailing list