ALSA 音頻數據傳輸 underrun 和 overrun

在 ALSA 數據傳輸中,最容易出現的錯誤是 underrun 和 overrun。

  • pcm 播放的時候,接口 snd_pcm_writei 返回 -EPIPE,爲 underrun(不足)
  • 錄製音頻的時候, 接口 snd_pcm_readi 返回 -EPIPE, 爲 overrun(超載)

使用 ALSA 架構的驅動程,在實際開發使用過程中,比較常見的錯誤有 -EPIPE,爲什麼會出現呢?肯定是系統內部不和諧了!

  • 在 Playback 時出現 EPIPE 錯誤是因爲 ALSA 驅動 buffer 沒有數據可以丟給 codec 所致,通俗一點就是上層給下面喂數據的速度慢了,下面餓暈了,所以抱怨你上層慢啊,給你一個 -EPIPE 錯誤,讓你自己去找原因。
  • 在 Capture 時出現 EPIPE 也是有原因的,ALSA 的驅動也有一塊專門用來存儲錄音數據的 buffer,上層從該 buffer 搬運數據再存儲起來就能得到我們需要的錄音文件。一旦驅動的 buffer 滿了,就會出現 EPIPE 的錯誤,因爲上層讀錄音 buffer 數據的速度慢了,這就不能抱怨下層不給面子了。

通過分析出現原因後,我們得找找對策,說起來容易,做的可能因爲系統的原因並不是想的那麼容易。在播放的時候,如果會出現這種 -EPIPE 的錯誤,請調整下發數據的數據,加快一點點!錄音的時候出現這種錯誤,請讀得更快一點!可以提高任務的優先級來處理,也可以把驅動 buffer 擴大一下,給系統更多一些緩衝時間!

在這裏插入圖片描述

在錄音時由於錄音數據過快會產生overrun現象;在放音時由於用戶層的音頻數據到 DDR 中的速度比控制器到 codec 放出的速度慢,於是出現underrun 現象。

建議檢查:

  1. DMA 沒有及時的從 DDR 中將數據搬到 FIFO
  2. DDR 中申請的 buffer 不夠大
  3. DDR 中的 buffer 沒有數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章