Alsa:snd_pci_readi() 和实时线程
Posted
技术标签:
【中文标题】Alsa:snd_pci_readi() 和实时线程【英文标题】:Alsa: snd_pci_readi() and real-time threads 【发布时间】:2018-09-19 23:21:32 【问题描述】:我有一个专用线程通过 snd_pcm_readi() 从 Alsa 捕获音频。定期我得到一个简短的阅读,这意味着 snd_pcm_readi() 返回一个小于我的缓冲区大小的正整数,并且我的音频流中显然有一个“流行”的声音。然后我将线程优先级设置为实时,这带来了实实在在的好处,减少了短读取,但这并没有解决问题。
现在的问题是:在走上实时修补 Linux 内核的崎岖道路之前,我还可以做些什么来提高性能?在专用线程中调用 snd_pcm_readi() 是从 Alsa 中提取音频的最佳方式吗?
【问题讨论】:
周期/缓冲区大小是多少?为什么? 周期大小为 512 个样本。我故意使用一个糟糕的 USB 音频加密狗来测试我的系统在恶劣的条件下。短读很少见,假设平均每 30 秒一次,所以我想知道是否可以编写更好的代码而不是增加周期大小。 缓冲区大小是多少? 1024 作为 snd_pcm_dump() 的输出。 为什么?缓冲区大小不影响延迟;使其尽可能大。 【参考方案1】:对于播放,缓冲区大小决定了延迟。
对于捕获,它没有;只有周期大小决定了您必须等待多长时间才能报告记录的样本可用。
因此,为防止溢出,请使缓冲区尽可能大(例如,在设置其他参数后调用snd_pcm_hw_params_set_buffer_size_max()
)。
【讨论】:
以上是关于Alsa:snd_pci_readi() 和实时线程的主要内容,如果未能解决你的问题,请参考以下文章
如何在NSIS卸载时线运行一个EXE文件?(EXE文件在卸载程序目录下)用啥代码?