ALSA阈值,avail_min和期间有什么区别?

时间:2013-12-24 22:11:16

标签: audio audio-recording alsa

我正在使用四核debian盒子上的ALSA捕获程序,我很困惑。

基本ALSA捕获,hw:0接口,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的一半时间poll()返回时有大约1024帧可用,而有一半时间直到1500帧可用。当我将avail_min设置为512时,第一次读取是512,但随后95%的后续读取是1024帧或更大。当我呼叫snd_pcm_hw_params_get_period_size_min/max()时,此设备会报告16-8192帧的有效范围,因此512帧的时间似乎不合理 - 驱动程序报告hw支持它。

我尝试了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问题:

  1. 是否为启动阈值(使用snd_pcm_sw_params_set_start_threshold()仅与异步相关 捕获?也就是说,启动阈值似乎不适用于基于poll()的捕获。这是 正确的吗?

  2. 帧中的句点大小与帧中的avail_min大小有什么区别? 文档似乎暗示avail_min设置poll()将返回的点,因为至少有许多帧可供读取。句点大小是一个hw参数,但API仍然提供最小值和最大值以及设置它的方法。在我看来,他们真的是一样的但我不能让我的民意调查()根据我设定的时间段返回。

  3. 当我解释snd_pcm_sw_params_set_avail_min()的意图来设置触发poll()例程的可用捕获帧的目标数量时,我是否误读了文档?

  4. 对于我来说,期望poll()应该比任何可用于读取的500到1500帧之间的返回更加一致吗?或者这是正常的行为吗?我应该期待可供阅读的帧数有很大差异吗?

  5. 如果预期会有很大的变化,最好是始终读取snd_pcm_avail()报告的总可用帧数,还是每次poll()返回时最好读取一定数量的帧?

1 个答案:

答案 0 :(得分:0)

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

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

因此,如果您不想等待太长时间,则必须使周期足够短。