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

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

最佳答案 欠运可以随时发生,因此任何函数都可以返回-EPIPE.

如果成功,snd_pcm_recover()已经调用了snd_pcm_prepare();你不需要再打电话.

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

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

点赞