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.kosnd.kosnd-timer.kosnd-pcm.komi_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可以分解成以下几个主要的接口:

  1. 控制接口

    提供管理声卡注册和请求可用设备的通用功能

  2. PCM接口

    管理数字音频回放(playback)和录音(capture)的接口

  3. Raw MIDI接口

    支持MIDI(Musical Instrument Digital Interface),标准的电子乐器。

  4. 定时器(Timer)接口

    为同步音频事件提供对声卡上时间处理硬件的访问。

  5. 时序器(Sequencer)接口

  6. 混音器(Mixer)接口


2.2. alsa-lib及alsa-utils移植

2.2.1. 准备工作


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

    1. 配置

      ./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
      
    2. 编译

      make
      
    3. 安装编译好的文件

      make install
      

    重要配置项:

    1. --host 指定编译器,这里指定为交叉编译器。

    2. --prefix 指定编译后文件的安装路径,后续的安装命令会在该目录中创建 lib 和 include 两个目录

    3. --with-configdir 指定 conf 文件的安装目录,该目录中对我们最有用的 alsa.conf ,此文件会被直接移植到你的目标系统中

    4. --with-alsa-devdir 指定音频设备文件的目录。例如在/dev/snd

  • alsa-utils

    1. 配置

      ./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
      
    2. 编译

      make
      

      注:若编译失败,在配置时增加选项--disable-xmlto和--disable-nls

    3. 安装编译好的文件

      make install
      

    重要配置项:

    1. --host 指定编译器,与 lib 的配置选项相同

    2. --prefix 指定编译后文件的安装路径,与 lib 的配置选项相同

    3. --with-alsa-inc-prefix用来指定alsa-lib编译好的文件的include目录

    4. --with-alsa-prefix用来指定alsa-lib编译好的文件的lib目录

    5. --disable-alsamixer alsamixer是图形化的amixer工具,可能会出现乱码,禁用


2.2.3. 使用alsa-utils下的bin档测试

  1. 将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/)

  2. 将alsa-utils编译后在aplay路径下生成的bin档aplay拷贝至arm平台

    注:该版本下aplay和arecord是一个文件,只要将aplay修改为arecord即可完成录音测试!

  3. 播放测试

    ./aplay  ../../1_17/nearend.wav
    
  4. 录音测试

    ./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架构会作较大更改,会尽量兼容和支持更多的场景和功能。