From: Jaroslav Kysela Date: Mon, 1 Dec 2008 08:59:23 +0000 (+0100) Subject: hda-analyzer: do not use procfs, show basic card info X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=06b09196c6875850a002c3f8aff032aa67048844;p=alsa.git hda-analyzer: do not use procfs, show basic card info --- diff --git a/hda-analyzer/hda_analyzer.py b/hda-analyzer/hda_analyzer.py index b00f301..da77a8c 100755 --- a/hda-analyzer/hda_analyzer.py +++ b/hda-analyzer/hda_analyzer.py @@ -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() diff --git a/hda-analyzer/hda_codec.py b/hda-analyzer/hda_codec.py index ffd7c0a..02663e6 100644 --- a/hda-analyzer/hda_codec.py +++ b/hda-analyzer/hda_codec.py @@ -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()