ALSA安装编程指南
ALSA全指南
一、什么是ALSA
ALSA是Advanced
Linux Sound Architecture,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDI(MusicalInstrument
Digital Interface,音乐设备数字化接口)的支持。在2.6系列内核中,ALSA已经成为默认的声音子系统。用来替换2.4系列内核中的OSS(Open
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
Interface有I2S和AC97两种。当中,I2S多用与嵌入式设备上的声音传输数据,而AC97接口则多见于传统PC。这两种接口有什么不同呢?这里暂且搁置不谈。对声音程序的开发人员来说,跟重要的是理解Audio
Inferface的概念而非细节。细节就留给硬件project师和驱动开发人员吧。
在计算机内部,声音被表示成为字节流(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程序的结构很easy。
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的体系结构 †
上图之中,Control和PCM部分是理解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安装编程指南的更多相关文章
- OpenGL编程指南(第七版)
OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...
- iOS多线程编程指南(二)线程管理
当应用程序生成一个新的线程的时候,该线程变成应用程序进程空间内的一个实体.每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片.一个线程可以和其他线程或其他进程通信,执行I/O操作,甚至执行任何 ...
- Linux音频编程指南
Linux音频编程指南 虽然目前Linux的优势主要体现在网络服务方面,但事实上同样也有着非常丰富的媒体功能,本文就是以多媒体应用中最基本的声音为对象,介绍如何在Linux平台下开发实际的音频应用程序 ...
- 物联网操作系统HelloX应用编程指南
HelloX操作系统应用编程指南 HelloX应用开发概述 可以通过三种方式,在HelloX操作系统基础上开发应用: 1. 以内部命令方式实现应用,直接编译链接到HelloX的内核she ...
- (转载)JDOM/XPATH编程指南
JDOM/XPATH编程指南 本文分别介绍了 JDOM 和 XPATH,以及结合两者进行 XML 编程带来的好处. 前言 XML是一种优秀的数据打包和数据交换的形式,在当今XML大行于天下,如果没有听 ...
- 海康SDK编程指南(C#二次开发版本)
海康SDK编程指南 目前使用的海康SDK包括IPC_SDK(硬件设备),Plat_SDK(平台),其中两套SDK都需单独调用海康播放库PlayCtrl.dll来解码视频流,返回视频信息和角度信息.本文 ...
- 高级Bash脚本编程指南(27):文本处理命令(三)
高级Bash脚本编程指南(27):文本处理命令(三) 成于坚持,败于止步 处理文本和文本文件的命令 tr 字符转换过滤器. 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出 ...
- Linux音频编程指南(转)
转自: http://www.ibm.com/developerworks/cn/linux/l-audio/ Linux音频编程指南 虽然目前Linux的优势主要体现在网络服务方面,但事实上同样也有 ...
- 《CUDA并行程序设计:GPU编程指南》
<CUDA并行程序设计:GPU编程指南> 基本信息 原书名:CUDA Programming:A Developer’s Guide to Parallel Computing with ...
随机推荐
- RT3070 USB WIFI 在连接socket编程过程中问题总结
最近耗时多天,成功的将RT3070驱动.并解决了socket的网络编程,成功的在BA9G10上面实现了USB wif.连上家里的无线路由器,通过ubuntu下面建立的服务端程序,将BA9G10中的数据 ...
- MySQL查看连接数
MySQL查看连接数 1.查看部分连接数(数目较多时) show processlist; 2.查看所有连接数(数目较多时) show full processlist;
- VB.NET<机房收费系统个人重构版>你都学会了什么(之五)
接着上篇我们说的配置文件,今天我们来说一下接口. 1.UML图 2.三层架构 3.Sqlhelper 4.配置文件 5.接口 6.设计模式 什么是接口呢?我们可以将接口理解为用于沟通的中介的抽象化.可 ...
- firebug使用
查看网页的header是优化web应用的关键一环,从header中,可以检查到非常 多的信息:网页在squid中的缓存时间(age).客户端缓存时间(expires).是否有最后修改时间(last-m ...
- phing用户手册第四章Getting Started译文
本章是phing的入门篇,查看 原文请猛击这里. XML And Phing 一个合法的Phing构建文件有以下几部分构成: 1.文档序言 2.唯一的根元素<project> 3.一些Ph ...
- Spring3.0官网文档学习笔记(一)
Part 1 Spring框架概述 Spring是模块化的,在应用中仅仅须要引入你所须要用到的模块的jar包,其余的jar包不用引入. spring框架支持声明式的事务管理,通过RMI或web ser ...
- 函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网
函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网 函数式编程很难,这正是你要学习它的原因 156 次分享 新浪微博 腾讯微博 Tweet 人人网 QQ空间 很奇怪不是,很少有人每天都使用函数 ...
- Python基础 - 内建函数
什么是内建函数 在Python的手册中,名叫build-in Functions,中文可以称为内建函数. 内建函数就像dos系统的内部命令,他不依赖于外部模块,也就是说: 内建函数就是:安装好Pyth ...
- 为什么php时间阅读RTF,p标签会出现红色
为什么php读取富文本的时候,p标签会出现红线,怎么去掉,哪位大侠帮解决?跪求答案 就像以下一样,一遇到p标签就有红虚线 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- AC自动机---个人总结
比较好的 AC自动机算法详解.. [转]http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 个人总结:[图是盗用的..] ac自动机 ...