恢复后脉冲音频不工作

恢复后脉冲音频不工作

嗨,暂停后 - 恢复声音应用程序仍然播放,但没有声音。

我需要发出(在 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

希望这会有所帮助。

相关内容