DSP

linux音频的播放

2019-07-13 17:55发布

以下是一个基于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; }