]> git.alsa-project.org Git - alsa.git/commitdiff
hda-analyzer: Show PCM devices and Universal Controls in GUI
authorJaroslav Kysela <perex@perex.cz>
Thu, 4 Feb 2010 19:19:52 +0000 (20:19 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 4 Feb 2010 19:19:52 +0000 (20:19 +0100)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
hda-analyzer/hda_analyzer.py
hda-analyzer/hda_codec.py
hda-analyzer/hda_proc.py

index 384df6284c0605a0d93bbd7fdc2801251c0e58e0..5905024e8ca2bba0c15cd726a979a82b835b79ba 100755 (executable)
@@ -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))
index cbea3f8414ba697e8a00941010b692cff478374d..4e0a9690285154b23c1272e8c4f2907645863461 100644 (file)
@@ -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 = []
index 1f69dbf2142dd76f4f2cebca892d22623603257d..ef2dd134948f0d1616053026985051c8401a8a6b 100644 (file)
@@ -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
 #