5

我有一个在 linux 上使用 ALSA 驱动程序的音频应用程序,并且该代码在 intel linux 台式机上运行良好。但是,我还想支持 Raspberry Pi,并且我在该平台上遇到了周期性的音频丢失和缓冲区欠载。公平地说,intel linux 上也会发生欠载,但它们并没有伴随令人讨厌的静态突发,这可能与该平台上的 ALSA 驱动程序有关。

无论如何,我得到两种类型的错误。首先,我的调用snd_pcm_wait()有时会返回-EPIPE代码。我捕获了这段代码,然后尝试调用snd_pcm_recover()then snd_pcm_prepare(),但是在随后的调用中仍然会出现一些静态失真snd_pcm_writei()。这是从此类错误中恢复的正确方法吗?有没有办法在没有静电的情况下从中恢复?

snd_pcm_wait()成功返回时,我会打电话给snd_pcm_avail_update()......在成功返回后我是否也应该这样做snd_pcm_recover()

我遇到的第二个问题是有时snd_pcm_writei()也会返回-EPIPE返回码。同样,我尝试在这种情况下打电话snd_pcm_recover(),但仍然会听到咔哒声或其他讨厌的声音。有没有办法更优雅地从这个错误中恢复?

4

1 回答 1

3

任何时候都可能发生欠载,因此任何函数都可以返回-EPIPE

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

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

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

于 2012-10-11T16:56:47.340 回答