在 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 現象。
建議檢查:
- DMA 沒有及時的從 DDR 中將數據搬到 FIFO
- DDR 中申請的 buffer 不夠大
- DDR 中的 buffer 沒有數據