Mi objetivo es poder silenciar la aplicación Spotify, no todo el sistema. Usando el comando: ps -C spotify -o pid=
Puedo encontrar la ID de proceso de Spotify, en este caso la ID es "22981"
. Con ese proceso de identificación me gustaría buscar de esta lista: pacmd list-sink-inputs
. Ese comando devuelve una lista como esta:
eric@eric-desktop:~$ pacmd list-sink-inputs
Welcome to PulseAudio! Use "help" for usage information.
>>> 1 sink input(s) available.
index: 0
driver: <protocol-native.c>
flags: START_CORKED
state: RUNNING
sink: 1 <alsa_output.pci-0000_00_1b.0.analog-stereo>
volume: 0: 100% 1: 100%
0: -0.00 dB 1: -0.00 dB
balance 0.00
muted: no
current latency: 1019.80 ms
requested latency: 371.52 ms
sample spec: s16le 2ch 44100Hz
channel map: front-left,front-right
Stereo
resample method: (null)
module: 8
client: 10 <Spotify>
properties:
media.role = "music"
media.name = "Spotify"
application.name = "Spotify"
native-protocol.peer = "UNIX socket client"
native-protocol.version = "26"
application.process.id = "22981"
application.process.user = "eric"
application.process.host = "eric-desktop"
application.process.binary = "spotify"
window.x11.display = ":0"
application.language = "en_US.UTF-8"
application.process.machine_id = "058c89ad77c15e1ce0dd5a7800000012"
application.process.session_id = "058c89ad77c15e1ce0dd5a7800000012-1345692739.486413-85297109"
application.icon_name = "spotify-linux-512x512"
module-stream-restore.id = "sink-input-by-media-role:music"
Ahora me gustaría correlacionar el application.process.id = "22981"
índice de entrada al sumidero que en este caso es index: 0
. Ahora, con ese número de índice, necesitaría ejecutar este comando: pacmd set-sink-input-mute 0 1
silenciar Spotify y pacmd set-sink-input-mute 0 0
activar Silenciar Spotify. Para esos comandos, el primer número necesitaría ser reemplazado por el número de índice encontrado anteriormente, y el siguiente número es el booleano para activar o desactivar el silencio. ¿Cómo puedo poner todo esto en un script, para que pueda obtener un comando para silenciar / activar la aplicación de Spotify?
EDITAR:
Ambos scripts a continuación funcionan como se esperaba, ¿alguien puede agregar un conmutador que verifique muted: yes
o muted: no
luego, silenciar o activar el silencio en consecuencia?
EDITAR: pude modificar el script de glenn jackman para agregar la palanca:
#!/bin/bash
main() {
local action=toggle
while getopts :mu option; do
case "$option" in
m) action=mute ;;
u) action=unmute ;;
?) usage 1 "invalid option: -$OPTARG" ;;
esac
done
shift $((OPTIND - 1))
local pid=$(pidof "$1")
if [[ -z "$pid" ]]; then
echo "error: no running processes for: $1" >&2
elif [[ "$1" ]]; then
$action "$1"
else
usage 1 "specify an application name"
fi
}
usage() {
[[ "$2" ]] && echo "error: $2"
echo "Usage: $0 [-m | -u] appname"
echo "Default: toggle mute"
echo "Arguments:"
echo "-m = mute application"
echo "-u = unmute application"
exit $1
}
toggle() {
local status=$(get_status "$1")
if [[ "$status" == "yes" ]]; then
unmute "$1"
elif [[ "$status" == "no" ]]; then
mute "$1"
fi
}
mute() { adjust_muteness "$1" 1; }
unmute() { adjust_muteness "$1" 0; }
adjust_muteness() {
local index=$(get_index "$1")
local status=$(get_status "$1")
[[ "$index" ]] && pacmd set-sink-input-mute "$index" $2 >/dev/null
}
get_index() {
local pid=$(pidof "$1")
pacmd list-sink-inputs |
awk -v pid=$pid '
$1 == "index:" {idx = $2}
$1 == "application.process.id" && $3 == "\"" pid "\"" {print idx; exit}
'
}
get_status() {
local pid=$(pidof "$1")
pacmd list-sink-inputs |
awk -v pid=$pid '
$1 == "muted:" {idx = $2}
$1 == "application.process.id" && $3 == "\"" pid "\"" {print idx; exit}
'
}
main "$@"
fuente
pactl list sink-inputs
? entonces funcionará a través de la red.Respuestas:
Aquí está mi opinión sobre su interesante desafío:
fuente
get_status
función solo encontrará las líneas "silenciadas" sin verificar que el estado pertenece a la aplicación adecuada. Vuelva a leer miget_index
función para los detalles.awk -v var=val
. Awk recorre las líneas, 1 por 1, intenta hacer coincidir cualquiera de las$1 == ...
declaraciones, ejecuta el código entre paréntesis en la coincidencia y continúa. La primera declaración coincide en las líneas cuya primera palabra esindex:
, y almacena la segunda palabra (INDICE SINK) enidx
variable. Por lo tanto,idx
se sobrescribe en la siguienteindex: <SINK INDEX>
línea hasta que awk coincida con la segunda instrucción ($1
=application.process.id
,$2
==
,$3
=<expected pid val>
). Cuando esta segunda declaración coincide, awk imprimeidx
(que es la última línea que coincide con la primera declaraciónindex:
) y sale.gracias por la solucion! Logré usar los scripts provistos aquí para solucionar mi problema. Como tuve que modificarlos un poco, aquí me uno a la versión mejorada.
La razón por la que los scripts originales no funcionaron para mí es porque algunas aplicaciones pueden tener varias instancias, es decir, varios PID, pero tal vez solo una de ellas produce sonido y, por lo tanto, está realmente conectada a Pulseaudio. Dado que el script solo usaba el primer PID encontrado, normalmente / no / silenciaría la aplicación deseada.
Así que aquí hay una versión donde el argumento es el nombre de la aplicación registrada en PulseAudio. Puede encontrar este nombre ejecutando el
pacmd list-sink-inputs
comando y buscando elapplication.name
campo.Una solución alternativa sería activar / desactivar todos los PID que tienen el mismo nombre de aplicación.
fuente
Aunque la pregunta es pedir un guión, quería dejar esto aquí.
He escrito una aplicación C que hace esto en Ubuntu. Aún mejor, se sienta en la bandeja del indicador (usando
libappindicator
) y comprueba lo que está reproduciendo Spotify, en intervalos cortos. Si está reproduciendo un anuncio (se compara con una lista negra), silencia Spotify. Si se está reproduciendo un nuevo anuncio, simplemente haga clic en Silencio en el menú indicador y lo agrega a la lista negra.Lo que hace es buscar una ventana X, para la cual
XFetchName
regresaSpotify - Linux Preview
. Luego llamaXGetWindowProperty
para consultar la_NET_WM_ICON_NAME
propiedad de esa ventana, que devuelve una cadena en el"Spotify – <Artist> – <Song>"
formato. Al reproducir anuncios, devuelve algo como esto:Mantiene un Árbol de búsqueda ternario de la lista de anuncios, para verificar de manera eficiente si el título actual está en la lista.
También utiliza la API asincrónica PulseAudio para consultar
sink-inputs
yset-mute
:Dado que es solo un código C simple, es liviano. Consulte el código fuente y el
.deb
paquete de Ubuntu en: indicator-muteads . Probablemente superaría un script de shell en 2-3 órdenes de magnitud.fuente
En primer lugar, la forma "más correcta" de encontrar el PID de una aplicación como spotify, es usar:
He creado un script que hace el trabajo, no sé si es la mejor manera de hacerlo, pero funciona perfectamente:
Puede trabajar con es como:
o
Probado con Audacious y Vlc ejecutando y silenciando / activando solo uno de ellos.
fuente
Realmente no puedo escribir, pero he modificado el script de hakermania para crear otro.
Este aumentará o disminuirá el volumen de la aplicación específica en incrementos del 5%:
editar: en realidad, está funcionando siempre cambiando la última aplicación abierta. Ideas?
fuente
Script editado para silenciar todas las entradas de una aplicación (procesos múltiples) y valores predeterminados para alternar:
fuente