Еще один сценарий переключения Sink
протестировано на Ubuntu 16.04
Но этот позволяет переключать только звук приложения, которое вы хотите.
ИСПОЛЬЗОВАНИЕ: Фокус приложения, которое вы хотите изменить его приемник и запустить этот скрипт. Это оно!!!
Этот сценарий обнаруживает приложение, находящееся в фокусе, находит все воспроизводимые с него аудиофайлы и переключает их на следующий доступный приемник.
https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3
Объясняя сценарий
Нам нужно найти PID приложения в фокусе
Но сначала нам нужен XID
xprop -root _NET_ACTIVE_WINDOW
Затем вставьте его сюда, $xid
чтобы получить pid приложения
xprop -id $xid _NET_WM_PID
Теперь нам нужно найти входные данные, связанные с этим PID.
Сначала давайте линеаризуем вывод команды, pacmd list-sink-inputs
чтобы перечислить один вход-приемник в каждой строке, показывая ее индекс, приемник и pid в одной строке.
pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2
давайте проанализируем это шаг за шагом:
grep -E 'index:|sink:|process.id
только сохранить строки , которые содержат index:
, sink:
илиprocess.id
tr '\n' ' '
объединяет все линии
tr -d '"'
удаляет все "
символы Нужно получить пид без кавычек
sed -e 's/index:/\n/g'
заменяет все index:
вхождения символом новой строки\n
tail -n +2
удаляет первую строку, потому что она пуста
И результат примерно такой:
180 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
Давайте разберем одну строку, чтобы понять, что это значит:
# 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
182
является индексом входного потока, 0
является индексом приемника, и 13752
в конце, является pid принадлежащего приложения
Затем мы перебираем каждую строку
... | while IFS= read -r line || [ -n "$line" ]; do
sink_input_pid=$(echo $line | awk '{print $NF}')
И, наконец, отфильтруйте только тот pid входного сигнала, который соответствует pid целевого приложения.
if [ $sink_input_pid = $app_pid ]; then
Извлечение данных
С помощью awk
мы можем получить необходимые нам элементы
sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')
Получить число приемников, чтобы узнать, когда вращение приемников должно возобновиться с 0.
sink_list_size=${#sink_list_array[@]}
Чтобы найти следующий приемник, нам нужно перебрать список приемников, чтобы узнать, какой из них соответствует current_sink_index и узнать индекс следующего приемника.
i=0
for sink in "${sink_list_array[@]}"; do
i=$((($i+1)%sink_list_size)) # i++ mod(#sinks)
if [ $sink = $current_sink_index ]; then
next_sink_index=${sink_list_array[i]}
break
fi
done
И наконец, мы перемещаем вход-приемник для воспроизведения в next_sink_index
pacmd move-sink-input $sink_input_index $next_sink_index
Примечание по Ubuntu 16.04:
При настройке сочетания клавиш я не мог заставить его работать с менеджером ярлыков в Ubuntu. Поэтому мне пришлось установить compizconfig-settings-manager
sudo apt-get install compizconfig-settings-manager