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/so...
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
- multi io jacks in those 3 stack desktop
- headphone/mic jack in asus netbook
- 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=ca4942e89cf462e...
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/pc...
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/mixe...
[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/mixe...
[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/mixe...
It is not exactly UNKNOWN but determined by the capture source when plugged