Tinyalsa/Alsa使用说明


1. Tinyalsa


1.1. 简介

Tinyalsa = Tiny + ALSA(Advanced Linux Sound Architecture)

目前linux中主流的音频体系结构是ALSA,tinyalsa是ALSA的简化版,tinyalsa是一个轻量级的库,封装了内核的ALSA接口,用于简化用户空间的ALSA编程。


1.2. 使用Tinyalsa自带工具测试

  1. Tinyalsa源代码

    下载链接: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档,用于接下来的测试。

  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
      
  3. 使用bin档tinyplay,tinycap,tinymix,tinypcminfo测试

    tinyplay播放测试:./tinyplay ./1_17/nearend.wav

    tinycap录音测试: ./tinycap cap_out.wav

    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移植

  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_Pudding demo板

  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工具,可能会出现乱码,禁用

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

    将ALSA_INSTALL_PATH路径下文件拷贝至arm平台相同路径下

    lib 和 utils 文件系统中,以下文件必须拷贝至目标板对应位置:

    1. 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

    2. 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 帮助