อีกหนึ่งสคริปต์ Sinker Switcher
ทดสอบบน Ubuntu 16.04
แต่อันนี้ให้คุณสลับเฉพาะเสียงของแอพพลิเคชั่นที่คุณต้องการ
การใช้:โฟกัสแอปพลิเคชันที่คุณต้องการเปลี่ยน sink และรันสคริปต์นี้ แค่นั้นแหละ!!!
สคริปต์นี้ตรวจพบแอปพลิเคชันที่อยู่ในโฟกัสค้นหาไฟล์เสียงทั้งหมดที่เล่นจากมันและเปลี่ยนเป็นแอปที่มีอยู่ถัดไป
https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3
อธิบายสคริปต์
เราจำเป็นต้องค้นหา PID ของแอปพลิเคชันที่โฟกัส
แต่ก่อนอื่นเราต้องการ xid
xprop -root _NET_ACTIVE_WINDOW
จากนั้นใส่ที่นี่$xid
เพื่อรับ pid ของแอปพลิเคชัน
xprop -id $xid _NET_WM_PID
ตอนนี้เราต้องการค้นหา sink-inputs ที่เกี่ยวข้องกับ PID นั้น
ก่อนอื่นเรามาทำให้เป็นเชิงเส้นเอาต์พุตของคำสั่ง pacmd list-sink-inputs
เพื่อแสดง sink-input หนึ่งรายการต่อบรรทัดโดยแสดงดัชนี sink และ 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 '"'
ลบ"
ตัวละครทั้งหมด จำเป็นต้องรับ pid โดยไม่มีเครื่องหมายอัญประกาศ
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
คือดัชนี sink-input 0
เป็นดัชนี sink และ13752
ท้ายที่สุดคือ pid ของแอ็พพลิเคชันที่เป็นของ
จากนั้นเราวนซ้ำแต่ละบรรทัด
... | while IFS= read -r line || [ -n "$line" ]; do
sink_input_pid=$(echo $line | awk '{print $NF}')
และสุดท้ายกรองเฉพาะ pid ของ sink-input ที่ตรงกับ 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}')
รับจำนวน sinks เพื่อทราบเมื่อการหมุน sinks ควรเริ่มต้นใหม่จาก 0
sink_list_size=${#sink_list_array[@]}
การค้นหา sink ถัดไปเราต้องทำซ้ำผ่านรายการ sink เพื่อรู้ว่าอันไหนที่ตรงกับcurrent_sink_indexและเพื่อทราบดัชนีของ sink ถัดไป
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
และสุดท้ายเราย้าย sink-input เพื่อเล่นใน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