Моя цель - отключить приложение Spotify, а не всю систему. С помощью команды: ps -C spotify -o pid=
я могу найти идентификатор процесса Spotify, в этом случае идентификатор "22981"
. С этим процессом ID Я хотел бы найти из этого списка: pacmd list-sink-inputs
. Эта команда возвращает список вроде этого:
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"
Теперь я хотел бы сопоставить application.process.id = "22981"
входной индекс приемника, который в данном случае является index: 0
. Теперь с этим индексом мне нужно было бы выполнить эту команду: pacmd set-sink-input-mute 0 1
отключить звук Spotify и pacmd set-sink-input-mute 0 0
включить звук Spotify. Для этих команд первое число должно быть заменено найденным ранее индексом, а следующее число является логическим значением для включения или выключения отключения звука. Как я могу поместить это все в сценарий, чтобы я мог получить команду для отключения / включения звука приложения Spotify?
РЕДАКТИРОВАТЬ:
Оба приведенных ниже сценария работают должным образом, может кто-нибудь добавить переключатель, который будет проверять muted: yes
или muted: no
затем включить или выключить звук соответственно?
РЕДАКТИРОВАТЬ: я был в состоянии изменить сценарий Гленна Джекмана, чтобы добавить переключатель:
#!/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
? тогда он будет работать по сети.Ответы:
Вот мой взгляд на ваш интересный вызов:
источник
get_status
функция найдет только «приглушенные» строки без перекрестной проверки того, что статус принадлежит соответствующему приложению. Перечитайте моюget_index
функцию для деталей.awk -v var=val
. Awk зацикливается на строках 1 на 1, пытается найти соответствие любому из$1 == ...
операторов, выполняет код в скобках при сопоставлении и продолжает работу. Первый оператор совпадает со строками, чье первое словоindex:
, и сохраняет второе слово (SINK INDEX) вidx
переменной. Поэтомуidx
перезаписывается следующейindex: <SINK INDEX>
строкой, пока awk не совпадет со вторым оператором ($1
=application.process.id
,$2
==
,$3
=<expected pid val>
). Когда этот 2-й оператор совпадает, awk печатаетidx
(это последняя строка, соответствующая первому операторуindex:
) и завершается.спасибо за решение! Мне удалось использовать предоставленные здесь сценарии, чтобы исправить мою проблему. Поскольку мне пришлось немного их изменить, я присоединяюсь к улучшенной версии.
Причина, по которой оригинальные сценарии не работали для меня, заключается в том, что некоторые приложения могут иметь несколько экземпляров, то есть несколько PID, но, возможно, только один из них производит звук и, таким образом, фактически подключен к Pulseaudio. Поскольку скрипт использует только первый найденный PID, он обычно / не / отключает желаемое приложение.
Итак, вот версия, в которой аргумент - это имя приложения, зарегистрированное в PulseAudio. Вы можете найти это имя, запустив
pacmd list-sink-inputs
команду и ищаapplication.name
поле.Альтернативным решением было бы отключить / включить звук всех PID с одинаковым именем приложения.
источник
Хотя вопрос касается сценария, я хотел оставить это здесь.
Я написал приложение на C, которое делает это в Ubuntu. Более того, он сидит на панели индикаторов (используя
libappindicator
) и проверяет, что играет Spotify, через короткие промежутки времени. Если он воспроизводит рекламу (проверяет чёрный список), он отключает Spotify. Если воспроизводится новое объявление, вы просто нажимаете кнопку «Без звука» в меню индикатора, и оно добавляется в черный список.Что он делает, так это ищет окно X, для которого
XFetchName
возвращаетсяSpotify - Linux Preview
. Затем он вызываетXGetWindowProperty
запрос_NET_WM_ICON_NAME
свойства этого окна, которое возвращает строку в"Spotify – <Artist> – <Song>"
формате. При воспроизведении рекламы она возвращает что-то вроде этого:Он поддерживает троичное дерево поиска в списке объявлений, чтобы эффективно проверить, есть ли текущий заголовок в списке.
Он также использует PulseAudio Asynchronous API для запроса
sink-inputs
иset-mute
:Так как это просто C-код, он легкий. Проверьте исходный код и
.deb
пакет Ubuntu по адресу: Indicator-Muteads . Вероятно, он побьет сценарий оболочки на 2-3 порядка.источник
Прежде всего, «более правильный» способ найти PID приложения, такой как spotify, заключается в использовании:
Я создал скрипт, который выполняет эту работу, я не знаю, является ли это лучшим способом сделать это, но он работает отлично:
Вы можете работать как:
или
Протестировано с работающими Audacious и Vlc и отключением / включением только одного из них.
источник
Я действительно не могу писать сценарии, но я изменил сценарий Хакермании, чтобы создать другой.
Этот будет увеличивать или уменьшать объем конкретного приложения с шагом 5%:
редактировать: на самом деле, он работает всегда меняя последнее открытое приложение. Идеи?
источник
Отредактированный скрипт для отключения всех входов приложения (несколько процессов) и по умолчанию переключение:
источник