Advertisement
Guest User

select_audio_sink.py

a guest
Nov 27th, 2023
414
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.46 KB | Software | 0 0
  1. #!/usr/bin/python3
  2. # vim: ai:sw=4:ts=4:fenc=utf-8
  3.  
  4. import json
  5. from subprocess import Popen, DEVNULL, PIPE
  6.  
  7. def list_sinks():
  8. p = Popen(["pactl", "-f", "json", "list", "sinks"], stdout=PIPE)
  9. r = p.communicate()
  10. if p.returncode != 0:
  11. return None
  12.  
  13. data = json.loads(r[0])
  14. return data
  15.  
  16. def get_default_sink():
  17. p = Popen(["pactl", "get-default-sink"], stdout=PIPE)
  18. r = p.communicate()
  19. if p.returncode != 0:
  20. return None
  21.  
  22. return r[0].decode().removesuffix("\n")
  23.  
  24.  
  25. def show_dialog(data, default = None):
  26. cmd = ["kdialog", "--geometry", "640x240", "--radiolist", "Select audio sink"]
  27.  
  28. for i in range(len(data)):
  29. #text = "{} ({})".format(data[i]["description"], data[i]["properties"]["alsa.id"])
  30. text = data[i]["description"]
  31. selected = "on" if default is not None and default == data[i]["name"] else "off"
  32. cmd.extend([
  33. str(i),
  34. text,
  35. selected
  36. ])
  37.  
  38. p = Popen(cmd, stdout=PIPE, stderr=DEVNULL)
  39. r = p.communicate()
  40. return int(r[0]) if p.returncode == 0 else None
  41.  
  42.  
  43. def set_sink(name):
  44. print("set audio sink: {}".format(name))
  45. Popen(["pactl", "set-default-sink", name])
  46.  
  47.  
  48. def main():
  49. sinks = list_sinks()
  50. default = get_default_sink()
  51. choice = show_dialog(sinks, default)
  52. if choice is not None:
  53. set_sink(sinks[choice]["name"])
  54.  
  55.  
  56. if __name__ == "__main__":
  57. main()
  58.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement