我有一个音频应用程序,它在linux上使用ALSA驱动程序,代码在英特尔linux台式机上运行得很好。然而,我也想支持Raspberry Pi,并且我在该平台上得到了周期性的音频丢失和缓冲区欠载。公平地说,在英特尔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(),但仍然可以听到滴答声或其他糟糕的声音。有没有办法更优雅地从这个错误中恢复过来?
发布于 2012-10-12 00:56:47
任何时候都可能发生欠载运行,因此任何函数都可能返回-EPIPE。
如果成功,snd_pcm_recover()已经调用了snd_pcm_prepare();您无需再次调用它。
当设备准备就绪时,其缓冲区将被重置。换句话说,它是完全空的,所以你不需要检查有多少帧可用。
由于重置,您应该只听到之后写入缓冲区的数据。任何静电都可能是欠载运行时遗留下来的一些垃圾,并表明驱动程序中存在错误。你的应用程序对此无能为力。
https://stackoverflow.com/questions/12842395
复制相似问题