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,
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]
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
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()
IOCTL_VERB_WRITE = 0xc0084811
IOCTL_GET_WCAPS = 0xc0084812
+CTL_IOCTL_CARD_INFO = 0x81785501
+
AC_NODE_ROOT = 0
(
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
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)
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()