我想在拔下耳机后暂停播放,然后在重新插入耳机后继续播放。
我当前的解决方案使用ACPI来检测插入/拔出,如图这里。要播放/暂停播放,我使用xdotool key XF86AudioPlay
.
该解决方案在基本情况下运行良好:
- 正在播放音乐,已插入耳机
- 耳机已拔出=>音乐暂停
- 耳机已重新插入=>音乐继续播放。
但是,如果不是的话,我不想恢复播放积极的当耳机被拔掉时。
想象一下这个场景:
- 插入耳机启动电脑,
- 播放音乐,
- 暂停音乐,
- 拔掉耳机,
- 重新插入耳机。
最后一点是问题所在——重新插入耳机后播放会恢复,尽管拔下耳机时播放并未处于活动状态。
此外,在我的系统上,xdotool key XF86AudioPlay
只是切换播放,而xdotool key XF86AudioPause
什么也不做。这让事情变得更糟:
- 带上耳机启动电脑,
- 播放音乐,
- 暂停音乐,
- 拔掉耳机(音乐开始播放!)。
所以我需要的是检测播放/暂停/停止事件以及插入/拔出事件,以便能够在所有可能的情况下做出正确反应。
我想到的一个想法是重新绑定播放/暂停/停止的键盘快捷键以添加状态机逻辑。这样做的缺点是播放总是必须使用这些键盘快捷键进行控制,而不是例如。 Rhythmbox 按钮,这有点不切实际。
另外,如果我在演奏时关闭 Rhythmbox,状态机将保持在某个playing
状态。当然,我可以有一个“守护进程”,它将等待 Rhythmbox 关闭,然后将状态设置为stopped
。但是,如果播放音乐的不是 Rhythmbox,而是 VLC 等怎么办?这种方法丑陋且不可靠,所以我想避免它。
我的问题:如何检测媒体播放何时暂停/恢复/停止?
答案1
一种选择是检查 Pulseaudio 流的状态,例如使用pacmd list-sink-inputs
(查看state
),或者使用您选择的编程语言直接与 Pulseaudio 恶魔交互。
如果播放器本身暂停,则需要媒体播放器暂停流(state
从更改RUNNING
为)。CORKED
有些媒体播放器可能会这样做,有些可能不会。