首先,主要参看的网上的资料就是ALSA的官方主页以及一些博客。
1.驱动部分
Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)
Linux ALSA声卡驱动之六:ASoC架构中的Machine
Linux ALSA声卡驱动之七:ASoC架构中的Codec
Linux ALSA声卡驱动之八:ASoC架构中的Platform
DAPM之二:audio paths与dapm kcontrol
对没有开发过声卡驱动的人来说,有几个事情要好好研究一下。
- ASoC下的ALSA驱动结构
- 使用的声卡的数据接口是什么格式的,与声卡控制是什么接口,一般是I2C接口的
大部分做移植的人,并不需要自己去写声卡的驱动,这些都会有声卡的厂商提供,不过驱动的质量就因不同厂商而不同了。
另外在向驱动厂商要驱动的时候,一定要提及Linux的版本,2.6和3.0是有区别的,虽然不大。但在没有搞明白的时候,修改还是需要花费一番功夫的。
那么在有了驱动厂家的codec驱动后,自然是要加入你所使用的内核当中了。移植的过程后面会有实例说明。
那么为了证明驱动程序的正确,第一肯定是要在系统中先看到你所添加的声卡。然后可以使用alsamixer来对声卡进行配置,alsamixer里面的控件其实就是在驱动中添加进去的。
2. 应用部分
3. ALSA lib实战应用要点
在写ALSA的应用当中,有很多问题,因为没找到比较好的文档,只有官方doxygen生成的借口函数文档,加上看的匆忙,走了些弯路。最后还是参看aplay的源码,程序才稳定点。
-
snd_pcm_sframes_t snd_pcm_writei (snd_pcm_t * pcm, const void * buffer, snd_pcm_uframes_t size)
中的参数snd_pcm_uframes_t 是一个frame的size,并不是要播放声音的字节的大小。
static size_t bits_per_sample, bits_per_frame; static size_t chunk_bytes; chunk_bytes = chunk_size * bits_per_frame / 8;
- ALSA lib的播放机制,根据我的猜测,声音数据被循环放入一个固定大小的buffer中,buffer的大小是预先设置好的,ALSA的驱动每次从buffer取指定大小的数据,指定的大小也是在初始化的时候设定好的。这样就产生一个问题,如果用户给的数据小于驱动取的数据,就会将buffer中后面随机的数据播放出来。由于这个原因,我们每次调用snd_pcm_writei类的函数,其数据大小要等于驱动每次播放的大小。这个值就是chunk_size。
更新中。。。。