以下是一个基于QT上面做的一个linux下的一个音频的播放
int sound::play(QString filename)
{
int id,fd,i,j;
char buf[512];
fd = open("/dev/dsp",O_WRONLY);//只写方式打开设备文件/dev/dsp
if(fd<0)
{
perror("Couldn't open the file /dev/audio:");
return -1;
}
QByteArray ba=filename.toLatin1();
const char *c_str2=ba.data();
id = open(c_str2,O_RDWR | O_CREAT,755);//打开要播放的文件
if(id<0)
{
perror("Couldn't open the file test.wav:");
return -1;
}
/*************Set the ioctl********************/
i =0;
if(ioctl(fd,SNDCTL_DSP_RESET,(char *)&i)==-1)perror("reset error:");
if(ioctl(fd,SNDCTL_DSP_SYNC,(char *)&i)==-1)perror("sync error:");
i =1;
if(ioctl(fd,SNDCTL_DSP_NONBLOCK,(char *)&i)==-1)perror("nonblock error:");
i=RATE;
if(ioctl(fd,SNDCTL_DSP_SPEED,(char *)&i)==-1){perror("speed error:");return -1;}
i=1;
if(ioctl(fd,SNDCTL_DSP_CHANNELS,(char *)&i)==-1)perror("channel error:");
i=AFMT_S16_NE;
if(ioctl(fd,SNDCTL_DSP_SETFMT,(char *)&i)==-1){perror("setfmt error:");return -1;}
if(i!=AFMT_S16_NE){printf("the device is not suppor the AFMT_S16_NE");return -1;}
i=3;
if(ioctl(fd,SNDCTL_DSP_SETTRIGGER,(char *)&i)==-1)perror("settrigger error:");
i=3;
if(ioctl(fd,SNDCTL_DSP_SETFRAGMENT,(char *)&i)==-1)perror("setfragment error");
i=1;
if(ioctl(fd,SNDCTL_DSP_PROFILE,(char *)&i)==-1)perror("profile error");
/*****************TO Work*********************/
i=0;
for(j=0;j<8000;)
{
i=read(id,buf,12);//这里的第三个参数是缓冲区大小,太小了会播放得太慢了,太大了就播放快了,还不能有单数,主要是看你的那个采样频率和那个采样位数;
printf("In the %dth time it had read %d bytes
",j,i);//这一句可以用来做一下稍微的延时,不加的话就不行了,还想大神指导怎么去改善啊呀
if(i>0)
{
write(fd,buf,i);
//ioctl(fd,SNDCTL_DSP_SYNC);
j++;
}
}
close(fd);
close(id);
return 0;
}