Linux ALSA 驱动及其应用心得汇总

这篇博客深入探讨了Linux ALSA驱动的各个方面,包括ALSA架构、ASoC(Audio Subsystem)驱动结构、DAPM(Dynamic Audio Processing Model)以及在移动设备中的应用。还分享了ALSA库的实战应用要点,特别是在处理音频数据缓冲区时需要注意的细节,以避免播放错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


首先,主要参看的网上的资料就是ALSA的官方主页以及一些博客。

1.驱动部分

Linux ALSA声卡驱动之一:ALSA架构简介

Linux ALSA声卡驱动之二:声卡的创建

Linux ALSA声卡驱动之三:PCM设备的创建

Linux ALSA声卡驱动之四:Control设备的创建

Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)

Linux ALSA声卡驱动之六:ASoC架构中的Machine

Linux ALSA声卡驱动之七:ASoC架构中的Codec

Linux ALSA声卡驱动之八:ASoC架构中的Platform

DAPM之一概述

DAPM之二:audio paths与dapm kcontrol

对没有开发过声卡驱动的人来说,有几个事情要好好研究一下。

  • ASoC下的ALSA驱动结构
  • 使用的声卡的数据接口是什么格式的,与声卡控制是什么接口,一般是I2C接口的
大部分做移植的人,并不需要自己去写声卡的驱动,这些都会有声卡的厂商提供,不过驱动的质量就因不同厂商而不同了。
另外在向驱动厂商要驱动的时候,一定要提及Linux的版本,2.6和3.0是有区别的,虽然不大。但在没有搞明白的时候,修改还是需要花费一番功夫的。
那么在有了驱动厂家的codec驱动后,自然是要加入你所使用的内核当中了。移植的过程后面会有实例说明。
那么为了证明驱动程序的正确,第一肯定是要在系统中先看到你所添加的声卡。然后可以使用alsamixer来对声卡进行配置,alsamixer里面的控件其实就是在驱动中添加进去的。

2. 应用部分

ALSA 自带的example

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。


更新中。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值