Namun Script Sink Switcher Lain
diuji pada Ubuntu 16.04
Tetapi yang ini memungkinkan Anda untuk hanya beralih audio dari aplikasi yang Anda inginkan.
PENGGUNAAN: Fokuskan aplikasi yang Anda ingin ubah wastafelnya dan jalankan skrip ini. Itu dia!!!
Script ini mendeteksi aplikasi yang sedang dalam fokus, menemukan semua audio yang diputar darinya, dan mengalihkannya ke bak cuci berikutnya yang tersedia.
https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3
Menjelaskan naskahnya
Kita perlu menemukan PID aplikasi pada fokus
Tetapi pertama-tama kita membutuhkan xid
xprop -root _NET_ACTIVE_WINDOW
Kemudian masukkan di sini $xid
untuk mendapatkan pid aplikasi
xprop -id $xid _NET_WM_PID
Sekarang kita perlu menemukan input wastafel terkait dengan PID itu
Pertama mari kita linearkan output dari perintah pacmd list-sink-inputs
untuk daftar satu input-tenggelam per baris, menunjukkan indeksnya, tenggelam dan pid pada baris yang sama
pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2
mari kita analisa langkah demi langkah:
grep -E 'index:|sink:|process.id
hanya pertahankan baris yang berisi index:
, sink:
atauprocess.id
tr '\n' ' '
bergabung dengan semua lini
tr -d '"'
menghapus semua "
karakter. Diperlukan untuk mendapatkan pid tanpa tanda kutip
sed -e 's/index:/\n/g'
mengganti semua index:
kemunculan dengan karakter baris baru\n
tail -n +2
menghapus baris pertama karena kosong
Dan hasilnya adalah seperti ini:
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
Mari kita menganalisis satu baris untuk memahami apa artinya:
# 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
182
adalah indeks input-sink, 0
adalah indeks sink, dan 13752
pada akhirnya, adalah pid dari aplikasi yang dimiliki
Kemudian kita beralih melalui setiap baris
... | while IFS= read -r line || [ -n "$line" ]; do
sink_input_pid=$(echo $line | awk '{print $NF}')
Dan akhirnya hanya filter pid-input wastafel yang cocok dengan pid aplikasi yang difokuskan
if [ $sink_input_pid = $app_pid ]; then
Mengekstrak data
Dengan awk
kita bisa mendapatkan elemen yang kita butuhkan
sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')
Dapatkan jumlah sink, untuk mengetahui kapan rotasi sink harus dimulai lagi dari 0.
sink_list_size=${#sink_list_array[@]}
Menemukan bak cuci berikutnya, kita harus beralih melalui daftar bak cuci, untuk mengetahui mana yang cocok dengan current_sink_index dan untuk mengetahui indeks bak cuci berikutnya.
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
Dan akhirnya, kami memindahkan input wastafel untuk diputar di next_sink_index
pacmd move-sink-input $sink_input_index $next_sink_index
Catatan di Ubuntu 16.04:
Saat mengonfigurasi tombol pintasan, saya tidak bisa membuatnya berfungsi dengan pengelola pintasan ubuntu. Jadi saya harus menginstal compizconfig-settings-manager
sudo apt-get install compizconfig-settings-manager