当我在玩《中世纪战争》等骑士游戏并切换到 Firefox 或桌面等其他软件时,游戏声音仍然会播放。
那么,我该如何解决这个问题?
答案1
(自动)如果特定应用程序的窗口不在前面,则将其静音
我在 Rhythmbox 上测试了下面的脚本,没有任何错误。
如果目标进程的窗口不在最前面(一秒钟内),则在后台运行以下脚本将暂停目标进程,如果应用程序自带声音,则静音。
每当窗口再次位于最前面时,进程就会从原来的位置恢复,声音也会再次起作用。
如果目标进程/应用程序根本没跑,脚本切换到更长的周期(模式),检查每五秒钟仅一次目标应用程序是否运行。这样,如果没有任务要完成,脚本的效率就会非常低。
剧本
#!/usr/bin/env python3
import subprocess
import time
# ---set the proc to pause when not the active window
wclass = "rhythmbox"
# ---
def get(cmd):
# just a helper function to not repeat verbose subprocess sections
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
while True:
# the longer period: application is not running (saving fuel)
time.sleep(5)
front1 = ""
while True:
# if the application runs, switch to a shorter response time
time.sleep(1)
# get the possible pid, get() returns "None" if not running,
# script then switches back to 5 sec check
pid = get(["pgrep", wclass])
if pid:
front2 = wclass in get([
"xprop", "-id", get(["xdotool", "getactivewindow"])
])
# run either kill -stop or kill -cont only if there is
# a change in the situation
if front2 != front1:
if front2 == True:
cm = ["kill", "-cont", pid]
print("run") # just a test indicator, remove afterwards
else:
cm = ["kill", "-stop", pid]
print("stop") # just a test indicator, remove afterwards
subprocess.Popen(cm)
front1 = front2
else:
break
如何使用
该脚本需要
xdotool
获取最前面的窗口的信息:sudo apt-get install xdotool
- 将脚本复制到一个空文件中,另存为
pause_app.py
在脚本的头部部分,将进程名称设置为暂停(替换
rhythmbox
)。
通常这与(第一部分)相同WM_CLASS
,但对于你的情况,我怀疑这是否不应该是steam
其他内容。运行以确保ps -u <yourname>
做出有根据的猜测,然后
kill <pid> (the process id)
去检查。
通过以下命令运行脚本:
python3 /path/to/pause_app.py
并检查一切是否按预期进行。
如果一切正常,请添加到启动应用程序:Dash > 启动应用程序 > 添加。然后添加命令:
python3 /path/to/pause_app.py
笔记
该脚本可以轻松编辑以针对多个应用程序,但首先请看看这是否是您所需要的。
或者
如果你希望静音一般来说一旦目标窗口不在前面,则将命令替换为暂停应用程序通过命令静音(/取消静音).脚本就变成:
#!/usr/bin/env python3
import subprocess
import time
# ---set the proc to pause when not the active window
wclass = "rhythmbox"
# ---
def get(cmd):
# just a helper function to not repeat verbose subprocess sections
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
while True:
# the longer period: application is not running (saving fuel)
time.sleep(5)
front1 = ""
while True:
# if the application runs, switch to a shorter response time
time.sleep(1)
# get the possible pid, get() returns "None" if not running,
# script then switches back to 5 sec check
pid = get(["pgrep", wclass])
if pid:
front2 = wclass in get([
"xprop", "-id", get(["xdotool", "getactivewindow"])
])
# run either kill -stop or kill -cont only if there is
# a change in the situation
if front2 != front1:
if front2 == True:
cm = ["amixer", "-q", "-D", "pulse", "sset", "Master", "on"]
print("sound") # just a test indicator, remove afterwards
else:
cm = ["amixer", "-q", "-D", "pulse", "sset", "Master", "off"]
print("no sound") # just a test indicator, remove afterwards
subprocess.Popen(cm)
front1 = front2
else:
break
用法与第一个脚本完全相同。
答案2
下面的脚本依赖于 Ubuntu 的所有原生工具,pactl
并qdbus
确定活动应用程序,并在应用程序获得用户关注时自动静音和取消静音。
应用程序名称设置在APP_ICON_NAME
变量中。您可以使用它pactl list sink-inputs | grep icon_name
来确定需要设置的值。就我而言,我使用 进行了测试chromium-browser
。
该脚本将在样式上进行细微改进,也许还会添加其他功能,但截至目前,它的可用性为 90%,并且能够正确执行其任务。它最终将发布到 github
#!/bin/bash
list_sinks()
{
pactl list sink-inputs | awk '/Sink Input #/{ sub(/#/," "); printf $3" "} /application.icon_name/{ printf $0"\n" }'
}
get_active_app_icon_name()
{
qdbus org.ayatana.bamf /org/ayatana/bamf/matcher org.ayatana.bamf.matcher.ActiveApplication \
| xargs -I {} qdbus org.ayatana.bamf {} org.ayatana.bamf.view.Icon
}
get_sinks_for_app()
{
list_sinks | while read line ; do
if grep -q "$APP_ICON_NAME" <<< "$line"
then
awk '{printf $1" "}' <<< "$line"
fi
done
}
mute_sinks()
{
for sink_id in $( get_sinks_for_app ) ; do
pactl set-sink-input-mute "$sink_id" 1
done
}
unmute_sinks()
{
for sink_id in $( get_sinks_for_app ) ; do
pactl set-sink-input-mute "$sink_id" 0
done
}
main()
{
local APP_ICON_NAME="chromium-browser"
while true
do
if [ "$( get_active_app_icon_name )" != "$APP_ICON_NAME" ] ;
then
mute_sinks
else
unmute_sinks
fi
sleep 0.25
done
}
main
答案3
如果游戏使用 ubuntu 的正常声音系统,又名脉冲音频,那么您进入:
系统设置->声音->应用程序
您应该在那里看到您的歌曲播放应用程序,您可以更改音量甚至将其静音。