Audio
檢測媒體播放/暫停事件
我想在拔下耳機後暫停播放,然後在重新插入後恢復。
我目前的解決方案使用 ACPI 來檢測插拔,如下所示。要播放/暫停播放,我使用
xdotool key XF86AudioPlay
.此解決方案在基本情況下執行良好:
- 音樂正在播放,耳機已插入
- 耳機已拔下**=>**音樂暫停
- 重新插入耳機**=>**音樂繼續播放。
但是,如果在拔下耳機時它沒有啟動,我不想恢復播放。
想像一下這個場景:
- 用耳機啟動電腦,
- 播放音樂,
- 暫停音樂,
- 拔下耳機,
- 重新插入耳機。
最後一點是問題所在 - 重新插入耳機後播放將恢復,儘管在拔下耳機時它未啟動。
此外,在我的系統上,
xdotool key XF86AudioPlay
只是切換播放,而xdotool key XF86AudioPause
什麼都不做。這讓事情變得更糟:
- 用耳機啟動電腦,
- 播放音樂,
- 暫停音樂,
- 拔下耳機*(音樂開始播放!)*。
所以我需要檢測播放/暫停/停止事件以及插入/拔出事件,以便能夠在所有可能的情況下正確做出反應。
我想到的一個想法是重新綁定播放/暫停/停止的鍵盤快捷鍵以添加狀態機邏輯。這有一個缺點,即播放總是必須使用這些鍵盤快捷鍵來控制,而不是例如。Rhythmbox 按鈕,這有點不切實際。
另外,如果我在播放時關閉 Rhythmbox,狀態機將保持在一個
playing
狀態。當然,我可以有一個“守護程序”,它會等到 Rhythmbox 關閉,然後將狀態設置為stopped
. 但是如果播放音樂的不是 Rhythmbox,如果是 VLC 等呢?這種方法醜陋且不可靠,所以我想避免它。**我的問題:**如何檢測媒體播放何時暫停/恢復/停止?
一種選擇是檢查 Pulseaudio 流的狀態,例如使用
pacmd list-sink-inputs
(查看state
),或使用您選擇的程式語言直接與 Pulseaudio 惡魔互動。如果播放器本身暫停,則需要媒體播放器暫停流(
state
從更改RUNNING
為)。CORKED
有些媒體播放器可能會這樣做,有些可能不會。