alsa-driver与alsa-lib之间的关系

zzhhzr 2008-10-21 09:45:02
alsa-driver与alsa-lib之间的关系
alsa声卡驱动体系中的alsa-driver与alsa-lib是整个alsa音频驱动的中间层,
alsa app
--------------------
alsa lib
--------------------
alsa driver
--------------------
alsa device driver

上面的alsa app只需要集中注意力到应用逻辑,
下层的alsa device driver也只需要关注如何实现alsa driver要求的接口.

现在我有个问题想请教各位牛人,在lib与driver之间一定会有接口,
但我跟踪了alsa-lib里面的pcm.c里面的snd_pcm_open\snd_pcm_hw_params_any\
snd_pcm_writei等一系统列(用户放音接口)用户接口,但并没有发现与driver层的接口函数。

在网上曾经看到过一些关于这方面的资料,driver为lib提供的接口就是在driver层pcm_native.c里面的文件接口函数
struct file_operations snd_pcm_f_ops[2] = {
{
.owner = THIS_MODULE,
.write = snd_pcm_write,
.writev = snd_pcm_writev,
.open = snd_pcm_playback_open,
.release = snd_pcm_release,
.poll = snd_pcm_playback_poll,
.unlocked_ioctl = snd_pcm_playback_ioctl,
.compat_ioctl = snd_pcm_ioctl_compat,
.mmap = snd_pcm_mmap,
.fasync = snd_pcm_fasync,
},
{
.owner = THIS_MODULE,
.read = snd_pcm_read,
.readv = snd_pcm_readv,
.open = snd_pcm_capture_open,
.release = snd_pcm_release,
.poll = snd_pcm_capture_poll,
.unlocked_ioctl = snd_pcm_capture_ioctl,
.compat_ioctl = snd_pcm_ioctl_compat,
.mmap = snd_pcm_mmap,
.fasync = snd_pcm_fasync,
}
};
而在lib中是只有Plugin:hw(我自认为是lib中的pcm_hw.c文件)和alsa driver
打交道,其他Plugin(其它的pcm_xxx.c)只需要和Plugin:hw打交道即可.

言下之意就是说,我上面说的pcm.c中的用户接口函数,就是调用lib中的pcm_hw.c中的接口函数
来与alsa-driver发生联系(据我的推断:可能就是通过他们来调用driver中的pcm_native.c中的文件接口)。

这个问题我搞了一周了,主就是没有发现点什么,alsa到底是怎么实现lib与driver之间的接口的呢?
...全文
1930 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
安然无忧 2011-10-18
  • 打赏
  • 举报
回复
最近也在看这个,没想到08年就有人研究过了,前辈啊.我居然跟楼主想到一块了。
qianxunzhilu 2010-10-08
  • 打赏
  • 举报
回复
学习。。。。。。。。
ice50303 2010-06-13
  • 打赏
  • 举报
回复
请问诸位,我声音采集出来了 为什么声音快啊?
zzhhzr 2008-10-27
  • 打赏
  • 举报
回复
谢谢大家!!!

谢谢laozei000
laozei000 2008-10-27
  • 打赏
  • 举报
回复
snd_pcm_lib_write_transfer这个一般只是进行dma enqueue,dma完成后的中断处理ISR(arch/xx/mach/xx/dma.c)后调用dma设置时的callback。
zzhhzr 2008-10-24
  • 打赏
  • 举报
回复
恩,这个我了解,那完成DMA的传输是不是在snd_pcm_lib_write_transfer这个函数里实现的?
我感觉就是这个函数
laozei000 2008-10-23
  • 打赏
  • 举报
回复
中断的产生与音频驱动相关,比如使用dma的话,完成一次dma传输就产生一次中断
zzhhzr 2008-10-22
  • 打赏
  • 举报
回复
这两层间的接口确实是在pcm_hw.c(lib)和pcm_native.c(driver)中实现的,如snd_pcm_writei函数最终是调用了pcm_hw.c中的ioctl函数,这个函数是通向driver层的pcm_native.c的入口.

但有一个好像是例外的,就是snd_pcm_open,我没有找到他从lib到driver的接口,不知道在pcm_native.c里面有一个snd_pcm_open是不是就是对应这个函数.

另外,声卡要发声,是不是写一次就会发送一个中断?
据我所知,这是alsa的中断放音模式,还有一种是非中断放音模式的,就是open-->设置参数-->writei,就可以了,
但我这样做了,writei返回的也是对的(返回写入的大小),但就是没有声音.
我是在没有lib层的条件下做的,只是调用driver层的接口,流程是参照lib层非中断放音模式的写的.

请问各位牛人这是怎么回事?
bendragon 2008-10-21
  • 打赏
  • 举报
回复
我也想知道楼主的问题,也没搞清楚,如果楼主知道了,交流一下
sheshijie 2008-10-21
  • 打赏
  • 举报
回复
alsa app
--------------------
alsa lib
--------------------
alsa driver
--------------------
alsa device driver

google 一下 看看alsa上面有没有

4,468

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧