SSD_Tinyalsa/Alsa
使用说明
1. Tinyalsa¶
1.1. 简介¶
Tinyalsa = Tiny + ALSA(Advanced Linux Sound Architecture)
目前linux中主流的音频体系结构是ALSA,tinyalsa是ALSA的简化版,tinyalsa是一个轻量级的库,封装了内核的ALSA接口,用于简化用户空间的ALSA编程。
1.2. 使用Tinyalsa自带工具测试¶
1.2.1. Tinyalsa源代码¶
参考链接:https://github.com/tinyalsa/tinyalsa/tree/1.1.1。因tinyalsa-2.0.0版本,会在每次write数据之前都做一次pcm_state,造成alsa runtime的数据被修改,导致播放异常,禁止使用该版本。
参考链接:https://github.com/tinyalsa/tinyalsa/releases
可以看到目录结构utils
下包含tinymix.c
,tinypcminfo.c
,tinycap.c
,tinyplay.c
。
进入源码包最顶层目录,修改makefile,指定交叉编译工具链及编译器,如:
export ARCH = arm export CROSS_COMPILE = arm-linux-gnueabihf-sigmastar-9.1.0- export CC = $(CROSS_COMPILE)gcc
源码包最顶层目录执行make clean ; make
,即可在utils
目录下生成bin档,用于接下来的测试。
1.2.2. menuconfig内核配置以及打开sdk下mi_alsa模块开关¶
注:Tinyalsa需要的驱动有soundcore.ko
,snd.ko
,snd-timer.ko
,snd-pcm.ko
和mi_alsa.ko
。
-
内核配置
音频框架的配置需要Power Manager支持,配置如下:
Power management options ---> [*] De[*] Device power management core functionality /* 需要替换内核 */
make menuconfig
配置选项如下(编译成模块):Device Drivers ---> <M> Sound card support ---> /* 下一级目录下均不选择默认会生成soundcore.ko和snd.ko */ <M> Advanced Linux Sound Architecture ---> /* 会生成snd-pcm.ko,snd-pcm-oss.ko */ <M> OSS PCM (digital audio) API /* 会生成snd-timer.ko */ [*] [*] PCM timer interface
执行
make modules ; ls modules
即可查看编译生成的ko。 -
打开sdk下mi_alsa模块开关:
进入
project
目录,make menuconfig
,配置如下:Sdk Config ---> Interface Compile Config ---> [*] alsa
在interface目录下
make alsa
,即可在对应目录查看生成的mi_alsa.ko -
加载所有驱动
注:通过insmod方法要注意加载模块的顺序
insmod soundcore.ko insmod snd.ko insmod snd-timer.ko insmod snd-pcm.ko insmod mi_alsa.ko
1.2.3. 使用bin档测试¶
-
tinyplay播放测试
./tinyplay ./1_17/nearend.wav
-
tinycap录音测试
./tinycap cap_out.wav -D card 声卡,mi_alsa只支持声卡0 -d device 设备,与mi_audio device_id号相同 -c channels 通道数 -r rate 采样率 -b bits 位宽 -p period_size 一次中断的帧数 -n n_periods 周期数
-
tinymix设置和获取音量
./tinymix contents ./tintmix set 1 60 ./tinymix get 1
-
tinypcminfo查看pcm通道的相关信息
./tinypcminfo -D 0
2. Alsa¶
2.1. 简介¶
ALSA(Advanced Linux Sound Architecture),高级Linux声音架构。在内核设备驱动层,ALSA提供了alsa-driver(alsa的驱动程序);在应用层,ALSA提供了alsa-lib(应用程序调用的API函数),应用程序只需要调用alsa-lib提供的API(libasound.so),即可完成对底层音频硬件的控制,ALSA目前已成为Linux主流音频体系结构。alsa-utils是一些工具功能集合库(即alsa的应用程序),可用于录放音测试。
ALSA API可以分解成以下几个主要的接口:
-
控制接口
提供管理声卡注册和请求可用设备的通用功能
-
PCM接口
管理数字音频回放(playback)和录音(capture)的接口
-
Raw MIDI接口
支持MIDI(Musical Instrument Digital Interface),标准的电子乐器。
-
定时器(Timer)接口
为同步音频事件提供对声卡上时间处理硬件的访问。
-
时序器(Sequencer)接口
-
混音器(Mixer)接口
2.2. alsa-lib及alsa-utils移植¶
2.2.1. 准备工作¶
-
alsa-lib版本:alsa-lib-1.2.4.tar.bz2
参考链接:http://www.linuxfromscratch.org/blfs/view/svn/multimedia/alsa-lib.html
-
alsa-util版本:alsa-utils-1.2.4.tar.bz2
参考链接:http://www.linuxfromscratch.org/blfs/view/stable/multimedia/alsa-utils.html
-
arm平台:ipc_i6e demo板
2.2.2. 交叉编译及安装¶
下载源码并解压后,进入源码根目录:tar -xvf alsa-lib-1.2.4.tar.bz2
定义编译alsa的输出路径:
export ALSA_INSTALL_PATH=/customer/alsa-1.2.4/alsa_build export CC=arm-linux-gnueabihf-gcc export CXX=arm-linux-gnueabihf-g++
-
alsa-lib
-
配置
./configure --prefix=$ALSA_INSTALL_PATH/alsa/ --host=arm-linux --disable-aload --disable-rawmidi --disable-seq --disable-ucm --disable-alisp --disable-old-symbols --disable-python --enable-debug CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ --with-plugindir=$ALSA_INSTALL_PATH/alsa/lib --with configdir=$ALSA_INSTALL_PATH/alsa/etc
-
编译
make
-
安装编译好的文件
make install
重要配置项:
-
--host 指定编译器,这里指定为交叉编译器。
-
--prefix 指定编译后文件的安装路径,后续的安装命令会在该目录中创建 lib 和 include 两个目录
-
--with-configdir 指定 conf 文件的安装目录,该目录中对我们最有用的 alsa.conf ,此文件会被直接移植到你的目标系统中
-
--with-alsa-devdir 指定音频设备文件的目录。例如在/dev/snd
-
-
alsa-utils
-
配置
./configure --prefix=$ALSA_INSTALL_PATH/alsa-utils --host=arm-linux --with-curses=ncurses CC="arm-linux-gnueabihf-gcc -lasound -I$ALSA_INSTALL_PATH/alsa/include -L$ALSA_INSTALL_PATH/alsa/lib" --disable-xmlto --disable-alsamixer
-
编译
make
注:若编译失败,在配置时增加选项--disable-xmlto和--disable-nls
-
安装编译好的文件
make install
重要配置项:
-
--host 指定编译器,与 lib 的配置选项相同
-
--prefix 指定编译后文件的安装路径,与 lib 的配置选项相同
-
--with-alsa-inc-prefix用来指定alsa-lib编译好的文件的include目录
-
--with-alsa-prefix用来指定alsa-lib编译好的文件的lib目录
-
--disable-alsamixer alsamixer是图形化的amixer工具,可能会出现乱码,禁用
-
2.2.3. 使用alsa-utils下的bin档测试¶
-
将ALSA_INSTALL_PATH路径下文件拷贝至arm平台相同路径下
lib 和 utils 文件系统中,以下文件必须拷贝至目标板对应位置:
-
alsa-lib的库文件
cp /customer/alsa-1.2.4/alsa_build/alsa/lib/lib* 目标板路径(/lib或其他路径,其他路径需要添加动态库搜索路径)
通过环境变量LD_LIBRARY_PATH添加动态库搜索路径:export LD_LIBRARY_PATH=/customer/alsa -1.2.4/alsa_build/alsa/lib:$LD_LIBRARY_PATH
-
alsa配置文件
将$ALSA_INSTALL_PATH/alsa/etc下文件(alsa.conf, cards, pcm)拷贝至目标板完全相同的路径下:cp -r /customer/alsa-1.2.4/alsa_build/alsa/etc 目标板路径(/customer/alsa-1.2.4/alsa_build/alsa/)
-
-
将alsa-utils编译后在aplay路径下生成的bin档aplay拷贝至arm平台
注:该版本下aplay和arecord是一个文件,只要将aplay修改为arecord即可完成录音测试!
-
播放测试
./aplay ../../1_17/nearend.wav
-
录音测试
./arecord -Dhw:0,0 -r8000 -f S16_LE -c 2 ./1.wav -l 列出声卡和数字音频设备 -D 指定音频设备PCM -r 指定采样率 -f 指定采样格式 -c 单声道、立体声 -h 帮助
3. Alsa/Tinyalsa使用限制¶
3.1. AO(Playback)¶
-
Tinyalsa部分版本限制gain不能设负值,故将AO gain [-60, 30] mapping 至 [0, 90],如:-60→0,30→90。
-
若使用mi_alsa,Lineout不支持采样率12k、24k(alsa本身限制);所支持采样率:8k、11.025k、16k、22.05k、32k、44.1k、48k;Lineout支持1chn单声道或立体声。
-
Alsa/Tinyalsa上层暂时无法下I2S参数:eWorkmode、bSyncClock、eFmt、eMclk,使用I2S时会受限制。
3.2. AI(Capture)¶
-
默认gain为0,使用AI前需先设gain;采样率:8k、16k、32k、48k。
-
AI也仅支持录制1chn单声道或立体声,如Amic,Dmic等;I2S使用同样会受到限制。
3.3. MI_ALSA¶
-
目前mi_alsa仅支持一些简单的录音、播放功能,建议客户直接使用API接口,如有客户需要使用alsa,请向客户说明alsa的使用限制(如alsa-lib插件暂不支持等)。
-
后续计划mi_alsa架构会作较大更改,会尽量兼容和支持更多的场景和功能。