Một kịch bản chuyển đổi chìm khác
đã thử nghiệm trên Ubuntu 16.04
Nhưng cái này cho phép bạn chỉ chuyển đổi âm thanh của ứng dụng bạn muốn.
SỬ DỤNG: Tập trung vào ứng dụng bạn muốn thay đổi phần chìm và chạy tập lệnh này. Đó là nó!!!
Kịch bản lệnh này phát hiện ứng dụng đang tập trung, tìm tất cả âm thanh phát từ ứng dụng đó và chuyển chúng sang bồn rửa có sẵn tiếp theo.
https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3
Giải thích kịch bản
Chúng ta cần tìm ra PID của ứng dụng.
Nhưng trước tiên chúng ta cần xid
xprop -root _NET_ACTIVE_WINDOW
Sau đó chèn nó vào đây $xid
để lấy pid của ứng dụng
xprop -id $xid _NET_WM_PID
Bây giờ chúng ta cần tìm các đầu vào chìm liên quan đến PID đó
Trước tiên, hãy tuyến tính hóa đầu ra của lệnh pacmd list-sink-inputs
để liệt kê một đầu vào chìm trên mỗi dòng, hiển thị chỉ mục của nó, chìm và pid trên cùng một dòng
pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2
hãy phân tích từng bước một:
grep -E 'index:|sink:|process.id
chỉ giữ các dòng có chứa index:
, sink:
hoặcprocess.id
tr '\n' ' '
tham gia tất cả các dòng
tr -d '"'
loại bỏ tất cả các "
ký tự. Cần thiết để có được pid mà không có dấu ngoặc kép
sed -e 's/index:/\n/g'
thay thế tất cả các index:
lần xuất hiện bằng một ký tự dòng mới\n
tail -n +2
xóa dòng đầu tiên vì nó trống
Và kết quả là như thế này:
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
Hãy phân tích một dòng để hiểu ý nghĩa của nó:
# 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752
182
là chỉ số đầu vào chìm, 0
là chỉ số chìm và 13752
ở cuối, là giá trị của ứng dụng thuộc
Sau đó, chúng tôi lặp lại qua từng dòng
... | while IFS= read -r line || [ -n "$line" ]; do
sink_input_pid=$(echo $line | awk '{print $NF}')
Và cuối cùng chỉ lọc pid của đầu vào chìm phù hợp với pid của ứng dụng tập trung
if [ $sink_input_pid = $app_pid ]; then
Trích xuất dữ liệu
Với awk
chúng tôi có thể có được các yếu tố chúng tôi cần
sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')
Lấy số lượng bồn, để biết khi nào vòng quay của bồn sẽ khởi động lại từ 0.
sink_list_size=${#sink_list_array[@]}
Tìm bồn rửa tiếp theo, chúng ta phải lặp qua danh sách các bồn, để biết cái nào khớp với current_sink_index và để biết chỉ số của bồn tiếp theo.
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
Và cuối cùng, chúng tôi di chuyển đầu vào chìm để chơi trong next_sink_index
pacmd move-sink-input $sink_input_index $next_sink_index
Lưu ý trên Ubuntu 16.04:
Khi định cấu hình phím tắt, tôi không thể làm cho nó hoạt động với trình quản lý phím tắt của ubfox. Vì vậy, tôi đã phải cài đặt compizconfig-settings-manager
sudo apt-get install compizconfig-settings-manager