【Alsa】播放声音跟录音详细流程(精编版)_第1页
【Alsa】播放声音跟录音详细流程(精编版)_第2页
【Alsa】播放声音跟录音详细流程(精编版)_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、【alsa 】播放声音跟录音详细流程播放声音和录音详细流程一,前言:linux中,无论是oss还是 alsa体系,录音和放音的数据流必须分析清楚。先分析alsa驱动层,然后关联到alsa 库层和应用层。二,链接分析:1 )链路一usr/src/linux-source-3.0.0/sound/core/pcm_native.c文件中注册部分 .mmap = snd_pcm_mmap调用snd_pcm_mmap_data(substream, file, area);该方法中进一步调用substream->ops->mmap(substream, area);根据./

2、soc/pxa/pxa3xx-pcm.c文件中 .mmap = pxa3xx_pcm_mmap,可知dma_mmap_writecombine(, ,runtime->dma_addr,);函数被调用。soc/pxa/pxa3xx-pcm.c文件中pxa3xx_pcm_hw_params()函数会创建链表,根据dma_buff_phys = runtime->dma_addr; dma_desc->dsadr = dma_buff_phys;可知runtime->dma_addr为 dma内存端地址, 且此地址由alsa库层传递进来。又根

3、据dma_desc->dtadr = prtd->params->dev_addr和 soc/pxa/pxa3xx-ac97.c文件中.dev_addr = preg(pcdr),可知 dma外设端地址为ac97控制器中fifo读写寄存器pcdr 。至此, 第一条链路建立完毕: fifo通过 dma和内存交互。2 )链路二ac97接口或者i2s(inter ic sound)或者 pcm接口可以将cpu和 codec(wm9714/alc5620/alc5621)连接起来。配置好格式: pcm接口必须配置采样率、采样位数、通道数和传送格式;i2s 接口

4、必须配置采样率、采样位数、通道数和对齐方式;ac97接口比较灵活,可以认为cpu这端不用配置 ,只需要在 codec端配置就行了。当然,电源、时钟、io任何数字芯片都得配置。最后不能混淆数据接口和控制接口的慨念, i2s 和 pcm只能传输音频数据,访问 codec的寄存器必须通过 i2c等控制接口, ac97接口分时传输控制和数据。codec 中的 adc/dac通过 ac97等接口同 cpu的 fifo交互数据。第二条链路建立完毕。3 )链路三alsa_lib源码中 pcm.c文件中snd_pcm_readi(,buffer,size)调用 pcm_local.h文件中_snd_pcm_r

5、eadi(,buffer,size);进一步调用pcm->fast_ops->readi(pcm->fast_op_arg, buffer, size);根据 pcm_hw.h文件中 .readi = snd_pcm_hw_readi可知 , ioctl(fd, sndrv_pcm_ioctl_readi_frames, &xferi);被调用。内核中,根据 /soc/pcm_native.c文件中 .unlocked_ioctl= snd_pcm_capture_ioctl,可知 snd_pcm_capture_ioctl1被调用,根

6、据 sndrv_pcm_ioctl_readi_frames参数可知 snd_pcm_lib_read(substream, xferi.buf, xferi.frames);被调用,最终snd_pcm_lib_read1(,snd_pcm_lib_read_transfer)被调用。根据 transfer被调用可知snd_pcm_lib_read_transfer被调用, 然后调用 copy_to_user(buf, hwbuf,frames_to_bytes(runtime, frames),可知,将dma端内存的数据拷贝到alsa_lib提供的一个指针所指的内存,alsa库函数 snd_

7、pcm_readi、snd_pcm_writei实现了内存到内存的交互,或者近似地认为是内存到音频文件的交互。至此最后一条链路建立完毕。三,执行分析:录音:mic phone接到 codec ,经过 adc 变成数字信号, 经过链路二中ac97等接口存储到cpu的 fifo中,经过链路一中的 dma传输存储到内存,经过链路三中alsa_lib中snd_pcm_readi接口传给录音软件,经过编码,进而形成音 频文件。放音:播放软件将音频文件解码,并通过链路三中snd_pcm_writei接口逐渐传递到和dma相关的内存,经过链路二中 dma传递给 cpu的 fifo ,再经过 ac97等接口传

8、递给 dac ,最后传给连接在codec上的 speaker。四,总结:1) )ac97 (声卡标准)数据传输颇复杂,分时复用,cpu 端 fifo和 codec端 adc/dac关系要对应好。比如,cpu 端的pcm left fifo占用 slot3( cpu中扩展插槽) ,那么 adc( analog to digital模数变换)只有配置成slot3才能把数据传递给它, 如果配置成slot6 ,那就传给cpu的 mic in fifo了。录音单声道通常选择slot6 ,录音双声道通常两个adc分别选择slot3 和 slot4 。2) ) wav音频文件大小计算:要测试录音是否丢祯,就

9、必然要计算文件大小,通常的方法是:根据录音时间,用公式:录音时间 (单位 s)x采样率 x( 采样位数 /8)x通道数。比如:录音时间5 秒,采样率8khz ,位数 16位,通道数 1, 那么 5x8000x(16/8)x1=80k,实际的 wav文件大小稍大于 80k就对了。还有一种计算文件大小的方法:通常音频系统要用 dma ,也会用到dma中断,可以在dma中断中打印计数,次数xdma中断周期字节就行了。3) )数据交换的大小问题:链路一中dma传输必须和fifo的特性匹配:若fifo 位宽是 16 位,深度是16 ,并且半满时向dma发出请求 ( 握手),则链表式dma必须配置成传输位宽16位, 1 次突发16 字节,才能保证不丢失位数和数据个数。链路二中 cpu端 fifo位数要和 codec端 adc/dac采样位数匹配, i2s/pcm接口可以配置成一样的值,比如16 位, ac97接口复杂一点, cpu端不用配置, 那么采样位数是多少呢 若 cpu端 fifo 一个声道位宽16位, codec端 adc/dac位宽 18

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论