论文部分内容阅读
摘要:linux 2.6内核采用了全新的声音编程API,本文介绍了ALSA音频子系统,详细阐述了ALSA系统的PCM接口,以及基于其上的录音,回放,全双工的音频编程方法。
关键词:Linux 2.6;ALSA;PCM;声音编程
中图分类号:TP311文献标识码:A文章编号:1007-9599 (2011) 06-0000-01
ALSA Audio Programming Under the Linux Platform
Liu Shi,Li huaizhou,Zhao Xuegong
(School of Optoelectronic Information,University of Electronic Science&Technology,Chengdu610054,China)
Abstract: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(有数据要被处理)
{
receive_audio_data_from_the_device()或deliver_audio_data_to_the_device();
}
close the device;//关闭接口
全双工音频:在过去的OSS编程中可直接对/dev/dsp设备进行读写即可实现此过程,而ALSA则显得有点麻烦。整个过程可分为两步:
1.打开设备并设置参数:在我们选择硬件的时候最好选择plughw:0,0。除非我们要用到4声道时我们才选择hw:0,0设备。
2.录放循环:录音-处理-播放,我们首先要丢弃所有的输出缓存,并准备好PCM设备。然后进入录放循环过程。
三、结束语
本文介绍了Linux下的ALSA声音编程,对Linux音频编程具有一定的指导意义。
参考文献:
[1]Jeff Tranter.Introduction to Sound Programming with ALSA[J].LINUX JOURNAL,2004,9
[2]Matthias Nagorni.ALSA Programming HOWTO,2010,2
[3]肖文鹏.Linux音频编程指南,2004,2
[作者简介]刘士(1986-),安徽亳州人,在读硕士研究生,专业:电路与系统,研究方向:Linux嵌入式系统;李怀周(1986-),河南新乡人,在读硕士研究生,专业:电路与系统,研究方向:Linux嵌入式系统;赵学功(1986-),河南商丘人,在读硕士研究生,专业:电路与系统,研究方向:复杂电路系统。
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文
关键词:Linux 2.6;ALSA;PCM;声音编程
中图分类号:TP311文献标识码:A文章编号:1007-9599 (2011) 06-0000-01
ALSA Audio Programming Under the Linux Platform
Liu Shi,Li huaizhou,Zhao Xuegong
(School of Optoelectronic Information,University of Electronic Science&Technology,Chengdu610054,China)
Abstract: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(有数据要被处理)
{
receive_audio_data_from_the_device()或deliver_audio_data_to_the_device();
}
close the device;//关闭接口
全双工音频:在过去的OSS编程中可直接对/dev/dsp设备进行读写即可实现此过程,而ALSA则显得有点麻烦。整个过程可分为两步:
1.打开设备并设置参数:在我们选择硬件的时候最好选择plughw:0,0。除非我们要用到4声道时我们才选择hw:0,0设备。
2.录放循环:录音-处理-播放,我们首先要丢弃所有的输出缓存,并准备好PCM设备。然后进入录放循环过程。
三、结束语
本文介绍了Linux下的ALSA声音编程,对Linux音频编程具有一定的指导意义。
参考文献:
[1]Jeff Tranter.Introduction to Sound Programming with ALSA[J].LINUX JOURNAL,2004,9
[2]Matthias Nagorni.ALSA Programming HOWTO,2010,2
[3]肖文鹏.Linux音频编程指南,2004,2
[作者简介]刘士(1986-),安徽亳州人,在读硕士研究生,专业:电路与系统,研究方向:Linux嵌入式系统;李怀周(1986-),河南新乡人,在读硕士研究生,专业:电路与系统,研究方向:Linux嵌入式系统;赵学功(1986-),河南商丘人,在读硕士研究生,专业:电路与系统,研究方向:复杂电路系统。
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文