gpt4 book ai didi

audio - ALSA 阈值、avail_min 和 period 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 16:10:15 30 4
gpt4 key购买 nike

我正在四核 debian 盒子上研究 ALSA 捕获例程,我很困惑。

基本 ALSA 捕获,hw:0 接口(interface),16 位,44.1 KHz,使用带有 poll() 的阻塞线程,由 snd_pcm_start() 控制和 snd_pcm_drop() .我检查所有 ALSA API 调用的返回值。基本捕获工作正常,但我不知道如何设置轮询率(即 ALSA 通知我的 poll() 例程返回的频率,因为帧可供读取)。

我用 snd_pcm_sw_params_set_avail_min()将此设置为 2048 帧,当有大约 2048 帧可供读取时,poll() 返回。我调用 snd_pcm_avail_delay()在我调用 snd_pcm_readi() 之前这一切似乎都是合理的。但是,如果我将其设置为小于 2048 的任何值,我会得到不一致的结果。如果我将avail_min 设置为 1024,则当有大约 1024 帧可用时,poll() 的一半时间返回,而一半时间直到 1500 帧可用。当我将avail_min 设置为 512 时,第一次读取是 512,但随后 95% 的后续读取是 1024 帧或更大。当我调用 snd_pcm_hw_params_get_period_size_min/max()该设备报告的有效范围为16-8192帧,因此512帧的周期似乎不无道理--驱动程序报告硬件支持它。

我已经尝试了 snd_pcm_sw_params_set_avail_min() 的所有组合, snd_pcm_hw_params_set_period_size()snd_pcm_sw_params_set_start_threshold() ,但仍然不能
得到合理的结果。

我尝试使用 pthread setaffinity 将此线程固定到单个 CPU 内核。我试过sched_setschedule()给予过程“软”的实时优先级。除了将avail_min设置为至少2048之外,似乎没有什么能让我获得一致的 poll() 返回。

所以这里有一些ALSA问题:

  • 是开始阈值(使用 snd_pcm_sw_params_set_start_threshold() 仅与异步相关
    捕获?也就是说,开始阈值似乎不适用于基于 poll() 的捕获。这是
    正确的?
  • 以帧为单位的周期大小和以帧为单位的avail_min 大小有什么区别?
    该文档似乎暗示avail_min设置了 poll() 将返回的点,因为至少有那么多帧可供读取。周期大小是一个硬件参数,但 API 仍然提供最小值和最大值以及设置它的方法。在我看来,它们实际上是一回事,但我无法让 poll() 根据我设定的时间段返回。
  • 当我解释 snd_pcm_sw_params_set_avail_min() 的意图时,我是否误读了文档?设置用于触发 poll() 例程的可用捕获帧的目标数量?
  • 我期望 poll() 应该比任何时候有 500 到 1500 帧可供阅读时更一致地返回是否合理?还是这是正常行为,我应该期望可供阅读的帧数有很大差异?
  • 如果预期会有很大的变化,最好总是读取snd_pcm_avail() 报告的可用帧总数吗?还是每次 poll() 返回时最好读取一组帧?
  • 最佳答案

    启动阈值对捕获设备没有多大意义;只需将其设置为 1。

    硬件不断填充捕获缓冲区,但仅在每个周期结束时引发中断。
    当 ALSA 等待某些数据可用时(在 poll 或 snd_pcm_read* 中),它不会在avail_min 帧可用之前返回。但是,此检查仅在函数开始时进行,或者在被中断唤醒时进行。

    因此,如果您不想等待太久,则必须使周期大小足够短。

    关于audio - ALSA 阈值、avail_min 和 period 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20767279/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com