Alsa:snd_pci_readi() 和实时线程
Alsa: snd_pci_readi() and real-time threads
我有一个专用线程可以通过 snd_pcm_readi() 从 Alsa 捕获音频。定期我得到一个简短的阅读,这意味着 snd_pcm_readi() returns 一个小于我的缓冲区大小的正整数,并且我的音频流中显然有一个 'pop' 声音。然后我将线程优先级设置为实时,这带来了实实在在的好处,远不如短读,但这并没有解决。
现在的问题是:在走上实时修补 Linux 内核的坎坷之路之前,我还能做些什么来获得更多性能?在专用线程中调用 snd_pcm_readi() 是从 Alsa 中提取音频的最佳方式吗?
对于播放,缓冲区大小决定了延迟。
对于捕获,它没有;只有周期大小决定了您必须等待多长时间才能报告记录的样本可用。
因此,为防止溢出,请使缓冲区尽可能大(例如,通过在设置其他参数后调用 snd_pcm_hw_params_set_buffer_size_max()
)。
我有一个专用线程可以通过 snd_pcm_readi() 从 Alsa 捕获音频。定期我得到一个简短的阅读,这意味着 snd_pcm_readi() returns 一个小于我的缓冲区大小的正整数,并且我的音频流中显然有一个 'pop' 声音。然后我将线程优先级设置为实时,这带来了实实在在的好处,远不如短读,但这并没有解决。
现在的问题是:在走上实时修补 Linux 内核的坎坷之路之前,我还能做些什么来获得更多性能?在专用线程中调用 snd_pcm_readi() 是从 Alsa 中提取音频的最佳方式吗?
对于播放,缓冲区大小决定了延迟。
对于捕获,它没有;只有周期大小决定了您必须等待多长时间才能报告记录的样本可用。
因此,为防止溢出,请使缓冲区尽可能大(例如,通过在设置其他参数后调用 snd_pcm_hw_params_set_buffer_size_max()
)。