首页 > 其他 > 详细

ALSA安装编程指南

时间:2014-06-08 18:22:17      阅读:523      评论:0      收藏:0      [点我收藏+]


ALSA全指南

一、什么是ALSA

ALSAAdvanced Linux Sound Architecture,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDIMusicalInstrument Digital Interface,音乐设备数字化接口)的支持。在2.6系列内核中,ALSA已经成为默认的声音子系统,用来替换2.4系列内核中的OSSOpen Sound System,开放声音系统)。

GNU/Linux系统下三大主流声卡驱动程序集:OSS/Lite(也成OSS/free)OSS/full(商业软件)ALSA(自由软件)。

二、历史

ALSA项目发起的起因是Linux下的声卡驱动(OSS/Free drivers)没有得到积极的维护。并且落后于新的声卡技术。Jaroslav Kysela早先写了一个声卡驱动,并由此开始了ALSA项目,随便,更多的开发者加入到开发队伍中,更多的声卡得到支持,API的结构也得到了重组。

Linux内核2.5在开发过程中,ALSA被合并到了官方的源码树中。在发布内核2.6后,ALSA已经内建在稳定的内核版本中并将广泛地使用。

 在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。

三、硬件基础

通常常见的声卡都可以抽象出几个部分

  • 输入设备:比如麦克风(模拟/电子),从其他音响设备结果来的LINE IN

  • ADC:模拟信号到数字信号转换器;声卡可以处理的信号是数字信号,当有输入进入声卡时,输入通常是模拟信号,比如传统的麦克风给出的信号就是模拟信号,这是就需要ADC将模拟信号转换成声音信号;

  • 信号处理和控制核心:这部分是声卡的核心,一般由一个或者多个codec实现;

  • DAC:数字信号到模拟信号的转换器;它的功能就是将处理好的数字信号转化成模拟信号;

  • MIXER:俗称混音器;这个设备主要的功能是将不同输入来源的声音信号混合起来并且转发到不同的输出设备上去;比如,想象一下一边听音乐一边音频聊天的情景,混音器需要将从麦克风过来的语音内容和播放器传说过来的音乐混合起来转发到耳机上;而当耳机拔出脱离声卡时,混音器需要将声音信号转发的计算机的喇叭上去;等等;

  • 输出设备:喇叭,LINE OUT和麦克风都是输出设备;放大器也可以被看作输出设备,通常放大器不需要软件控制,也就是不需要有驱动程序就可以动作;放大器的主要功能就是将声音信号放大,增加响度等等。

Audio Interface 

Audio Interface主要是指可以将声音数据从计算机中传入传出的接口。常见的Audio InterfaceI2SAC97两种。其中,I2S多用与嵌入式设备上的声音数据传输,而AC97接口则多见于传统PC。这两种接口有什么不同呢?这里暂且搁置不谈。对声音程序的开发者来说,跟重要的是理解Audio Inferface的概念而非细节。细节就留给硬件工程师和驱动开发者吧。

在计算机内部,声音被表示成为字节流(stream bit),与其他类型的数据并没有差异。而在计算机的外部世界,通常,声音可以被表示成为数字形式(一个或这多个字节流)或者模拟形式(按照时间表示的电压变化)。Audio Interface的主要任务就是将计算机内部外部世界的不同数据类型进行转化。Audio Inferface的构成当然和它的功能有着必然的联系。当声音通过Audio Inferface传入计算机内部时,经过转化的数据(字节)将被暂时存储在一个硬件上的缓冲区中,当缓冲区已满,Audio Interface就会触发一个中断,要求CPU协调将数据从缓冲区移动到适当的地方去,通常,这种数据移动都是以DMA的方式进行,而且,通常数据移动的目的地就是主存。

                 +---------------------------------+
                 |Audio         +----------------+ |
Audio Signal ----|Interface-----+ HW BUFFER      | |
                 |              +----------------+ |
                 +---------------------------------+

将数据从计算机传出的过程于此类似,只是方向正好相反,中断触发的时机也不同。Audio Interface会在硬件缓冲区被搬走后清空的情况下触发终端,要求CPU协调传送新的数据进入缓冲区。

从上面的描述就可以看出,Audio Interface有几个要素需要开发者注意。

  • 数据转换的格式;

  • 数据转换的速率;

  • 需要多少数据/空闲空间来触发中断;

  • 硬件缓冲区的大小;

以上要素中,前两个决定了声音信号/数据的质量,而后两者决定了延迟。一般延迟有输入延迟输出延迟两种。输入延迟指的是数据开始传输进入硬件缓冲区的时刻和CPU得到完成数据移动的那个时刻之间的时间差;输出延迟与次类似,方向相反。

四、ALSA程序的结构

ALSA程序的结构非常简单。

open_the_device(); /* 打开声音输入/输出设备 */
set_the_parameters_of_the_device(); /* 设置该设备的参数,最终要的就是前文提到的四个参数 */
while(!done) {
  /* one or both of these */
  receive_audio_data_from_the_dev(); /* 从设备接收数据 */
  deliver_audio_data_to_the_dev(); /* 向设备发送数据 */
}
close_the_device(); /* 关闭声音输入输出设备 */

五、与ALSA相关的资源 

ALSA项目的主页

http://www.alsa-project.org/main/index.php/Main_Page

这里是ALSA相关的所有内容的源头,包括代码和文档,如果想要弄懂声音如何在Linux中工作,狠狠扎进这一堆财富里面吧!

 

ALSA的体系结构 ?

bubuko.com,布布扣

上图之中,ControlPCM部分是理解ALSA如何工作的关键。

六、ALSA安装

ALSA项目主页,下载资源,alsa-lib-1.0.27.2alsa-utils-1.0.27.2

进行安装:  

./configure;make;make install

安装后ldconfig一下。安装需要root权限

七、使用与编译

这一步很少有文章说,所以我也是找了好一会,才弄好的。

程序必须链接到alsalib库,通过在编译时需要加上-lasound选项。有些alsa库函数使用dlopen函数以及浮点操作,所以您可能还需要加上-ldl,-lm选项。

可以采用下面的Makefile文件编译。(使用的时候注意makefile中命令前缩进是Tab)

CC=gcc
TARGET=test
SRC=$(wildcard *.c)
OBJECT= ${SRC:.c=.o}
INCLUDES=-I/usr/include/alsa
LDFLAGS=-lasound
all:$(TARGET)
$(OBJECT):$(SRC)

        $(CC)-c $(INCLUDES) $<
$(TARGET):$(OBJECT)

        $(CC)-o $@ $< $(LDFLAGS)
.PHONY:clean
clean:
        @rm-rf $(OBJECT) $(TARGET) *~

 

 

八、编程

这部分网上资料与ALSA项目主页都有。

特别是A tutorial on using the ALSA Audio API里也有很多例子

 



ALSA安装编程指南,布布扣,bubuko.com

ALSA安装编程指南

原文:http://blog.csdn.net/guo8113/article/details/28660837

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!