我有一个在 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(),但仍然听到咔嗒声或其他令人讨厌的声音。有没有办法更优雅地从这个错误中恢复?
欠载运行随时可能发生,因此任何函数都可能返回-EPIPE。
snd_pcm_recover()snd_pcm_prepare()如果成功就已经调用过;您不需要再次调用它。
当设备准备好时,其缓冲区将被重置。换句话说,已知它是完全空的,因此您不需要检查有多少帧可用。
由于重置,您应该只能听到随后写入缓冲区的数据。任何静电都会是欠载运行中剩余的垃圾,并表明驱动程序中存在错误。您的应用程序对此无能为力。
| 归档时间: |
|
| 查看次数: |
5241 次 |
| 最近记录: |