linux操作系统的声音设备编程实例

linux操作系统的声音设备编程实例

ID:27781900

大小:81.50 KB

页数:13页

时间:2018-12-06

linux操作系统的声音设备编程实例_第1页
linux操作系统的声音设备编程实例_第2页
linux操作系统的声音设备编程实例_第3页
linux操作系统的声音设备编程实例_第4页
linux操作系统的声音设备编程实例_第5页
资源描述:

《linux操作系统的声音设备编程实例》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、Linux操作系统的声音设备编程实例发布者:chinaitlab日期:2009-08-3100:00:00浏览次数:21(只•有0条评论)汽看评论

2、我要评论Linux卜的声音设备编程比大多数人想象的要简单得多。一般说来,我们常用的声音设备足内部扬声器和声卡,它们都对应/devn录下的一个或多个设备文件,我们象打开普通文件一样打开它们,用ioctl()函数设置一些参数,然后对这些打开的特殊文件进写操作。山于这些文件不是普通的文件,所以我们不能用ANSIC(标准C)的fopen、fclose等來操作文件,而应该使用系统文件I/O处理函数(open、read、write、Iseek

3、和close)来处理这與设备文件。ioctl()或许是Linux下最庞杂的函数,它可以控制各种文件的属性,在Linux声音设备编程屮,最重要的就是使用此函数正确设置必要的参数。下l&i我们举两个实际的例了•來说明如何实现Linux下的声音编程。由于此类编程涉及到系统设备的读写,所以,很多时候需要你有root权限,如果你将下而的例了编译P不能正确执行,那么,首先请你检杏是否是因为没有操纵某个设备的权限。对内部扬声器编程内部扬声器是控制台的一部分,所以它对应的设备文件为/dev/console。变呈KI0CSOUND在头文件/usr/include/linux/kd.h中声明,i

4、octl函数使用它可以来控制扬声器的发声,使用规则为:ioctl(fd,KIOCSOUND,(int)tone);fd为文件设备号,tone是音频值。当tone为0时,终止发声。必须一提的是它所理解的音频和我们乎常以为的音频是不同的,由于计算机主板定吋器的吋钟频率为1.19MHZ,所以要进行正确的发声,必须进行如T的转换:扬声器音频值=1190000/我们期望的音频值。扬声器发声吋间的长fe:我们通过函数usleep(unsignedlongusee)来校制。它是在尖文件/usr/include/unistd.h屮定义的,让程序睡眠usee微秒。下而即是让扬声器按指定的长度和

5、音频发声的程序的完整淸单:#include#include#include#include#include#include#include#include/*设定默认值*/#defineDEFAULT_FREQ440/*没定一个合适的频率*/#defineDEFAULT_LENGTH200/*200微秒,发声的长度是以微秒为单位的*/#defineDEFAULT_REPS1/*默认不重复发声*/#defin

6、eDEFAULT_DELAY100/*同样以微秒为单位*//*定义一个结构,存储所需的数据*/typedefstruct{intfreq;/*我们期望输出的频率,单位为Hz*/intlength;/*发声长度,以微秒为单位*/intreps;/*重复的次数*/intdelay;/*两次发声间隔,以微秒为单位*/}beep_parms_t;/*打印帮助信息并退出*/voidusage_bail(constchar*executable_name){printf(••Usage:t%s[-ffrequency][-Ilength][-rreps][-ddelay]•’,

7、executable_name);exit(1);/*分析运行参数,各项意义如下:*”-f<以HZ为单位的频率值>”*<以毫秒为单位的发声时K>”*"-r<重复次数>”*”-d<以毫秒为单位的间歇时长〉”*/voidparse_command_line(char**argv,beep_parms_t*result){char*argO=*(argv++);while(*argv){if(!strcmp(*argv,"-f")){/*频率*/intfreq=atoi(*(++argv));if((freq<=0)

8、

9、(freq>10000)){fprintf(stderr,”巳

10、adparameter:frequencymustbefrom1..10000n);exit(1);}else{result->freq=freq;argv++;}}elseif(!strcmp(*argv,"-I")){/*时长*/intlength=atoi(*(++argv));if(length<0){fprintf(stderr,’’Badparameter:lengthmustbe>=0”);exit(1);}else{result->length=length;argv++;}}e

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。