2012-10-11 154 views
4

我有一個音頻應用程序,它在Linux上使用ALSA驅動程序,並且代碼在intel linux桌面機上工作得很好。但是,我也想支持Raspberry Pi,並且在該平臺上定期發生音頻丟失和緩衝區欠載。公平起見,intel linux上也出現這種不足,但它們沒有伴隨着令人討厭的靜態爆發,這可能與該平臺上的ALSA驅動程序有關。如何正常恢復ALSA中的-EPIPE錯誤?

無論如何,我收到兩種類型的錯誤。首先,我撥打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(),但仍然聽到咔嗒聲或其他噪音。有沒有辦法更好地從這個錯誤中恢復?

回答

2

任何時候都可能發生欠載,所以任何函數都可以返回-EPIPE

snd_pcm_recover()如果成功,已經叫做snd_pcm_prepare();你不需要再次調用它。

當設備準備好時,其緩衝區被重置。換句話說,已知它是完全空的,所以你不需要檢查有多少幀可用。

由於重置,您應該只聽到您之後寫入緩衝區的數據。 任何靜態都將是來自underrun的一些剩餘垃圾,並指示驅動程序中的錯誤。 你的應用程序沒有什麼可以做的。