Moim celem jest możliwość wyciszenia aplikacji Spotify, a nie całego systemu. Za pomocą polecenia: ps -C spotify -o pid=
jestem w stanie znaleźć identyfikator procesu Spotify, w tym przypadku jest to identyfikator "22981"
. Z tego procesu ID chciałbym szukać z tej listy: pacmd list-sink-inputs
. To polecenie zwraca następującą listę:
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"
Teraz chciałbym skorelować application.process.id = "22981"
wskaźnik wejściowy zlewu, który w tym przypadku jest index: 0
. Teraz z tym numerem indeksu musiałbym uruchomić polecenie: pacmd set-sink-input-mute 0 1
wyciszyć Spotify i pacmd set-sink-input-mute 0 0
wyłączyć wyciszenie Spotify. W przypadku tych poleceń pierwszy numer musiałby zostać zastąpiony numerem indeksu znalezionym wcześniej, a następny numer to wartość logiczna umożliwiająca włączenie lub wyłączenie wyciszenia. Jak mogę umieścić to wszystko w skrypcie, aby uzyskać polecenie wyciszenia / anulowania wyciszenia aplikacji Spotify?
EDIT:
Oba skrypty poniżej działa zgodnie z oczekiwaniami, może ktoś dodać przełącznik, który będzie sprawdzić muted: yes
czy muted: no
a następnie wyłączyć lub włączyć odpowiednio?
EDYCJA: Byłem w stanie zmodyfikować skrypt glenn jackman, aby dodać przełącznik:
#!/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 "$@"
źródło
pactl list sink-inputs
? wtedy będzie działać przez sieć.Odpowiedzi:
Oto moje spojrzenie na twoje interesujące wyzwanie:
źródło
get_status
funkcja znajdzie tylko „wyciszone” linie bez sprawdzania, czy status należy do odpowiedniej aplikacji. Przeczytaj ponownie mojąget_index
funkcję, aby poznać szczegóły.awk -v var=val
. Awk zapętla linie 1 na 1, próbuje dopasować dowolną z$1 == ...
instrukcji, wykonuje kod w nawiasach przy dopasowaniu i kontynuuje. Pierwsza instrukcja pasuje do wierszy, których pierwszym słowem jestindex:
, i zapisuje drugie słowo (SINK INDEX) widx
zmiennej.idx
Zostaje więc nadpisany przez następnyindex: <SINK INDEX>
wiersz, dopóki awk nie dopasuje drugiej instrukcji ($1
=application.process.id
,$2
==
,$3
=<expected pid val>
). Kiedy ta druga instrukcja się zgadza, awk drukujeidx
(która jest ostatnia linia, która pasowała do pierwszej instrukcjiindex:
) i kończy działanie.dzięki za rozwiązanie! Udało mi się użyć dostarczonych tu skryptów do rozwiązania mojego problemu. Ponieważ musiałem je nieco zmodyfikować, dołączam do ulepszonej wersji.
Powodem, dla którego oryginalne skrypty nie działały dla mnie, jest to, że niektóre aplikacje mogą mieć kilka instancji, np. Kilka PID, ale może tylko jeden z nich wytwarza dźwięk, a zatem jest faktycznie podłączony do Pulseaudio. Ponieważ skrypt używał tylko pierwszego znalezionego PID, zazwyczaj / nie / wyciszyłby żądaną aplikację.
Oto wersja, w której argumentem jest nazwa aplikacji zarejestrowana w PulseAudio. Możesz znaleźć tę nazwę, uruchamiając
pacmd list-sink-inputs
polecenie i poszukajapplication.name
pola.Alternatywnym rozwiązaniem byłoby wyciszenie / wyłączenie wszystkich PID o tej samej nazwie aplikacji.
źródło
Chociaż pytanie dotyczy skryptu, chciałem to tutaj zostawić.
Napisałem aplikację C, która robi to na Ubuntu. Co więcej, leży na tacy wskaźnika (za pomocą
libappindicator
) i sprawdza, co gra Spotify, w krótkich odstępach czasu. Jeśli wyświetla reklamę (porównuje z czarną listą), wycisza Spotify. Jeśli odtwarzana jest nowa reklama, wystarczy kliknąć opcję Wycisz w menu wskaźnika i dodaje ją do czarnej listy.To, co robi, to szuka okna X, do którego
XFetchName
zwracaSpotify - Linux Preview
. Następnie wywołujeXGetWindowProperty
zapytanie o_NET_WM_ICON_NAME
właściwość tego okna, które zwraca ciąg znaków w"Spotify – <Artist> – <Song>"
formacie. Podczas odtwarzania reklam zwraca coś takiego:Utrzymuje drzewo wyszukiwania trójskładnikowego z listy reklam, aby skutecznie sprawdzić, czy aktualny tytuł znajduje się na liście.
Używa również asynchronicznego interfejsu API PulseAudio do zapytania
sink-inputs
iset-mute
:Ponieważ jest to po prostu prosty kod C, jest lekki. Sprawdź kod źródłowy i
.deb
pakiet Ubuntu na: Indicator-Muteads . Prawdopodobnie pobiłby skrypt powłoki o 2-3 rzędy wielkości.źródło
Przede wszystkim „bardziej poprawnym” sposobem znalezienia PID aplikacji, takiego jak spotify, jest użycie:
Stworzyłem skrypt, który wykonuje tę pracę, nie wiem, czy jest to najlepszy sposób, ale działa idealnie:
Możesz pracować z:
lub
Testowany z działającymi Audacious i Vlc i wyciszaniem / wyciszaniem tylko jednego z nich.
źródło
Naprawdę nie mogę napisać skryptu, ale zmodyfikowałem skrypt hakermanii, aby utworzyć inny.
Ten zwiększy lub zmniejszy objętość określonej aplikacji w krokach co 5%:
edycja: w rzeczywistości działa zawsze zmieniając ostatnio otwieraną aplikację. Pomysły?
źródło
Edytowany skrypt, aby wyciszyć wszystkie dane wejściowe aplikacji (wiele procesów) i domyślnie przełączać:
źródło