【问题标题】:How to gracefully recover from -EPIPE errors in ALSA?如何优雅地从 ALSA 中的 -EPIPE 错误中恢复?
【发布时间】:2012-10-02 06:50:22
【问题描述】:

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

【问题讨论】:

    标签: alsa raspberry-pi


    【解决方案1】:

    下溢随时可能发生,因此任何函数都可以返回-EPIPE

    snd_pcm_recover() 已经调用了snd_pcm_prepare() 如果它成功了;您无需再次调用它。

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

    由于重置,您应该只能听到之后写入缓冲区的数据。 任何静态都将是来自欠载的一些剩余垃圾,并表明驱动程序中存在错误。 您的应用程序对此无能为力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多