Mục tiêu của tôi là có thể tắt tiếng ứng dụng Spotify chứ không phải toàn bộ hệ thống. Sử dụng lệnh: ps -C spotify -o pid=
Tôi có thể tìm ID tiến trình của Spotify, trong trường hợp này là ID "22981"
. Với ID tiến trình đó, tôi muốn tìm kiếm từ danh sách này : pacmd list-sink-inputs
. Lệnh đó trả về một danh sách như thế này:
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"
Bây giờ tôi muốn tương quan application.process.id = "22981"
với chỉ số đầu vào chìm trong trường hợp này là index: 0
. Bây giờ với số chỉ mục đó, sau đó tôi sẽ cần chạy lệnh này: pacmd set-sink-input-mute 0 1
tắt tiếng Spotify và pacmd set-sink-input-mute 0 0
tắt tiếng Spotify. Đối với các lệnh đó, số đầu tiên sẽ cần được thay thế bằng số chỉ mục được tìm thấy trước đó và số tiếp theo là boolean để bật hoặc tắt tiếng. Làm cách nào tôi có thể đặt hoàn toàn điều này vào một tập lệnh, để tôi có thể nhận lệnh tắt tiếng / bật tiếng ứng dụng Spotify?
EDIT:
Cả hai tập lệnh bên dưới đều hoạt động như mong đợi, ai đó có thể thêm một nút chuyển đổi sẽ kiểm tra muted: yes
hoặc muted: no
sau đó tắt tiếng hoặc bật tiếng cho phù hợp không?
EDIT: Tôi đã có thể sửa đổi tập lệnh của glenn jackman để thêm chuyển đổi:
#!/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 "$@"
pactl list sink-inputs
? sau đó nó sẽ hoạt động qua mạng.