alsa 编程详解

一、alsa结构

官方主页:AlsaProject

1、alsa-lib. ALSA 应用库(最常用):

        ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.0.22.tar.bz2

2、alsa-driver 一些常见芯片的ALSA驱动代码,一般内核会集成.

        ftp://ftp.alsa-project.org/pub/firmware/alsa-firmware-1.0.20.tar.bz2

3、alsa-utils 一般ALSA小的测试工具.如aplay/arecord 播放和录音小程序

        ftp://ftp.alsa-project.org/pub/utils/alsa-utils-1.0.22.tar.bz2

4、alsa-oss 用alsa接口模拟旧的oss接口.

        ftp://ftp.alsa-project.org/pub/oss-lib/alsa-oss-1.0.17.tar.bz2

二、交叉编译

alsa-lib

1、源码下载

wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.0.22.tar.bz2

2、解压

tar -xf alsa-lib-1.0.22.tar.bz2

3、配置,主要指定主机和交叉编译工具链

cd alsa-lib-1.0.22/

CC="/opt/cluster-qt/2.5.3/sysroots/x86_64-sdrvsdk-linux/usr/bin/aarch64-sdrv-linux/aarch64-sdrv-linux-gcc --sysroot=/opt/cluster-qt/2.5.3/sysroots/aarch64-sdrv-linux"

./configure --host=aarch64 --prefix=/opt/alsa  --disable-python --enable-shared=yes --enable-static=no

make -j8 && sudo make install

解释:

     --prefix:后面install的目录,也就是编译出来后的文件所存放的目录。

     --enable-shared=yes --enable-static=no:动态编译还是静态编译

     --host:主机

     CC:交叉编译工具链

alsa-utils

./configure --prefix=$PWD/build/ --target=arm-linux --host=arm-linux \
--with-alsa-inc-prefix=/home/gui/gui/alsa-lib-1.2.11/build/include \
--with-alsa-prefix=/home/gui/gui/alsa-lib-1.2.11/build/lib \
 --disable-nls --disable-alsamixer --disable-xmlto \
 --enable-shared=no --enable-static=yes \
 CC=arm-linux-gcc 

三、查看声卡命令

# cat /proc/asound/card0/pcm0p/sub0/hw_params
access: MMAP_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 48000 (48000/1)
period_size: 16384
buffer_size: 32768

- `access: MMAP_INTERLEAVED`:表示以内存映射的方式访问音频设备。
- `format: S16_LE`:表示音频数据的格式为有符号16位整数(Little-Endian)。
- `subformat: STD`:表示音频数据的子格式为标准格式。
- `channels: 2`:表示音频设备支持的声道数为2。
- `rate: 48000 (48000/1)`:表示音频设备支持的采样率为48000Hz。
- `period_size: 16384`:表示每个周期的帧数大小。
- `buffer_size: 32768`:表示音频设备的缓冲区大小,即可容纳的最大帧数。

# cat /proc/asound/cards  //显示系统中的声卡信息

0 [x9refmachms4344]: x9-ref-mach-ms4 - x9-ref-mach-ms4344 x9-ref-mach-ms4344   

//声卡标识符为 "x9refmachms4344",声卡名称为 "x9-ref-mach-ms4344"

四、Over and Under Run

当调用snd_pcm_writei/snd_pcm_readi返回值-EPIPE时,这表明发生了underrun/overrun,
PCM音频流进入到XRUN状态。要从该状态中恢复过来的标准方法是调用snd_pcm_prepare()函数,把PCM流置于PREPARED状态。

五、编码流程

1、打开PCM设备
2、实例化hwparams对象
3、获取 PCM 设备当前硬件配置,对 hwparams 进行初始化
4、设置访问类型: 交错模式
5、设置数据格式: 有符号 16 位、小端模式
6、设置采样率
7、设置声道数: 双声道 
8、设置周期大小: period_size
9、设置周期数(驱动层 buffer 的大小): periods
10、使配置生效
11、读/写PCM设备
12、关闭PCM设备

六、代码例程

录音:点击跳转

放音:点击跳转

需要代做项目的可私信!!

觉得有帮助的话,打赏一下呗。。

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值