| #!/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:]) |
| |