当没有聚焦时,如何自动将应用程序静音?

当没有聚焦时,如何自动将应用程序静音?

当我在玩《中世纪战争》等骑士游戏并切换到 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 的所有原生工具,pactlqdbus确定活动应用程序,并在应用程序获得用户关注时自动静音和取消静音。

应用程序名称设置在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 的正常声音系统,又名脉冲音频,那么您进入:

系统设置->声音->应用程序

您应该在那里看到您的歌曲播放应用程序,您可以更改音量甚至将其静音。

相关内容