一、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设备
六、代码例程
录音:点击跳转
放音:点击跳转
需要代做项目的可私信!!
觉得有帮助的话,打赏一下呗。。