Audio

檢測媒體播放/暫停事件

  • January 18, 2020

我想在拔下耳機後暫停播放,然後在重新插入後恢復。

我目前的解決方案使用 ACPI 來檢測插拔,如下所示。要播放/暫停播放,我使用xdotool key XF86AudioPlay.

此解決方案在基本情況下執行良好:

  • 音樂正在播放,耳機已插入
  • 耳機已拔下**=>**音樂暫停
  • 重新插入耳機**=>**音樂繼續播放。

但是,如果在拔下耳機時它沒有啟動,我不想恢復播放。

想像一下這個場景:

  • 用耳機啟動電腦,
  • 播放音樂,
  • 暫停音樂,
  • 拔下耳機,
  • 重新插入耳機。

最後一點是問題所在 - 重新插入耳機後播放將恢復,儘管在拔下耳機時它未啟動。

此外,在我的系統上,xdotool key XF86AudioPlay只是切換播放,而xdotool key XF86AudioPause什麼都不做。這讓事情變得更糟:

  • 用耳機啟動電腦,
  • 播放音樂,
  • 暫停音樂,
  • 拔下耳機*(音樂開始播放!)*。

所以我需要檢測播放/暫停/停止事件以及插入/拔出事件,以便能夠在所有可能的情況下正確做出反應。

此狀態機描述了所需的操作: 拔出暫停 FSM


我想到的一個想法是重新綁定播放/暫停/停止的鍵盤快捷鍵以添加狀態機邏輯。這有一個缺點,即播放總是必須使用這些鍵盤快捷鍵來控制,而不是例如。Rhythmbox 按鈕,這有點不切實際。

另外,如果我在播放時關閉 Rhythmbox,狀態機將保持在一個playing狀態。當然,我可以有一個“守護程序”,它會等到 Rhythmbox 關閉,然後將狀態設置為stopped. 但是如果播放音樂的不是 Rhythmbox,如果是 VLC 等呢?這種方法醜陋且不可靠,所以我想避免它。


**我的問題:**如何檢測媒體播放何時暫停/恢復/停止?

一種選擇是檢查 Pulseaudio 流的狀態,例如使用pacmd list-sink-inputs(查看state),或使用您選擇的程式語言直接與 Pulseaudio 惡魔互動。

如果播放器本身暫停,則需要媒體播放器暫停流(state從更改RUNNING為)。CORKED有些媒體播放器可能會這樣做,有些可能不會。

引用自:https://unix.stackexchange.com/questions/394829