手动更改Linux上的声音输出设备

如果您还没有听说过SoundSwitch,那么它就是一个Windows应用程序,允许您使用键盘快捷键切换声音输出/input设备。 我已经做了一个类似的应用程序的Linux,但我不能让它正常工作。 大部分的应用程序已经完成,如果你想看到完整的代码,在这里: https : //github.com/boskobs/sound-Source-Switch-4-Linux Bellow是负责应用更改的部分:

os.system("pacmd set-default-sink " + str(nextindex)) output = subprocess.getoutput("pacmd list-sink-inputs") for item in output.split("\n"): if "index:" in item: inputindex = item.strip().replace("index: ","") os.system("pacmd move-sink-input " + str(inputindex) + " " + str(nextindex)) 

它会更改默认的声音输出设备,并将所有当前的应用程序传输到该设备。 当我退出一个应用程序并切换输出设备时,会出现问题。 下一次我启动该应用程序,它输出声音的设备是在切换之前激活的旧设备。 我怎样才能使新的默认输出设备真正作为默认工作?

根据FreeDesktop.org wiki以及AskUbuntu和相关帖子上的这个答案 ,每当一个新的流(发音程序)启动时,PulseAudio将把它附加到它上次连接的同一个接收器(输出设备)消失了。 这听起来像你看到的效果。 您关闭正在使用设备A的程序,启动您的源代码切换应用程序,并将所有内容切换到设备B,然后再次打开该程序,PulseAudio再次将其设置为使用设备A.

您可以通过添加该行来禁用PulseAudio的这种行为

 load-module module-stream-restore restore_device=false 

/etc/pulse/default.pa并重新启动PulseAudio。 对于将要使用您的应用来管理其声音设备的人来说,这可能是一个合理的选择; 你可以把它加入到你的安装过程中,但是当你搞砸系统配置文件的时候,应该非常小心。

或者,您可以删除存储在$HOME/.pulse/*stream-volumes*.gdbm文件中的流还原数据库。 从这一点开始,PulseAudio会认为每个音频流都是全新的,并将其分配到回退音频设备,这是您使用set-default-sink 。 (这也需要重新启动PA。)

如果当前选择的设备与其中一个应用正在进行流式处理的设备不同,则将应用修复而不是切换。

  # Checking for changes output = subprocess.getoutput("pacmd list-sinks").split("\n") for item in range(0, len(output)-1): if "* index: " in output[item]: currentindexname = output[item+1].replace("name: <", "").strip()[:-1] break output = subprocess.getoutput("pacmd list-sink-inputs") for item in output.split("\n"): if "sink:" in item: if currentindexname != item.split("<")[1].split(">")[0]: for item in output.split("\n"): if "index:" in item: inputindex = item.strip().replace("index: ","") os.system("pacmd move-sink-input " + str(inputindex) + " " + str(currentindex)) os.system('notify-send "Source" "Fixed"') exit() 

它不理想,但它完成了工作。