首页 > 代码库 > ALSA声音编程

ALSA声音编程

 

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));}