【问题标题】:Alsa: snd_pci_readi() and real-time threadsAlsa:snd_pci_readi() 和实时线程
【发布时间】: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() 的输出。
  • 为什么?缓冲区大小不影响延迟;使其尽可能大。

标签: pthreads audio-recording alsa


【解决方案1】:

对于播放,缓冲区大小决定了延迟。

对于捕获,它没有;只有周期大小决定了您必须等待多长时间才能报告记录的样本可用。 因此,为防止溢出,请使缓冲区尽可能大(例如,在设置其他参数后调用snd_pcm_hw_params_set_buffer_size_max())。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    相关资源
    最近更新 更多