ALSA声卡07_分析调用过程_学习笔记
1、编译新的strace工具分析aplay和amixer应用程序对声卡的调用过程
(1)因为旧的strace工具不能识别不能识别alsa声卡驱动程序里面的ioctrl.
(2)编译过程参考http://blog.csdn.net/qingkongyeyue/article/details/52228729
(3)出现错误
需要建立相关的设备节点
播放声音和调整音量
(4)等待音频播放完,能得到一个完整的log,把log文件拷贝回windows下进行分析
2、调用分析(aplay.log)(搜索设备节点“/dev/snd”)
strace分析: aplay Windows.wav
应用程序打开一个设备 节点的时候,肯定要找到他的file_operation结构体
1. /dev/snd/controlC0(控制节点)对应的file_operations是snd_ctl_f_ops
所以的ioctl都会进入到snd_ctl_ioctl,函数里面对控制链表snd_control_ioctls里面取出某个结构体p,调用它的ioctl函数
open : snd_ctl_open
SNDRV_CTL_IOCTL_PVERSION : snd_ctl_ioctl -> put_user(SNDRV_CTL_VERSION, ip) //把版本号返回给用户空间
SNDRV_CTL_IOCTL_CARD_INFO : snd_ctl_ioctl -> snd_ctl_card_info(card, ctl, cmd, argp);//获取声卡信息返回给用户空间
copy_to_user
SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE : snd_ctl_ioctl -> snd_pcm_control_ioctl -> control->prefer_pcm_subdevice = val;//记录用户空间传进来的值(想使用的PCM的子设备),在嵌入式系统里面,子设备只有1个,值默认是0或1.
close
上述三个ioctl不涉及硬件操作(意味着以后写驱动程序的时候可能根本不需要管这个设备节点)
2. /dev/snd/pcmC0D0p (播放节点)对应的file_operations是snd_pcm_f_ops[0]
open : snd_pcm_playback_open
snd_pcm_open
snd_pcm_open_file
struct snd_pcm_substream *substream;//定义一个snd_pcm_substream 结构体
snd_pcm_open_substream//打开substream结构体
err = snd_pcm_hw_constraints_init(substream);//初始化substream结构体
snd_mask_any
snd_interval_any
......
err = substream->ops->open(substream) // substream->ops : snd_pcm_ops结构体
soc_pcm_open
依次调用cpu_dai, dma, codec_dai, machine(三大模块)的open或startup函数
uda134x_startup 里:snd_pcm_hw_constraint_minmax(SNDRV_PCM_HW_PARAM_RATE),snd_pcm_hw_constraint_minmax(SNDRV_PCM_HW_PARAM_SAMPLE_BITS)
dma_open里: snd_pcm_hw_constraint_integer,snd_soc_set_runtime_hwparams
runtime->hw.info = hw->info; = SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_MMAP_VALID |
SNDRV_PCM_INFO_PAUSE | //得到PCM设备的一些信息
SNDRV_PCM_INFO_RESUME,
snd_pcm_hw_constraints_complete
pcm_file->substream = substream;
file->private_data = pcm_file;
注意:substream->ops = soc_new_pcm函数里的soc_pcm_ops
以下的ioctl入口都是:snd_pcm_playback_ioctl
SNDRV_PCM_IOCTL_INFO : snd_pcm_info_user(substream, arg);//得到ioctl的信息返回给用户空间
substream->ops->ioctl(substream, SNDRV_PCM_IOCTL1_INFO, info);
snd_pcm_lib_ioctl
SNDRV_PCM_IOCTL_PVERSION : put_user(SNDRV_PCM_VERSION, (int __user *)arg)//lasa声卡驱动的版本号
SNDRV_PCM_IOCTL_TTSTAMP : snd_pcm_tstamp(substream, arg);
SNDRV_PCM_IOCTL_SYNC_PTR : snd_pcm_sync_ptr(substream, arg); 先不管
SNDRV_PCM_IOCTL_HW_REFINE .... : snd_pcm_hw_refine_user(substream, arg);//硬件参数重新规范
memdup_user //从用户空间传进来
snd_pcm_hw_refine(substream, params); //修改
copy_to_user //拷回给用户空间
SNDRV_PCM_IOCTL_HW_PARAMS : snd_pcm_hw_params_user(substream, arg);//设置硬件参数
snd_pcm_hw_params
substream->ops->hw_params(substream, params);
soc_pcm_hw_params
依次调用machine,codec_dai,cpu_dai,platform(dma)的hw_params函数
SNDRV_PCM_IOCTL_SYNC_PTR //同步指针
SNDRV_PCM_IOCTL_SW_PARAMS : snd_pcm_sw_params_user(substream, arg);//软件参数
snd_pcm_sw_params 不涉及硬件操作
SNDRV_PCM_IOCTL_SYNC_PTR//同步指针
SNDRV_PCM_IOCTL_PREPARE : snd_pcm_prepare(substream, file);//准备操作
snd_power_wait // 电源管理相关,先不管
.... 调用到platform里的prepare
SNDRV_PCM_IOCTL_SYNC_PTR
SNDRV_PCM_IOCTL_SW_PARAMS
循环:
SNDRV_PCM_IOCTL_WRITEI_FRAMES : copy_from_user //从用户空间把音频数据拿过来,从wav文件中读出数据,写多帧数据
snd_pcm_lib_write
snd_pcm_lib_write1(substream, (unsigned long)buf, size, nonblock, snd_pcm_lib_write_transfer)
snd_pcm_lib_write_transfer
copy_from_user
snd_pcm_start(substream); // 启动传输
SNDRV_PCM_IOCTL_SYNC_PTR//同步指针
SNDRV_PCM_IOCTL_DRAIN
SNDRV_PCM_IOCTL_DROP
SNDRV_PCM_IOCTL_HW_FREE //硬件释放
close
3、file_operation结构体
第0项对应的是播放,第1项对应的是录音,open对应的是and_pcm_playback_open
4、调用分析
strace分析: amixer cset numid=1 30 (设置音量)
/dev/snd/controlC0
open
SNDRV_CTL_IOCTL_CARD_INFO
SNDRV_CTL_IOCTL_PVERSION
SNDRV_CTL_IOCTL_ELEM_INFO //元素信息,这个元素可能指音量
SNDRV_CTL_IOCTL_ELEM_READ //读元素信息
SNDRV_CTL_IOCTL_ELEM_WRITE : snd_ctl_elem_write_user //写元素
snd_ctl_elem_write
// 找到一个snd_kcontrol
kctl = snd_ctl_find_id(card, &control->id);
// 调用它的put
ALSA声卡07_分析调用过程_学习笔记的更多相关文章
- fastdfs集群安装过程_学习笔记
最终效果 初始化为6个节点 在/usr/local/software 目录下上传需要用到tar包,分别在各个节点上传 使用scp 将本地software目录复制到其他节点上 73.74为 tracke ...
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- 《Linux内核分析》第一周学习笔记
<Linux内核分析>第一周学习笔记 计算机是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...
- 《Linux内核分析》第二周学习笔记
<Linux内核分析>第二周学习笔记 操作系统是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...
- 《Linux内核分析》第四周学习笔记
<Linux内核分析>第四周学习笔记 扒开系统调用的三层皮(上) 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.c ...
- linux内核分析第五周学习笔记
linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序
Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...
- Linux 内核分析第八周学习笔记
Linux 内核分析第八周学习笔记 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10 ...
- Linux内核分析第三周学习笔记
linux内核分析第三周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
随机推荐
- HBase架构解析
Hbase组件  客户端Client 整个HBase集群的入口 使用HBase RPC机制与HMaster和HRegionserver通信 与HMaster通信进行管理类的操作 与HRegionse ...
- mysql动态扩容调研
MySQL动态扩容方案 目前可用方案 MySQL的复制: 一个Master数据库,多个Salve,然后利用MySQL的异步复制能力实现读写分离,这个方案目前应用比较广泛,这种技术对于以读为主的应用很有 ...
- fiddler与Charles的区别
一.Fiddle2(v2.4.2.6,windows) fiddler除了常规的替换http请求.模拟慢网速外,还有一些日常开发里能用到的特殊功能. 1. http代理服务器 fiddler启动的时候 ...
- python之csv操作问题
注意注意 写入csv文件 一定要注意 [ ] fileObj = open("fileName","w+") file = csv.writer(fileObj ...
- Nodejs下express+ejs模板的搭建
nodejs的环境配置,这里就不做说明了.在nodejs安装后的步骤在这里说明一下 首先 全局安装express npm install -g express-generator 安装ok后,接着 ...
- vue-router(二)后代路由
关键字:router,children ,router-link,router-view,router-link-active 先理解什么是children? 后代路由为某路由中用到router-vi ...
- WebForm、MVC图片加载失败处理
还是那个该死的WebFrom项目,部分功能替换为MVC后感觉好多了,但是WebForm.MVC都有图片加载失败时显示提示图片的需求,并且统一在js中处理.问题来了,js中图片路径怎么处理呢?现场有可能 ...
- Android上玩玩Hook:Cydia Substrate实战
作者简介:周圣韬,百度高级Android开发工程师,博客地址:http://blog.csdn.net/yzzst 了解Hook 还没有接触过Hook技术读者一定会对Hook一词感觉到特别的陌生,Ho ...
- UVALive - 4108 SKYLINE (吉司机线段树)
题目链接 题意:在一条直线上依次建造n座建筑物,每座建筑物建造完成后询问它在多长的部分是最高的. 比较好想的方法是用线段树分别维护每个区间的最小值mi和最大值mx,当建造一座高度为x的建筑物时,若mi ...
- 让nodejs 支持 es6 import
备注: 尽管nodejs 新版本已经支持es6 的好多特性了,但是还是有部分不支持,为了使用,实际上我们有一个 比较强大工具 bable,下面介绍几个比较简单的用法. 1. bable-cli ...