Meu objetivo é ser capaz de silenciar o aplicativo Spotify, não o sistema inteiro. Usando o comando: ps -C spotify -o pid=
Eu consigo encontrar o ID do processo do Spotify, neste caso o ID é "22981"
. Com esse processo ID gostaria de pesquisar a partir desta lista: pacmd list-sink-inputs
. Esse comando retorna uma 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"
Agora eu gostaria de correlacionar o application.process.id = "22981"
para o índice de entrada do coletor, que neste caso é index: 0
. Agora, com esse número de índice, eu precisaria executar este comando: pacmd set-sink-input-mute 0 1
silenciar o Spotify e pacmd set-sink-input-mute 0 0
silenciar o Spotify. Para esses comandos, o primeiro número precisaria ser substituído pelo número de índice encontrado anteriormente, e o próximo número será o booleano para ativar ou desativar o mudo. Como posso colocar isso em um script, para que eu possa obter um comando para silenciar / ativar o som do aplicativo Spotify?
Edição:
Ambos os scripts abaixo funcionam conforme o esperado, alguém pode adicionar uma alternância que iria verificar muted: yes
ou muted: no
e, em seguida, mudo ou mudo em conformidade?
Edição: Consegui modificar o script de glenn jackman para adicionar a alternância:
#!/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 "$@"
fonte
pactl list sink-inputs
? então funcionará pela rede.Respostas:
Aqui está minha opinião sobre seu desafio interessante:
fonte
get_status
função encontrará apenas as linhas "silenciadas" sem verificar se o status pertence ao aplicativo apropriado. Releia minhaget_index
função para obter detalhes.awk -v var=val
. O awk circula sobre as linhas, 1 por 1, tenta corresponder a qualquer uma das$1 == ...
instruções, executa o código entre colchetes na correspondência e continua. A primeira instrução corresponde às linhas cuja primeira palavra éindex:
e armazena a segunda palavra (SINK INDEX) naidx
variável. Portanto,idx
é substituído pela próximaindex: <SINK INDEX>
linha até que o awk corresponda à segunda instrução ($1
=application.process.id
,$2
==
,$3
=<expected pid val>
). Quando essa segunda instrução corresponde, o awk é impressoidx
(que é a última linha que corresponde à primeiraindex:
) e sai.obrigado pela solução! Consegui usar os scripts fornecidos aqui para corrigir meu problema. Desde que eu tive que modificá-los um pouco, aqui vou me juntar à versão melhorada.
A razão pela qual os scripts originais não funcionaram para mim é porque alguns aplicativos podem ter várias instâncias, ou seja, vários PID, mas talvez apenas um deles esteja produzindo som e, portanto, esteja realmente conectado ao Pulseaudio. Como o script usava apenas o primeiro PID encontrado, normalmente / não / desativava o aplicativo desejado.
Então, aqui está uma versão em que o argumento é o nome do aplicativo, conforme registrado no PulseAudio. Você pode encontrar esse nome executando o
pacmd list-sink-inputs
comando e procure oapplication.name
campo.Uma solução alternativa seria ativar / desativar o som de todos os PIDs com o mesmo nome de aplicativo.
fonte
Mesmo que a pergunta esteja pedindo um script, eu queria deixar isso aqui.
Eu escrevi um aplicativo C que faz isso no Ubuntu. Melhor ainda, ele fica na bandeja do indicador (usando
libappindicator
) e verifica o que o Spotify está tocando, em intervalos curtos. Se estiver reproduzindo um anúncio (verifica uma lista negra), o Silenciar é desativado. Se um novo anúncio estiver sendo reproduzido, basta clicar em Mudo no menu do indicador e ele será adicionado à lista negra.O que ele faz é procurar uma janela X, para a qual
XFetchName
retornaSpotify - Linux Preview
. Em seguida, chamaXGetWindowProperty
para consultar a_NET_WM_ICON_NAME
propriedade dessa janela, que retorna uma string no"Spotify – <Artist> – <Song>"
formato. Ao reproduzir anúncios, ele retorna algo como isto:Ele mantém uma Árvore de Pesquisa Ternária da lista de anúncios, para verificar com eficiência se o título atual está na lista.
Ele também usa a API assíncrona PulseAudio para consultar
sink-inputs
eset-mute
:Como é apenas um código C simples, é leve. Confira o código fonte e o
.deb
pacote Ubuntu em: indicator-muteads . Provavelmente venceria um script de shell em 2-3 ordens de magnitude.fonte
Primeiro, a maneira "mais correta" de encontrar o PID de um aplicativo, como o spotify, é usar:
Criei um script que faz o trabalho, não sei se é a melhor maneira de fazê-lo, mas funciona perfeitamente:
Você pode trabalhar com é como:
ou
Testado com o Audacious e o Vlc executando e desativando / desativando apenas um deles.
fonte
Realmente não sei escrever, mas modifiquei o script do hakermania para criar outro.
Este aumentará ou diminuirá o volume do aplicativo específico em incrementos de 5%:
editar: na verdade, ele está funcionando para alterar sempre o último aplicativo aberto. Ideias?
fonte
Script editado para silenciar todas as entradas de um aplicativo (vários processos) e o padrão é alternar:
fonte