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

时间:2016-12-22 20:35:16

标签: python linux python-3.x

如果您还没有听说过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))

它会更改默认声音输出设备,并将所有当前应用程序传输到该设备。退出应用程序并切换输出设备时出现问题。下次启动该应用程序时,它输出声音的设备是在切换之前处于活动状态的旧设备。如何使新的默认输出设备真正作为默认设置?

2 个答案:

答案 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()

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