Tujuan saya adalah untuk dapat menonaktifkan aplikasi Spotify, bukan keseluruhan sistem. Menggunakan perintah: ps -C spotify -o pid=
Saya dapat menemukan ID proses Spotify, dalam hal ini ID tersebut "22981"
. Dengan proses yang ID saya ingin mencari dari daftar ini: pacmd list-sink-inputs
. Perintah itu mengembalikan daftar seperti ini:
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"
Sekarang saya ingin mengkorelasikan application.process.id = "22981"
ke indeks input wastafel yang dalam hal ini adalah index: 0
. Sekarang dengan nomor indeks itu maka saya perlu menjalankan perintah ini: pacmd set-sink-input-mute 0 1
untuk menonaktifkan Spotify dan pacmd set-sink-input-mute 0 0
unmute Spotify. Untuk perintah-perintah itu, nomor pertama harus diganti dengan nomor indeks yang ditemukan sebelumnya, dan nomor berikutnya adalah boolean untuk menghidupkan atau mematikan bisu. Bagaimana saya bisa memasukkan ini seluruhnya ke dalam skrip, sehingga saya bisa mendapatkan perintah untuk menonaktifkan / mengaktifkan suara aplikasi Spotify?
EDIT:
Kedua skrip di bawah berfungsi seperti yang diharapkan, dapatkah seseorang menambahkan toggle yang akan memeriksa muted: yes
atau muted: no
dan kemudian membisukan atau mengaktifkan suara yang sesuai?
EDIT: Saya dapat memodifikasi skrip glenn jackman untuk menambahkan toggle:
#!/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 "$@"
sumber
pactl list sink-inputs
? maka itu akan berfungsi melalui jaringan.Jawaban:
Inilah pendapat saya tentang tantangan menarik Anda:
sumber
get_status
fungsi Anda hanya akan menemukan garis "tidak bersuara" tanpa memeriksa silang bahwa status itu milik aplikasi yang sesuai. Baca kembaliget_index
fungsi saya untuk detailnya.awk -v var=val
. Awk loop atas garis, 1 demi 1, mencoba untuk mencocokkan$1 == ...
pernyataan mana pun, mengeksekusi kode dalam tanda kurung pada pertandingan, dan melanjutkan. Pernyataan pertama cocok dengan baris yang memiliki kata pertamaindex:
, dan menyimpan kata kedua (SINK INDEX) dalamidx
variabel. Jadiidx
ditimpa olehindex: <SINK INDEX>
baris berikutnya sampai awk cocok dengan pernyataan kedua ($1
=application.process.id
,$2
==
,$3
=<expected pid val>
). Ketika pernyataan kedua ini cocok, awk mencetakidx
(yang merupakan baris terakhir yang cocok dengan pernyataan pertamaindex:
) dan keluar.terima kasih untuk solusinya! Saya berhasil menggunakan skrip yang disediakan di sini untuk memperbaiki masalah saya. Karena saya harus sedikit memodifikasinya, di sini saya bergabung dengan versi yang ditingkatkan.
Alasan skrip asli tidak berfungsi untuk saya adalah karena beberapa aplikasi dapat memiliki beberapa contoh, yaitu beberapa PID, tetapi mungkin hanya satu dari mereka yang menghasilkan suara, dan dengan demikian sebenarnya terhubung ke Pulseaudio. Karena skrip hanya menggunakan PID pertama yang ditemukan, biasanya akan / tidak / membisukan aplikasi yang diinginkan.
Jadi di sini adalah versi di mana argumennya adalah nama aplikasi yang terdaftar di PulseAudio. Anda dapat menemukan nama ini dengan menjalankan
pacmd list-sink-inputs
perintah dan mencariapplication.name
bidang.Solusi alternatif adalah dengan menonaktifkan / mengaktifkan semua PID yang memiliki nama aplikasi yang sama.
sumber
Meskipun pertanyaannya adalah meminta naskah, saya ingin meninggalkan ini di sini.
Saya telah menulis aplikasi C yang melakukan ini di Ubuntu. Bahkan lebih baik, ia duduk di baki indikator (menggunakan
libappindicator
) dan memeriksa apa yang diputar Spotify, dalam interval pendek. Jika memutar iklan (mengecek daftar hitam), itu membisukan Spotify. Jika iklan baru sedang diputar, Anda cukup klik Bungkam pada menu indikator dan itu menambahkannya ke daftar hitam.Apa yang dilakukannya adalah mencari jendela X, yang akan
XFetchName
dikembalikanSpotify - Linux Preview
. Kemudian panggilanXGetWindowProperty
untuk menanyakan_NET_WM_ICON_NAME
properti dari jendela itu, yang mengembalikan string dalam"Spotify – <Artist> – <Song>"
format. Saat memutar iklan, iklan itu mengembalikan sesuatu seperti ini:Itu memelihara Pohon Pencarian Ternary dari daftar iklan, untuk secara efisien memeriksa apakah judul saat ini ada dalam daftar.
Itu juga menggunakan PulseAudio Asynchronous API untuk meminta
sink-inputs
danset-mute
:Karena ini hanya kode C yang sederhana, ia ringan. Lihat kode sumber dan
.deb
paket Ubuntu di: indicator-muteads . Itu mungkin akan mengalahkan skrip shell dengan 2-3 kali lipat.sumber
Pertama-tama, cara "lebih benar" untuk menemukan PID aplikasi seperti spotify, adalah dengan menggunakan:
Saya telah membangun sebuah skrip yang melakukan pekerjaan itu, saya tidak tahu apakah itu cara terbaik untuk melakukannya, tetapi ia bekerja dengan sempurna:
Anda dapat bekerja dengan adalah sebagai:
atau
Diuji dengan Audacious dan Vlc berjalan dan mematikan / membunyikan hanya satu dari mereka.
sumber
Saya benar-benar tidak bisa skrip, tetapi saya telah memodifikasi skrip hakermania untuk membuat skrip lain.
Yang ini akan menambah atau mengurangi volume aplikasi spesifik dengan kenaikan 5%:
sunting: sebenarnya, ini berfungsi selalu mengubah aplikasi yang terakhir dibuka. Ide ide?
sumber
Skrip yang diedit untuk membisukan semua input aplikasi (beberapa proses) dan default untuk beralih:
sumber