At Tue, 17 Jul 2012 17:20:27 +0200, David Henningsson wrote:
On 07/17/2012 05:05 PM, Takashi Iwai wrote:
Usually the device has a jack detection mechanism, and you can check it via hda-verb or whatever. Plug your headphone to the headphone jack, and check any of the pin reacts to GET_PIN_SENSE verb (call it after setting SET_PIN_SENSE verb). For example,
% hda-verb /dev/snd/hwC0D0 0x21 SET_PIN_SENSE 1
How many codecs really require SET_PIN_SENSE? I have never had a problem with omitting the SET_PIN_SENSE command.
Well, in theory, if the codec has the trigger bit set, you always need to give this trigger verb. IIRC, IDT codecs require the trigger explicitly.
% hda-verb /dev/snd/hwC0D0 0x21 GET_PIN_SENSE 0
Check the value returned from GET_PIN_SENSE. If bit 31 (0x80000000) is set, this is likely the pin of the interest.
Check this for all pins, i.e. between 0x12 and 0x21. Some nodes are no pins, but it doesn't matter much.
Btw, I made convenience script for doing this a year ago. Here it is again.
To install, you put it right next to the hda-analyzer py files, as it makes use of hda_codec.py from hda-analyzer, then run "sudo hda-jack-sense-test.py -a" (see -h for switches to set codec and card indices).
Let me know if you're interested in having this small script in ALSA upstream, and if so, what I should do to get it in there.
I guess it can be put to the same repo of hda_analyzer. I left the decision to Jaroslav...
thanks,
Takashi
-- David Henningsson, Canonical Ltd. https://launchpad.net/~diwic
[2 hda-jack-sense-test.py <text/x-python (7bit)>] #!/usr/bin/env python # # Written by David Henningsson, Copyright 2011 Canonical Ltd. # Licensed under GPLv2+
# the hda_codec.py file comes from Jaroslav Kysela's hda_analyzer program. from hda_codec import *
def parseoptions(): from optparse import OptionParser parser = OptionParser() parser.add_option("-c", "--card", dest="cardindex", default=0, metavar="CARD", help="card index (as can be seen in /proc/asound/cards)") parser.add_option("-d", "--codec", dest="codecindex", default=0, metavar="CODEC", help="codec device index (as can be seen in /proc/asound/cardX/codecY)") parser.add_option("-a", "--allpins", dest="tryallpins", default=False, action="store_true", help="also check pins which (probably) are not physical jacks") (options, args) = parser.parse_args() return int(options.cardindex), int(options.codecindex), options.tryallpins
def should_check_presence(node, tryallpins): if WIDGET_TYPE_IDS[node.wtype] != 'PIN': return False if tryallpins: return True conn_type = (node.defcfg_pincaps >> 30) & 0x03 if conn_type != 0: # Not a Jack return False if node.defcfg_pincaps & (1 << 8): # Jack has NO_PRESENCE set return False return True
def get_simplecaps(node): conn_type = (node.defcfg_pincaps >> 30) & 0x03 if conn_type == 1: # N/A return 'Not connected' if conn_type == 0: # Jack return "%s %s" % (node.jack_color_name, node.jack_type_name) return "Internal %s" % node.jack_type_name
cardindex, codecindex, tryallpins = parseoptions() codec = HDACodec(cardindex, codecindex) codec.analyze() for nid in codec.nodes: node = codec.get_node(nid) if not should_check_presence(node, tryallpins): continue present = codec.rw(nid, VERBS['GET_PIN_SENSE'], 0) & 0x80000000 print "Pin 0x%.2x (%s): present = %s" % (nid, get_simplecaps(node), "Yes" if present else "No")