Linux平台下的ALSA声音编程-最新资料 下载本文

Linux平台下的ALSA声音编程

ALSA Audio Programming Under the Linux Platform Liu Shi,Li huaizhou,Zhao Xuegong

(School of Optoelectronic Information,University of Electronic Science&Technology,Chengdu610054,China) :linux 2.6 kernel with a new sound programming API,this paper show the ALSA audio subsystem,described in detail PCM interface of ALSA system,and based on which the recording,playback,full-duplex audio programming. Keywords:Linux 2.6;AlSA;PCM;Audio programming ALSA(Advanced Linux Sound Architecture)是由内核驱动,标准的API库和一系列实用程序组成。Linux 2.6内核抛弃了旧的OSS,ALSA被合并到了内核中。 一、ALSA基础

ALSA由许多声卡的声卡驱动程序组成,同时它也提供一个称为libasound的API库。应用程序开发者应该使用libasound而不是内核中的ALSA接口。因为libasound提供高级且编程方便的编程接口。为了向后兼容,ALSA提供内核模块来模拟OSS。ALSA包含插件功能来扩展新的声卡驱动。 (一)ALSA接口

1.控制接口:用来管理已注册的声卡并检查其可用的设备。

2.PCM接口:用来管理数字音频的录音和回放,这是一个用的最广的接口。

3.原始MIDI接口:支持标准MIDI,提供了访问声卡MIDI的接口。

4.时间接口:用来声卡的计时声音事件的同步。 5.Sequencer接口:高级MIDI和声音合成接口,可以处理更多的MIDI协议。

6.混音接口:用来声卡设备的信号处理和音量,建立在控制接口之上。

(二)设备命名

API库使用逻辑设备名而不是设备文件。设备名字可以是真实的硬件名字也可以是插件名字。硬件名使用hw:i,j格式。其中i是卡号,j是这块声卡上的设备号。插件使用另外的唯一名,如plughw:0,0。 (三)声音缓存

每个声卡都有一个硬件缓存区来保存记录的样本。当缓存区足够满时,声卡将产生一个中断。内核声卡驱动使用直接内存(DMA)访问通道将样本传送到内存中的应用程序缓存区。对于回放,应用程序使用DMA将自己的缓存区数据传送到声卡的硬件缓存区中。

硬件缓存区是环缓存。ALSA维护一个指针来指向硬件和应用程序缓存区中数据操作的当前位置。本文只讨论应用程序缓存

区。

应用程序缓存区的大小可以通过调用库函数来控制。ALSA将缓存区分成一系列周期(period)。一个周期存储一些帧(frames)。每一帧包含时间上一个点所抓取的样本。对于立体声设备,一个帧包含两个通道上的样本。左右通道信息被交替地存储在一个帧内称为交错模式。在非交错模式中,一个通道的所有样本存储在另一个通道的数据之后。如图1示。 (四)参数

1.样本长度(sample):样本是记录音频数据最基本的单位,如8位或16位。

2.通道数(channel):1表示单声道,2则是立体声。 桢(frame):桢记录了一个声音单元,长度为样本长度与通道数的乘积。

3.采样率(rate):每秒钟采样次数,该次数是针对桢而言。 4.周期(period):音频设备一次处理所需要的桢数。 二、应用程序编程

一个典型的ALSA的PCM接口应用程序可以用一下伪代码来描述:

open_the_device();//打开设备

set_the_parameters_of_the_device();//设置参数(访问模式,数据格式,通道数,采样率,等) while(有数据要被处理)