如何从ALSA中的-EPIPE错误中优雅地恢复?

时间:2012-10-11 14:51:03

标签: alsa raspberry-pi

我有一个在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(),但仍然会听到咔嗒声或其他恶意。有没有办法更优雅地从这个错误中恢复?

1 个答案:

答案 0 :(得分:2)

欠调可以随时发生,因此任何函数都可以返回-EPIPE

如果成功,

snd_pcm_recover()已经调用了snd_pcm_prepare();你不需要再打电话。

准备好设备时,会重置其缓冲区。换句话说,它已知是完全空的,因此您无需检查可用的帧数。

由于重置,您应该只听到之后写入缓冲区的数据。 任何静态都是来自underrun的一些剩余垃圾,并指示驱动程序中的错误。 你的应用程序无法做到这一点。