from collections import namedtuple import pacmd Sink = namedtuple("Sink", ["name", "description", "index", "state", "muted"]) SinkInput = namedtuple("SinkInput", ["name", "driver", "sink"]) def list_sinks(): res = pacmd.list_sinks() assert len(res.sections) == 1 assert res.sections[0].name == "sink" ret = [] for item in res.sections[0].items: muted = item.children["muted"].value if type(muted) == str: if muted == "yes": muted = True elif muted == "no": muted = False else: assert False sink = Sink( item.children["name"].value, item.children["properties"].children["device.description"].value, item.index, item.children["state"].value, muted) ret.append(sink) return ret def list_sink_inputs(): res = pacmd.list_sink_inputs() assert len(res.sections) == 1 assert res.sections[0].name == "input" ret = [] for item in res.sections[0].items: name = item.children["properties"].children["media.name"].value if "application.process.binary" in item.children["properties"].children: name += " (" + item.children["properties"].children["application.process.binary"].value + ")" si = SinkInput( name, item.children["driver"].value, int(item.children["sink"].value.split()[0])) ret.append(si) return ret