Lorsque je joue à des jeux comme la chevalerie Medieval Warfare et que je passe à un autre logiciel comme Firefox ou Desktop, le son du jeu est toujours joué.
Alors, comment puis-je résoudre ce problème?
J'ai testé le script ci-dessous sur Rhythmbox, effectuant le travail sans erreur.
L'exécution du script ci-dessous en arrière-plan met le processus ciblé en pause si sa fenêtre n'est pas visible (moins d'une seconde), le son est coupé s'il est fourni avec l'application.
Chaque fois que la fenêtre revient à l'avant, le processus reprend là où il se trouvait et le son fonctionne à nouveau.
Si le processus/l'application ciblée effectue pas du tout, le script bascule sur une période plus longue (mode) en vérifiant ne seule fois toutes les cinq secondes si l'application ciblée est exécutée ou non. . De cette façon, le script est extrêmement peu chargé s'il n'a pas de travail à accomplir.
#!/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
Le script a besoin de xdotool
pour obtenir des informations sur la fenêtre la plus en avant:
Sudo apt-get install xdotool
pause_app.py
Dans la section head du script, définissez le nom du processus sur pause (remplacez rhythmbox
).
Il s’agit généralement de la même chose que la (première section) du WM_CLASS
, mais dans votre cas, j’ai des doutes sur le fait que cela ne devrait pas être Steam
ou autre chose. Courez pour vous assurer
ps -u <yourname>
faire une supposition éclairée, et ensuite
kill <pid>
(the process id)
vérifier.
Exécutez le script à l'aide de la commande:
python3 /path/to/pause_app.py
et vérifiez si tout fonctionne comme prévu.
Si tout fonctionne correctement, ajoutez à Applications de démarrage: Dash> Applications de démarrage> Ajouter. Puis ajoutez la commande:
python3 /path/to/pause_app.py
Le script peut être facilement modifié pour cibler plusieurs applications, mais veuillez d'abord vérifier si c'est ce dont vous avez besoin.
Si vous préférez couper le son en général une fois que la fenêtre ciblée n'est pas devant, remplacez la commande par mettez l'application en pause par la commande à mute (/ activer le son) son. Le script devient alors:
#!/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
L'utilisation est exactement similaire au premier script.
Le script ci-dessous s'appuie sur tous les outils natifs d'Ubuntu, pactl
et qdbus
pour déterminer l'application active, la mise en sourdine et la réactiver automatiquement au fur et à mesure que l'application gagne et se concentre sur l'utilisateur.
Le nom de l'application est défini dans la variable APP_ICON_NAME
. Vous pouvez utiliser pactl list sink-inputs | grep icon_name
pour déterminer la valeur à définir. Dans mon cas, je l'ai testé avec chromium-browser
.
Le script subira de légères améliorations de style et des fonctionnalités supplémentaires seront peut-être ajoutées, mais pour le moment, il est utilisable à 90% et s'acquitte correctement de sa tâche. Il sera éventuellement posté sur 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
Si le jeu utilise le système de son normal d'ubuntu, a.k.a. Pulse audio, vous entrez dans:
paramètres système -> son -> applications
Vous devriez voir votre application de lecture de chanson là-bas, vous pouvez modifier le volume et même la mettre en sourdine.