You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.4 KiB
96 lines
2.4 KiB
4 months ago
|
#!/usr/bin/env python
|
||
|
# Copyright 2014 The Chromium OS Authors. All rights reserved.
|
||
|
# Use of this source code is governed by a BSD-style license that can be
|
||
|
# found in the LICENSE file.
|
||
|
|
||
|
"""Dump DAPM widgets status as a 'dot' graph file.
|
||
|
|
||
|
To generate widget status for a device run
|
||
|
ssh $REMOTE asoc_dapm_graph > dot.txt && dot -Kfdp -Tpng dot.txt -o widgets.png
|
||
|
"""
|
||
|
|
||
|
from __future__ import print_function
|
||
|
import os
|
||
|
import platform
|
||
|
import re
|
||
|
import sys
|
||
|
import time
|
||
|
|
||
|
ROOTDIR = '/sys/kernel/debug/asoc/'
|
||
|
# Some widget names are widely used by many codecs, adding them to the graph
|
||
|
# creates a mess.
|
||
|
IGNORE_WIDGETS = ('Playback', 'Capture', 'bias_level')
|
||
|
|
||
|
|
||
|
def handle_widgets(path):
|
||
|
"""Reads DAPM widget information from sysfs and generates dot graph entry.
|
||
|
|
||
|
Args:
|
||
|
path: path for sysfs file that exports information about DAPM widget.
|
||
|
"""
|
||
|
for w in os.listdir(path):
|
||
|
if w in IGNORE_WIDGETS:
|
||
|
continue
|
||
|
|
||
|
with open(os.path.join(path, w)) as f:
|
||
|
lines = f.readlines()
|
||
|
|
||
|
active = lines[0].startswith(w + ': On ')
|
||
|
color = 'green' if active else 'red'
|
||
|
print('\t"%s" [color = %s]' % (w, color))
|
||
|
|
||
|
for l in lines[1:]:
|
||
|
l = l.rstrip()
|
||
|
# The string format is (in/out) "switch" "widget".
|
||
|
edge = list(filter(None, re.split(r' (in|out) "(.+)" "(.+)"', l)))
|
||
|
|
||
|
if len(edge) != 3:
|
||
|
continue
|
||
|
|
||
|
direction = edge[0]
|
||
|
source = edge[2]
|
||
|
|
||
|
if source in IGNORE_WIDGETS:
|
||
|
continue
|
||
|
|
||
|
# We need to output the edge only once (e.g. inbound).
|
||
|
if direction != 'in':
|
||
|
continue
|
||
|
|
||
|
print('\t"%s" -> "%s"' % (source, w))
|
||
|
|
||
|
|
||
|
def handle_card(path):
|
||
|
"""Generates dot graph file for the given card.
|
||
|
|
||
|
Args:
|
||
|
path: path to sysfs directory that exports DAPM information for a sound card.
|
||
|
"""
|
||
|
host = platform.uname()[1]
|
||
|
print('// Generated %s at %s.' % (time.strftime("%c"), host))
|
||
|
print('// To visualize the graph run "dot -Kfdp -Tpng $SCRIPT_OUTPUT_FILE -o widgets.png".')
|
||
|
print('digraph G {')
|
||
|
print('\tbgcolor = grey')
|
||
|
for root, dirs, files in os.walk(path):
|
||
|
if 'dapm' in dirs:
|
||
|
handle_widgets(os.path.join(root, 'dapm'))
|
||
|
dirs.remove('dapm')
|
||
|
print('}')
|
||
|
|
||
|
|
||
|
def main(argv):
|
||
|
for c in os.listdir(ROOTDIR):
|
||
|
path = os.path.join(ROOTDIR, c)
|
||
|
# We assume that directories in ROOTDIR are cards.
|
||
|
if os.path.isdir(path):
|
||
|
handle_card(path)
|
||
|
sys.exit(0)
|
||
|
|
||
|
print('No cards found', file=sys.stderr)
|
||
|
sys.exit(1)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main(sys.argv[1:])
|
||
|
|