检测媒体播放/暂停事件

检测媒体播放/暂停事件

我想在拔下耳机后暂停播放,然后在重新插入耳机后继续播放。

我当前的解决方案使用ACPI来检测插入/拔出,如图这里。要播放/暂停播放,我使用xdotool key XF86AudioPlay.

该解决方案在基本情况下运行良好:

  • 正在播放音乐,已插入耳机
  • 耳机已拔出=>音乐暂停
  • 耳机已重新插入=>音乐继续播放。

但是,如果不是的话,我不想恢复播放积极的当耳机被拔掉时。

想象一下这个场景:

  • 插入耳机启动电脑,
  • 播放音乐,
  • 暂停音乐,
  • 拔掉耳机,
  • 重新插入耳机。

最后一点是问题所在——重新插入耳机后播放会恢复,尽管拔下耳机时播放并未处于活动状态。

此外,在我的系统上,xdotool key XF86AudioPlay只是切换播放,而xdotool key XF86AudioPause什么也不做。这让事情变得更糟:

  • 带上耳机启动电脑,
  • 播放音乐,
  • 暂停音乐,
  • 拔掉耳机(音乐开始播放!)

所以我需要的是检测播放/暂停/停止事件以及插入/拔出事件,以便能够在所有可能的情况下做出正确反应。

该状态机描述了所需的操作: 拔掉暂停FSM


我想到的一个想法是重新绑定播放/暂停/停止的键盘快捷键以添加状态机逻辑。这样做的缺点是播放总是必须使用这些键盘快捷键进行控制,而不是例如。 Rhythmbox 按钮,这有点不切实际。

另外,如果我在演奏时关闭 Rhythmbox,状态机将保持在某个playing状态。当然,我可以有一个“守护进程”,它将等待 Rhythmbox 关闭,然后将状态设置为stopped。但是,如果播放音乐的不是 Rhythmbox,而是 VLC 等怎么办?这种方法丑陋且不可靠,所以我想避免它。


我的问题:如何检测媒体播放何时暂停/恢复/停止?

答案1

一种选择是检查 Pulseaudio 流的状态,例如使用pacmd list-sink-inputs(查看state),或者使用您选择的编程语言直接与 Pulseaudio 恶魔交互。

如果播放器本身暂停,则需要媒体播放器暂停流(state从更改RUNNING为)。CORKED有些媒体播放器可能会这样做,有些可能不会。

相关内容