嗨,暂停后 - 恢复声音应用程序仍然播放,但没有声音。
我需要发出(在 shell 中)
/usr/bin/pasuspender /bin/true
然后声音又出现了。
这个命令当然也有效,但它会中断播放(必须重新启动声音应用程序中的播放),所以我不想要这个:
pulseaudio -k
这两个命令的描述如下:
https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting (请参阅“从暂停状态恢复后没有声音”)
所以问题是:
如果我将命令“psasuspender...”放入
/etc/systemd/system/[email protected]
挂起后,它不起作用。所以我在
/etc/pm/sleep.d/
像这样:
case "$1" in
hibernate|suspend)
# Stopping is not required
;;
thaw|resume)
/usr/bin/pasuspender /bin/true
;;
*) exit $NA
;;
esac
这也不起作用,在 /var/log/pm-suspend.log 中我得到:
Running hook /etc/pm/sleep.d/50alsa resume suspend:
Connection failure: Connection refused
pa_context_connect() failed: Invalid argument
/etc/pm/sleep.d/50alsa resume suspend: Returned exit code 1.
我的结论:在 Systemd 中,脚本未执行,不知道为什么。在 /etc/pm/sleep.d 中,脚本已执行,但为时过早,似乎在脉冲音频再次启动之前就执行了。因为如果我发出
/usr/bin/pasuspender /bin/true
在 Shell 中恢复后它总是有效。
所以问题是:
将 /usr/bin/pasuspender /bin/true 放在哪里,以便它在恢复过程中很晚才执行?知道为什么我必须发出此命令也很有趣,无法找出是什么中断了播放 @Suspend。
Ubuntu:15.10 声卡:Xonar U7 USB
答案1
我不是在回答你关于如何解决脚本问题的问题;但是我会冒昧地解释一下为什么会发生这种情况。音频是发送到音频设备的流,它是一种单向通信;一旦找到目标并且流正在进行中,就不再等待设备的进一步响应。因此,与任何双向数据流不同,当流中断时不容易检测到,当很明显不再有任何通信时;因此,在流被暂停中断后,流将停止并失去其目标。但是它没有意识到这种情况已经发生,因为目标定位过程仅在启动流时发生;当内存指针初始化时。
解决方法很可能是研究并重新初始化这些内存位置。
Pulse Audio 似乎根据硬件使用多个缓冲区,硬件当然是流的最终目标。如果这些缓冲区中的任何一个丢失了指向内存位置的指针,就会停止播放。这里有一篇有趣的小文章:
http://voices.canonical.com/david.henningsson/2014/11/21/pulseaudio-buffers-and-protocol/
在此过程中最有可能发生 dma,以便将流从任何严重的 CPU 依赖中解放出来;当然这取决于您的硬件。
https://en.wikipedia.org/wiki/Direct_memory_access
希望这会有所帮助。