Ще один сценарій вимивання раковини
протестовано на 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
в кінці, є підозрою програми, що належить
Потім ми повторюємо кожен рядок
... | 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