我有一个在linux上使用ALSA驱动程序的音频应用程序,并且代码在intel linux桌面计算机上运行良好。但是,我还想支持Raspberry Pi,我在该平台上定期收听音频丢失和缓冲区欠载。公平地说,欠载也发生在intel linux上,但它们没有伴随着讨厌的静态爆发,这可能与该平台上的ALSA驱动程序有关。
无论如何,我得到两种类型的错误。首先,我对snd_pcm_wait()
的调用有时会返回-EPIPE
代码。我抓住了这段代码,然后尝试拨打snd_pcm_recover()
然后snd_pcm_prepare()
,但在后续的snd_pcm_writei()
调用中仍会出现一些静态失真。这是从这些错误中恢复的正确方法吗?有没有办法在没有静态的情况下从中恢复?
snd_pcm_wait()
成功返回后,我致电snd_pcm_avail_update()
...我是否应该在snd_pcm_recover()
成功返回后执行此操作?
我遇到的第二个问题是有时snd_pcm_writei()
也会返回-EPIPE
返回码。同样,我在这种情况下尝试调用snd_pcm_recover()
,但仍然会听到咔嗒声或其他恶意。有没有办法更优雅地从这个错误中恢复?
答案 0 :(得分:2)
欠调可以随时发生,因此任何函数都可以返回-EPIPE
。
snd_pcm_recover()
已经调用了snd_pcm_prepare()
;你不需要再打电话。
准备好设备时,会重置其缓冲区。换句话说,它已知是完全空的,因此您无需检查可用的帧数。
由于重置,您应该只听到之后写入缓冲区的数据。 任何静态都是来自underrun的一些剩余垃圾,并指示驱动程序中的错误。 你的应用程序无法做到这一点。