1. ALSA設備驅動將ALSA設備描述分為四層,從上到下為:
default
default:0
plughw:0,0
hw:0,0
不同的層次,對設備的控制權限不同,比如hardware parameters 的period/buffer size 需要在plughw:0,0 和 hw:0,0 這兩層才會作用。
2. Hardware Parameters && Software Parameters
對alsa-core設置,叫做Software Parameters,而對audio interface的設置叫做Hardware Parameters。
3. XRUN
xrun指的是,聲卡period一到,引發一個中斷,告訴alsa驅動,要填入數據,或讀走數據,但是,問題在於alsa的讀取和寫入操作必須用戶調用 writei和readi才會發生的,它不會去緩存數據。如果上層沒有用戶調用writei和readi,那么就會產生 overrun(錄制時,數據都滿了,還沒被alsa驅動讀走)和underrun(需要數據來播放,alsa驅動卻不寫入數據),統稱為xrun。
這個東西,需要用一些函數來設置,比如snd_pcm_sw_params_set_silence_threshold(),是針對playback 的,就是設置當xxx的情況下,就用silence來寫入hardware buffer。至於xxx情況,以及寫入多少silence,我都不是很清楚,還有,比如xrun到什么情況下,可以停止這個設備等等函數。一般情況下用 alsa驅動的默認的xrun處理策略。
if(err == -EPIPE){ snd_pcm_prepare(handle); err = snd_pcm_readi(handle, buf, samples); if(err < 0) printf("alsa read the pcm data error %s\n", snd_strerror(err)); }