ALSA应用开发

本文详细介绍了Linux下ALSA(AdvancedLinuxSoundArchitecture)的音频应用开发,包括音频相关概念如采样频率和量化位数,ALSA的架构和库的编译移植,以及如何使用amixer、aplay和arecord等工具进行调试。同时,文章还展示了基于ALSA的音量控制和音频播放、录制程序的设计思路与实现。

ALSA应用开发



音频相关概念

音频信号是一种连续变化的模拟信号,但计算机只能处理和记录二进制的数字信号,由自然音源得到的音频信号必须经过一定的变换,成为数字音频信号之后,才能送到计算机中作进一步的处理。

数字音频系统通过将声波的波型转换成一系列二进制数据,来实现对原始声音的重现,实现这一步骤的设备常被称为(A/D)。A/D转换器以每秒钟上万次的速率对声波进行采样,每个采样点都记录下了原始模拟声波在某一时刻的状态,通常称之为样本(sample),而每一秒钟所采样的数目则称为采样频率,通过将一串连续的样本连接起来,就可以在计算机中描述一段声音了。对于采样过程中的每一个样本来说,数字音频系统会分配一定存储位来记录声波的振幅,一般称之为采样分辩率或者采样精度,采样精度越高,声音还原时就会越细腻。

在这里插入图片描述

数字音频涉及到的概念非常多,对于在Linux下进行音频编程的程序员来说,最重要的是7406解声音数字化的两个关键步骤:采样和量化。

  • 采样就是每隔一定时间就读一次声音信号的幅度,从本质上讲,采样是时间上的数字化。
  • 量化则是将采样得到的声音信号幅度转换为数字值,从本质上讲,量化则是幅度上的数字化。

采样频率

采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数。采样频率的选择应该遵循奈奎斯特(Harry Nyquist)采样理论:如果对某一模拟信号进行采样,则采样后可还原的最高信号频率只有采样频率的一半,或者说只要采样频率高于输入信号最高频率的两倍,就能从采样信号系列重构原始信号。

在这里插入图片描述

如上图所示 用40KHz的频率去采样20KHz的信号可以正确捕捉到原始信号。用30KHz的频率去采样20KHz的信号会出现混淆信号。​ 一般重建音乐信号时采用的最低采样频率为44.1KHz。在许多高品质的系统中,采用的48KHz的采样频率。

系统 采样频率
电话 8000Hz
CD 44100Hz
专业音频 48000Hz
DVD音频 96000Hz

量化位数

量化位数是对模拟音频信号的幅度进行数字化,它决定了模拟信号数字化以后的动态范围,常用的有8位、12位和16位。量化位越高,信号的动态范围越大,数字化后的音频信号就越可能接近原始信号,但所需要的存贮空间也越大。

音频应用中常用的数字表示方法为脉冲编码调制(Pulse-Code-ModulatedPCM)信号。在这种表示方法中,每个采样周期用一个数字电平对模拟信号的幅度进行编码。得到的数字波形是一组采样自输入模拟波形的近似值。由于所有A/D转换器的分辨率都是有限的,所以在数字音频系统中,A/D转换器带来的量化噪声是不可避免的。

在这里插入图片描述

ALSA架构

ALSA全称是Advanced Linux Sound Architecture,中文音译是Linux高级声音体系。ALSA 是Linux内核2.6后续版本中支持音频系统的标准接口程序,由ALSA库、内核驱动和相关测 试开发工具组成,更好的管理Linux中音频系统。

本小节将介绍ALSA的架构

ALSA架构介绍

ALSA是Linux系统中为声卡提供驱动的内核组件。它提供了专门的库函数来简化相应应用程序的编写。相较于OSS的编程接口,ALSA的函数库更加便于使用。

对应用程序而言ALSA无疑是一个更佳的选择,因为它具有更加友好的编程接口,并且完全兼容于OSS。

ALSA系统包括7个子项目:

  • 驱动包alsa-driver
  • 开发包alsa-libs
  • 开发包插件alsa-libplugins
  • 设置管理工具包alsa-utils
  • OSS接口兼容模拟层工具alsa-oss
  • 特殊音频固件支持包alsa-finnware
  • 其他声音相关处理小程序包alsa-tools

ALSA声卡驱动与用户空间体系结构交互如下图所示:

在这里插入图片描述

移植ALSA库及工具

移植ALSA主要是移植alsa-Ub和alsa-utils。alsa-lib:用户空间函数库, 封装驱动提供的抽象接口, 通过文件libasound.so提供API给应用程序使用。alsa-utils:实用工具包,通过调用alsa-lib实现播放音频(aplay)、录音(arecord) 等工具。

在这里插入图片描述

ALSA Util是纯应用层的软件,相当于ALSA设备的测试程序,ALSA-Lib则是支持应用API的中间层程序,ALSA-Util中的应用程序中会调用到ALSA-Lib中的接口来操作到我们的音频编解码芯片的寄存器,而lib中接口就是依赖于最底层驱动代码,因此移植ALSA程序的顺序就是先后移植Driver,Lib,Util。

ALSA库下载

ALSA首先需要在ALSA的官网上下载官网http://www.alsa-project.org下载alsa-lib和alsa-utils。

在这里插入图片描述>如上图所示我们下载的版本为:

  • alsa-lib-1.2.2.tar.bz2
  • alsa-utils-1.2.2.tar.bz2

ALSA Lib编译

ALSA Lib移植不需要修改源码,只需要重新编译库代码以支持自己的平台。

tar -xvf alsa-lib-1.0.27.2.tar.bz2 
cd alsa-lib-1.0.27.2  
CC=arm-none-linux-gnueabi-gcc
./configure --host=arm-linux  --prefix=/home/m/3rd/alsa/install/  
make  
make install

在上述命令中./configure配置的几个重要的配置选项解释如下:

  • –host指定编译器,这里指定为交叉编译器,运行本配置命令前务必保证编译器已经可以在Shell下可以直接执行了。
  • –prefix指定编译后文件的安装路径,这样安装命令就还会指定的这个目录中创建lib和include两个目录。
ALSA Util编译

ALSA Util可以生成用于播放,录制,配置音频的应用可执行文件,测试驱动代码时用处很大,编译过程如下:

tar -xvf alsa-utils-1.0.27.2.tar.bz2  
cd alsa-utils-1.0.27.2  
CC=arm-none-linux-gnueabi-gcc 
./configure --prefix=/home/m/3rd/alsa/install/ --host=arm-linux --with-alsa-inc-prefix=/home/m/3rd/alsa/install/include --with-alsa-prefix=/home/m/3rd/alsa/install/lib --disable-alsamixer --disable-xmlto --disable-nls  
make  

ALSA库和工具移植入嵌入式平台

ALSA库和测试工具的移植就是将相应库文件和可执行文件放在目标板上,以下文件 必须被拷贝至对应位置 :

  1. ALSA Lib文件,放在/lib/中。
  2. 配置文件放在/usr/local/share中,与编译时指定的目录相同。
  3. 测试应用文件,ALSA Util能产生aplay、amixer、arecord,我们可以把这些可执行文件放在/usr/sbin中。
  4. 内核目录中保证有/dev/snd/目录,这个目录下存放controlC0,pcmC0D0,/usr/sbintimer,timer这些设备文件,如果这些设备文件已经在/dev目录下,可手动拷贝到/snd目录中。

在LINUX系统中,每个设备文件都是文件。音频设备也是一样,它的设备文件被放在/dev/snd目录下,我们来看下这些设备文件:

ls /dev/snd -l
crw-rw----+ 1 root audio 116,  2 519 21:24 controlC0     用于声卡的
crw-rw----+ 1 root audio 116,  4 66 19:31 pcmC0D0c
crw-rw----+ 1 root audio 116,  3 611 11:53 pcmC0D0p
crw-rw----+ 1 root audio 116, 33 519 21:24 timer
  1. controlC0:音频控制设备文件,例如通道选择,混音,麦克风的控制等;
  2. pcmC0D0c:声卡0设备0的录音设备,c表示capter;
  3. pcmC0D0p:声卡0设备0的播音设备,p表示play;
  4. timer:定时器设置。

ALSA的调试

这里将着重讲解tinyalsa工具使用,tinyalsa 是 alsa-lib 的一个简化版。它提供了 pcm 和 control 的基本接口;没有太多太复杂的操作、功能。可以按需使用接口。 tinyalsa-utils 是基于 tinyalsa 的一些工具,下面对几个常用的工具作介绍。

amixer

与 amixer 作用类似,用于操作 mixer control。

使用方法:

  • 常用选项
选项 功能 备注
-D,–device 指定声卡设备, 默认使用card0
  • 常用命令
命令 功能 备注
controls 列出指定声卡的所有控件
contents 列出指定声卡的所有控件的具体信息
get 获取指定控件的信息
set 设定指定控件的值

举例:

获取audiocodec声卡的所有控件名
amixer -Dhw:audiocodec controls
获取当前硬件音量
amixer -Dhw:audiocodec cget name='LINEOUT volume'
设置当前硬件音量
amixer -Dhw:audiocodec cget name='LINEOUT volume' 25 

aplay

aplay 是命令行的 ALSA 声卡驱动的播放工具,用于播放功能。 使用方法:

选项 功能 备注
-D,–device 指定声卡设备, 默认使用 default
-l,–list-devices 列出当前所有声卡
-t,–file-type 指定播放文件的格式, 如 voc,wav,raw, 不指定的情况下会去读取文件头部作识别
-c,–channels 指定通道数
-f,–format 指定采样格式
-r,–rate 采样率
-d,–duration 指定播放的时间
–period-size 指定 period size
–buffer-size 指定 buffer size

举例:

aplay -Dhw:audiocodec /mnt/UDISK/test.wav

arecord

arecord 是命令行的 ALSA 声卡驱动的录音工具,用于录音功能。 使用方法:

选项 功能 备注
-D,–device 指定声卡设备, 默认使用 default
-l,–list-devices 列出当前所有声卡
-t,–file-type 指定播放文件的格式, 如 voc,wav,raw, 不指定的情况下会去读取文件头部作识别
-c,–channels 指定通道数
-f,–format 指定采样格式
-r,–rate 采样率
-d,–duration 指定播放的时间
–period-size 指定 period size
–buffer-size 指定 buffer size

举例:

录制5s,通道数为2, 采样率为16000, 采样精度为16bit, 保存为wav文件
arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 -d 5 /mnt/UDISK/test.wav

常用接口说明

从代码角度体现了alsa-libalsa-driverhardwared的交互关系。用户层的alsa-lib通过操作alsa-driver创建的设备文件/dev/snd/pcmC0D0p等对内核层进行访问。内核层的alsa-drivier驱动再经由sound core对硬件声卡芯片进行访问。

在这里插入图片描述

PCM接口

为了方便操作访问, alsa-lib 中封装了相关接口, 通过 pcmCXDXp/pcmCXDXc 节点 (/dev/snd/pcmCXDXx) 去实现播放、录音功能。

主要涉及到的接口:

选项 功能 备注
snd_pcm_open
snd_pcm_info
snd_pcm_hw_params_any
snd_pcm_hw_params_set_access
snd_pcm_hw_params_set_format
snd_pcm_hw_params_set_channels
snd_pcm_hw_params_set_rate_near
snd_pcm_hw_params_set_buffer_size_near
snd_pcm_hw_params
snd_pcm_sw_params_current
snd_pcm_sw_params
snd_pcm_readi
snd_pcm_writei
snd_pcm_close

基于ALSA的音量控制程序设计

程序设计

  • 文件列表:
序号 文件名 描述 备注
1 AlsaVolume.h 音量控制头文件
2 AlsaVolume.cpp 音量控制程序
  • 成员函数设计:
序号 函数名 参数 参数描述 函数描述 备注
1 setMasterVolume long volume 音量值 设置音量
2 getCurrentVolume 获取当前音量
3 increaseVolume 单步减小音量接口函数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值