]> git.alsa-project.org Git - alsa.git/commitdiff
hda-analyzer: do not use procfs, show basic card info
authorJaroslav Kysela <perex@t61.perex-int.cz>
Mon, 1 Dec 2008 08:59:23 +0000 (09:59 +0100)
committerJaroslav Kysela <perex@t61.perex-int.cz>
Mon, 1 Dec 2008 08:59:23 +0000 (09:59 +0100)
hda-analyzer/hda_analyzer.py
hda-analyzer/hda_codec.py

index b00f30167e9a1cc68313df3b6f151ab880da69fa..da77a8c3f7f25c27a4f49aa0a1823e35b0c1535f 100755 (executable)
@@ -17,29 +17,26 @@ import gtk
 import pango
 
 from dircache import listdir
-from hda_codec import HDACodec, HDANode, \
+from hda_codec import HDACodec, HDANode, HDA_card_list, \
                       EAPDBTL_BITS, PIN_WIDGET_CONTROL_BITS, \
                       PIN_WIDGET_CONTROL_VREF, DIG1_BITS, GPIO_IDS
 
-PROC_DIR = '/proc/asound'
-
 CODEC_TREE = {}
 
-def read_verbs2(card, codec):
-  c = HDACodec(card, codec)
+def read_nodes2(card, codec):
+  try:
+    c = HDACodec(card, codec)
+  except OSError, msg:
+    return
   c.analyze_root_nodes()
   CODEC_TREE[card][codec] = c
 
-def read_verbs1(card):
-  CODEC_TREE[card] = {}
-  for l in listdir('%s/card%s' % (PROC_DIR, card)):
-    if l.startswith('codec#') and l[6] >= '0' and l[6] <= '9':
-      read_verbs2(card, int(l[6:]))
-
-def read_verbs():
-  for l in listdir(PROC_DIR):
-    if l.startswith('card') and l[4] >= '0' and l[4] <= '9':
-      read_verbs1(int(l[4:]))
+def read_nodes():
+  l = HDA_card_list()
+  for c in l:
+    CODEC_TREE[c.card] = {}
+    for i in range(4):
+      read_nodes2(c.card, i)
 
 (
     TITLE_COLUMN,
@@ -110,6 +107,7 @@ class HDAAnalyzer(gtk.Window):
     card = model.get_value(iter, CARD_COLUMN)
     codec = model.get_value(iter, CODEC_COLUMN)
     node = model.get_value(iter, NODE_COLUMN)
+    self.card = card
     self.codec = None
     if codec >= 0:
       self.codec = CODEC_TREE[card][codec]
@@ -137,7 +135,12 @@ class HDAAnalyzer(gtk.Window):
       self.node_window.remove(child)
 
     if not n:
-      if codec:
+      if not codec:
+        for i in CODEC_TREE[self.card]:
+          card = CODEC_TREE[self.card][i].mcard
+          break
+        self.__build_card(card)
+      elif codec:
         self.__build_codec(codec)
       else:
         return
@@ -732,8 +735,34 @@ class HDAAnalyzer(gtk.Window):
     mframe.add(vbox)
     w.add_with_viewport(mframe)
 
+  def __build_card_info(self, card):
+    text_view = self.__new_text_view()
+    str =  'Card:       %s\n' % card.card
+    str += 'Id:         %s\n' % card.id
+    str += 'Driver:     %s\n' % card.driver
+    str += 'Name:       %s\n' % card.name
+    str += 'LongName:   %s\n' % card.longname
+    buffer = gtk.TextBuffer(None)
+    iter = buffer.get_iter_at_offset(0)
+    buffer.insert(iter, str[:-1])
+    text_view.set_buffer(buffer)
+    text_view.set_editable(False)
+    text_view.set_cursor_visible(False)
+    return text_view
+
+  def __build_card(self, card):
+    w = self.node_window
+
+    mframe = gtk.Frame(card.name)
+    mframe.set_border_width(4)
+
+    vbox = gtk.VBox(False, 0)
+    vbox.pack_start(self.__build_card_info(card), False, False)
+    mframe.add(vbox)
+    w.add_with_viewport(mframe)
+
 def main():
-  read_verbs()
+  read_nodes()
   HDAAnalyzer()
   gtk.main()
 
index ffd7c0ae16097060288b2f0da5614d2e8699a767..02663e6f336766451bfbc2fc2c02325d31dd4861 100644 (file)
@@ -21,6 +21,8 @@ IOCTL_PVERSION = 0x80044810
 IOCTL_VERB_WRITE = 0xc0084811
 IOCTL_GET_WCAPS = 0xc0084812
 
+CTL_IOCTL_CARD_INFO = 0x81785501
+
 AC_NODE_ROOT   = 0
 
 (
@@ -608,6 +610,21 @@ class HDAGPIO:
       return
     self.write(name)
 
+class HDACard:
+
+  def __init__(self, card, ctl_fd=None):
+    self.card = card
+    if not ctl_fd:
+      ctl_fd = os.open("/dev/snd/controlC%i" % card, os.O_RDONLY)
+    info = struct.pack('ii16s16s32s80s16s80s128s', 0, 0, '', '', '', '', '', '', '')
+    res = ioctl(ctl_fd, CTL_IOCTL_CARD_INFO, info)
+    a = struct.unpack('ii16s16s32s80s16s80s128s', res)
+    self.id = a[2].replace('\x00', '')
+    self.driver = a[3].replace('\x00', '')
+    self.name = a[4].replace('\x00', '')
+    self.longname = a[5].replace('\x00', '')
+    self.components = a[8].replace('\x00', '')
+
 class HDACodec:
 
   afg = None
@@ -617,8 +634,14 @@ class HDACodec:
   revision_id = None
 
   def __init__(self, card=0, device=0):
-    self.card = card
-    self.device = device
+    if type(1) == type(card):
+      self.device = device
+      self.card = card
+      self.mcard = HDACard(card)
+    else:
+      self.device = device
+      self.mcard = card
+      self.card = card.card
     self.fd = os.open("/dev/snd/hwC%sD%s" % (card, device), os.O_RDWR)
     info = struct.pack('Ii64s80si64s', 0, 0, '', '', 0, '')
     res = ioctl(self.fd, IOCTL_INFO, info)
@@ -1028,6 +1051,21 @@ class HDACodec:
       str += print_realtek_coef(node)
     return str, node
 
+def HDA_card_list():
+  from dircache import listdir
+  result = []
+  for name in listdir('/dev/snd/'):
+    if name.startswith('controlC'):
+      fd = os.open("/dev/snd/%s" % name, os.O_RDONLY)
+      info = struct.pack('ii16s16s32s80s16s80s128s', 0, 0, '', '', '', '', '', '', '')
+      res = ioctl(fd, CTL_IOCTL_CARD_INFO, info)
+      a = struct.unpack('ii16s16s32s80s16s80s128s', res)
+      card = a[0]
+      components = a[8].replace('\x00', '')
+      if components.find('HDA:') >= 0:
+        result.append(HDACard(card, ctl_fd=fd))
+  return result
+
 if __name__ == '__main__':
   v = HDACodec()
   v.analyze_root_nodes()