尽我能力帮助他人,在帮助他人的同时你会深刻巩固知识。
应干系就能够了。我如今还记得之前在DOS下编写出《世上只要妈妈好》时的镇静。最初,说一些提外话,这实际上是一个很复杂的程序,可是我们却用了很长的篇幅,但愿读者从以上的代码里能体味到写好的程序的一些办法,也许最主要的是增加正文吧。一个程序的正文永久不会嫌多,即使你写的时分以为它基本是过剩,但信任我,信任曾如许告知我们的很多优异的程序员:养成写良多正文的习气。</P>对声卡编程
只需我们不是举行诸如驱动设备开辟之类的事情,对声卡的编程和下面对扬声器的编程没有甚么实质的区分。当你试图来编写诸如CD播放器、MP3播放器之类的庞大的程序时,你的事情是取取得与CDROM把持、MP3解码之类的信息,而读写体系设备的这一步在Linux下超互设想的复杂。比方,Linux下最复杂的播放wav的程序只要一行:cp{GetProperty(Content)}lt;>/dev/audio。将它写成一个shell文件,一样是一个程序(shell编程)。
我们起首必要晓得一台呆板上是不是有声卡,一个反省的举措是反省文件/dev/sndstat文件,假如翻开此文件毛病,而且毛病号是ENODEV,则申明此呆板没有安装声卡。除此以外,试着往翻开文件/dev/dsp也能够来反省是不是安装了声卡。
Linux下和声卡相干的文件有很多,如收罗数字样本的/dev/dsp文件,针对混音器的/dev/mixer文件和用于音序器的/dev/sequencer等。文件/dev/audio是一个基于兼容性思索的声响设备文件,它实践是到上述数字设备的一个映照,它最年夜的特征也许是对诸如wav这类文件格局的间接撑持。我们上面的例子即便用了此设备文件完成了一个复杂的灌音机:我们从声卡设备(固然要用麦克风)读取音频数据,并将它寄存到文件test.wav中往。要播放这个wav文件,只需如后面所述,利用命令cptest.wav>/dev/audio便可,固然你也能够用Linux下其他的多媒体软件来播放这个文件。
上面便是完全的程序清单:
/*此文件中界说了上面一切形如SND_的变量*/
#include
#include
#include
#include
#include
main()
{
/*id:读取音频文件形貌符;fd:写进的文件形貌符。i,j为一时变量*/
intid,fd,i,j;
/*存储音频数据的缓冲区,能够调剂*/
chartestbuf[4096];
/*翻开声卡设备,失利则加入*/
if((id=open("/dev/audio",O_RDWR))<0){
fprintf(stderr,"Cantopensounddevice!\n");
exit(-1);
}
/*翻开输入文件,失利则加入*/
if((fd=open("test.wav",O_RDWR))<0){
fprintf(stderr,"Cantopenoutputfile!\n");
exit(-1);
}
/*设置得当的参数,使得声响设备事情一般*/
/*具体情形请参考Linux关于声卡编程的文档*/
i=0;
ioctl(id,SNDCTL_DSP_RESET,(char*)&i);
ioctl(id,SNDCTL_DSP_SYNC,(char*)&i);
i=1;
ioctl(id,SNDCTL_DSP_NONBLOCK,(char*)&i);
i=8000;
ioctl(id,SNDCTL_DSP_SPEED,(char*)&i);
i=1;
ioctl(id,SNDCTL_DSP_CHANNELS,(char*)&i);
i=8;
ioctl(id,SNDCTL_DSP_SETFMT,(char*)&i);
i=3;
ioctl(id,SNDCTL_DSP_SETTRIGGER,(char*)&i);
i=3;
ioctl(id,SNDCTL_DSP_SETFRAGMENT,(char*)&i);
i=1;
ioctl(id,SNDCTL_DSP_PROFILE,(char*)&i);
/*读取必定数目的音频数据,并将之写到输入文件中往*/
for(j=0;j<10;){
i=read(id,testbuf,4096);
&n
上一页1234下一页
初学阶段只要把上课时候学习过的命令练熟就可以了.单靠学习各种命令而成为高手是不可能的。 |