如果您还没有听说过SoundSwitch,它的Windows应用程序允许您使用键盘快捷键切换声音输出/输入设备。我为linux制作了一个类似的应用程序,但我无法让它正常工作。应用程序的大部分已完成,如果您想查看完整代码,请点击此处:https://github.com/boskobs/sound-Source-Switch-4-Linux 贝娄是负责应用变更的部分:
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))
它会更改默认声音输出设备,并将所有当前应用程序传输到该设备。退出应用程序并切换输出设备时出现问题。下次启动该应用程序时,它输出声音的设备是在切换之前处于活动状态的旧设备。如何使新的默认输出设备真正作为默认设置?
答案 0 :(得分:1)
根据the FreeDesktop.org wiki以及this answer on AskUbuntu和相关帖子,每当新流(发声程序)启动时,PulseAudio都会将其附加到它附加的同一个接收器(输出设备)到最后一次它消失了。这听起来像你所看到的效果。你关闭一个使用设备A的程序,启动你的Source Switch应用程序并将所有内容切换到设备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。)
答案 1 :(得分:0)
如果当前选择的设备与其中一个应用程序正在流式传输的设备不同,则会应用修补程序而不是切换。
# 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()
它不理想,但它完成了工作。