ANDROID音頻系統散記之三:resample-2 2012-01-13 18:01 104人閱讀 評論(0) 收藏 舉報
這篇是承接上一篇提到的底層resample處理,以Samsung的mini alsa-lib為例說明。
mini alsa-lib
這個mini alsa-lib位於android2.3.1-gingerbread/device/samsung/crespo/libaudio中。如之前所說alsa-lib實現了太多plugin的功能,顯得複雜臃腫。因此我建議如果想了解alsa在上層調用過程,最好從這個mini alsa-lib入手,就兩個源文件:alsa_pcm.c和alsa_mixer.c,前者是pcm回放錄音介面,後者是mixer controls的控制介面。
alsa-lib其實也是通過操作/dev目錄的設備節點來調用內核空間的音頻驅動介面,這點跟平常的字元設備的調用方法一樣的。如open:
[cpp] view plaincopy
- structpcm*pcm_open(unsignedflags)
- {
- constchar*dname;
- structpcm*pcm;
- structsnd_pcm_infoinfo;
- structsnd_pcm_hw_paramsparams;
- structsnd_pcm_sw_paramssparams;
- unsignedperiod_sz;
- unsignedperiod_cnt;
- LOGV("pcm_open(0x%08x)",flags);
- pcm=calloc(1,sizeof(structpcm));
- if(!pcm)
- return&bad_pcm;
- if(flags&PCM_IN){
- dname="/dev/snd/pcmC0D0c";//capture設備節點
- }else{
- dname="/dev/snd/pcmC0D0p";//playback設備節點
- }
- ...
- pcm->flags=flags;
- pcm->fd=open(dname,O_RDWR);
- if(pcm->fd<0){
- oops(pcm,errno,"cannotopendevice"%s"");
- returnpcm;
- }
- if(ioctl(pcm->fd,SNDRV_PCM_IOCTL_INFO,&info)){
- oops(pcm,errno,"cannotgetinfo-%s");
- gotofail;
- }
- ...
- }
這裡不多考究這些介面實現。alsa_pcm.c中有個函數挺有趣的:[cpp] view plaincopy
- staticvoidparam_set_mask(structsnd_pcm_hw_params*p,intn,unsignedbit)
- {
- if(bit>=SNDRV_MASK_MAX)
- return;
- if(param_is_mask(n)){
- structsnd_mask*m=param_to_mask(p,n);
- m->bits[0]=0;
- m->bits[1]=0;
- m->bits[bit>>5]|=(1<<(bit&31));
- }
- }
其中SNDRV_MASK_MAX和snd_mask的定義分別如下:
[cpp] view plaincopy
※儒教的神靈系統
※分散式緩存系統Memcached簡介與實踐
※VRV空調系統,你了解嗎?
※撥開免疫系統迷霧:增強免疫力強能使人健康嗎?
※海龜股票交易系統(1)
TAG:音頻 | 系統 |