ALSA:防止扬声器不足的方法

我正在以非交错模式播放单声道audio。 当我将aduio数据写入扬声器时,我正在运行ALSA lib pcm.c:7339:(snd_pcm_recover) underrun occurred

这是我写的:

  printf("%d",snd_pcm_avail (spkhandle)); ret = snd_pcm_writen(spkhandle, pSpeakerBuf , framesIn18Millisec); if(ret < 0) { snd_pcm_recover(spkhandle, ret, 0); } 

什么是不同的方式/参数configuration来防止运行ALSA?

(我正在使用Linux 3.0,ARM)

编辑:这是一个使用snd_pcm_avail()API的缓冲区度量

  snd_pcm_avail = 2304 << snd_pcm_writen call 1 success snd_pcm_avail = 2160 << snd_pcm_writen call 2 success snd_pcm_avail = 2016 << snd_pcm_writen call 3 success snd_pcm_writen error -32 Broken pipe << snd_pcm_writen call 4 failure ALSA lib pcm.c:7339:(snd_pcm_recover) underrun occurred << And displays this message 

以下是Marko要求的输出:

 snd_output_t* out; .... // Do alsa parameters init .... .... snd_output_stdio_attach(&out, stderr, 0); snd_pcm_dump_sw_setup(spkhandle, out); tstamp_mode : NONE period_step : 1 avail_min : 144 period_event : 0 start_threshold : 288 stop_threshold : 2304 silence_threshold: 0 silence_size : 0 boundary : 1207959552 

Solutions Collecting From Web of "ALSA:防止扬声器不足的方法"

我假设这个代码运行在一个紧密的循环中,并打算在snd_pcm_writen()上阻塞。 没有给出采样率; 我假设48kHz,因为数字都很好地分开。

我认为这里是如下:

  • snd_pcm_write()并不保证写入所有提供的帧(返回值只能在错误条件下检查)。 从snd_pcm_avail()的日志记录来看,实际上每个帧都消耗avail_min144帧。 这是音频的3ms。
  • 假设此时音频未运行,经过两次写入,缓冲区中的帧数等于start_threshold288样本; 音频输出开始
  • 调用printf()块,我似乎记得snd_pcm_avail()必须与音频输出硬件同步,也可能会阻塞。 由于您现在比播放时间早了6ms,所以在snd_pcm_writen()的第三次调用期间,缓冲区完全可能正在运行,

总之,在这一点上你不应该调用printf() ,而且你可能需要补偿snd_pcm_writen()不消耗pSpeakerBuf所有帧的pSpeakerBuf

这是缓冲区不足,您可以尝试增加缓冲区大小,在〜/ .asoundrc文件中明确提到它?