From ea10667ea6fad92b99e6c6dffbea89dfdee09c7d Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 4 Feb 2010 20:19:52 +0100 Subject: [PATCH] hda-analyzer: Show PCM devices and Universal Controls in GUI Signed-off-by: Jaroslav Kysela --- hda-analyzer/hda_analyzer.py | 46 ++++++++++++++++++++++++++++++++++-- hda-analyzer/hda_codec.py | 29 ++++++++++++++++++++++- hda-analyzer/hda_proc.py | 15 ++++++++++++ 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/hda-analyzer/hda_analyzer.py b/hda-analyzer/hda_analyzer.py index 384df62..5905024 100755 --- a/hda-analyzer/hda_analyzer.py +++ b/hda-analyzer/hda_analyzer.py @@ -771,8 +771,8 @@ mailing list, too. frame.add(text_view) vbox.pack_start(frame) - hbox1 = gtk.HBox(False, 0) - if node.sdi_select != None: + if not node.sdi_select is None: + hbox1 = gtk.HBox(False, 0) frame = gtk.Frame('SDI Select') adj = gtk.Adjustment(node.sdi_select, 0.0, 16.0, 1.0, 1.0, 1.0) scale = gtk.HScale(adj) @@ -806,6 +806,42 @@ mailing list, too. return vbox + def __build_device(self, device): + vbox = gtk.VBox(False, 0) + frame = gtk.Frame('Device') + frame.set_border_width(4) + hbox = gtk.HBox(False, 0) + s = 'name=' + str(device.name) + ', type=' + \ + str(device.type) + ', device=' + str(device.device) + label = gtk.Label(s) + hbox.pack_start(label, False, False) + frame.add(hbox) + vbox.pack_start(frame) + return vbox + + def __build_controls(self, ctrls): + vbox = gtk.VBox(False, 0) + frame = gtk.Frame('Controls') + frame.set_border_width(4) + vbox1 = gtk.VBox(False, 0) + for ctrl in ctrls: + hbox1 = gtk.HBox(False, 0) + vbox1.pack_start(hbox1, False, False) + s = 'name=' + str(ctrl.name) + ', index=' + str(ctrl.index) + \ + ', device=' + str(ctrl.device) + label = gtk.Label(s) + hbox1.pack_start(label, False, False) + if ctrl.amp_chs: + hbox1 = gtk.HBox(False, 0) + vbox1.pack_start(hbox1, False, False) + s = ' chs=' + str(ctrl.amp_chs) + ', dir=' + str(ctrl.amp_dir) + \ + ', idx=' + str(ctrl.amp_idx) + ', ofs=' + str(ctrl.amp_ofs) + label = gtk.Label(s) + hbox1.pack_start(label, False, False) + frame.add(vbox1) + vbox.pack_start(frame) + return vbox + def __build_node(self, node): w = self.node_window @@ -813,6 +849,12 @@ mailing list, too. mframe.set_border_width(4) vbox = gtk.VBox(False, 0) + dev = node.get_device() + if not dev is None: + vbox.pack_start(self.__build_device(dev), False, False) + ctrls = node.get_controls() + if ctrls: + vbox.pack_start(self.__build_controls(ctrls), False, False) hbox = gtk.HBox(False, 0) hbox.pack_start(self.__build_node_caps(node)) hbox.pack_start(self.__build_connection_list(node)) diff --git a/hda-analyzer/hda_codec.py b/hda-analyzer/hda_codec.py index cbea3f8..4e0a969 100644 --- a/hda-analyzer/hda_codec.py +++ b/hda-analyzer/hda_codec.py @@ -653,6 +653,12 @@ class HDANode: self.codec.rw(self.nid, VERBS['SET_DIGI_CONVERT_2'], (self.origin_digi1 >> 8) & 0xff) self.reread() + def get_device(self): + return self.codec.get_device(self.nid) + + def get_controls(self): + return self.codec.get_controls(self.nid) + class HDAGPIO: def __init__(self, codec, nid): @@ -740,6 +746,7 @@ class HDACodec: self.version = struct.unpack('I', res) if self.version < 0x00010000: # 1.0.0 raise IOError, "unknown HDA hwdep version" + self.parse_proc() def __del__(self): if not self.fd is None: @@ -815,9 +822,20 @@ class HDACodec: return HDARootNode(self, "Audio Root Node") return self.nodes[nid] + def parse_proc(self): + from hda_proc import HDACodecProc, DecodeProcFile + file = "/proc/asound/card%i/codec#%i" % (self.card, self.device) + if os.path.exists(file): + file = DecodeProcFile(file) + self.proc_codec = HDACodecProc(self.card, self.device, file) + else: + self.proc_codec = None + print "Unable to find proc file '%s'" % file + def analyze(self): self.afg = None self.mfg = None + self.nodes = {} self.vendor_id = self.param_read(AC_NODE_ROOT, PARAMS['VENDOR_ID']) self.subsystem_id = self.param_read(AC_NODE_ROOT, PARAMS['SUBSYSTEM_ID']) self.revision_id = self.param_read(AC_NODE_ROOT, PARAMS['REV_ID']) @@ -866,7 +884,6 @@ class HDACodec: nodes_count, nid = self.get_sub_nodes(self.afg) self.base_nid = nid - self.nodes = {} for i in range(nodes_count): self.nodes[nid] = HDANode(self, nid) nid += 1 @@ -1178,6 +1195,16 @@ class HDACodec: def dump_node_extra(self, node): return '' + def get_device(self, nid): + if self.proc_codec: + return self.proc_codec.get_device(nid) + return None + + def get_controls(self, nid): + if self.proc_codec: + return self.proc_codec.get_controls(nid) + return None + def HDA_card_list(): from dircache import listdir result = [] diff --git a/hda-analyzer/hda_proc.py b/hda-analyzer/hda_proc.py index 1f69dbf..ef2dd13 100644 --- a/hda-analyzer/hda_proc.py +++ b/hda-analyzer/hda_proc.py @@ -255,6 +255,9 @@ class ProcNode(HDABaseProc): self.wrongfile('more than one PCM device?') self.device = HDApcmDevice(name, type, device) + def get_device(self): + return self.device + def add_converter(self, line): line, stream = self.decodeintw(line, 'stream=') line, channel = self.decodeintw(line, 'channel=') @@ -313,6 +316,9 @@ class ProcNode(HDABaseProc): line, ctl.amp_ofs = self.decodeintw(line, 'ofs=') ctl.amp_dir = ctl.amp_dir == 'In' and HDA_INPUT or HDA_OUTPUT + def get_controls(self): + return self.controls + def add_ampcaps(self, line, dir): line = line.strip() par = PARAMS[dir == HDA_INPUT and 'AMP_IN_CAP' or 'AMP_OUT_CAP'] @@ -449,6 +455,7 @@ class HDACodecProc(HDACodec, HDABaseProc): def __init__(self, card, device, proc_file): self.hwaccess = False + self.proc_codec = None self.card = card self.device = device self.mcard = HDACardProc(card) @@ -750,6 +757,14 @@ class HDACodecProc(HDACodec, HDABaseProc): node = self.proc_nids[node.nid] return node.dump_extra() + def get_device(self, nid): + node = self.proc_nids[nid] + return node.get_device() + + def get_controls(self, nid): + node = self.proc_nids[nid] + return node.get_controls() + # # test section # -- 2.47.1