root@ubuntu:/home/naviwork/dsp# file /usr/lib/openoffice/basis3.2/share/gallery/sounds/wallewal.wav
/usr/lib/openoffice/basis3.2/share/gallery/sounds/wallewal.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 11025 Hz
root@ubuntu:/home/naviwork/dsp# ./a.out /usr/lib/openoffice/basis3.2/share/gallery/sounds/wallewal.wav 16 11025
samplebits = 16 samplerate = 11025
===============================================================
#include
#include
#include
#include
#include
#include
#include
#include
#define Audio_Device "/dev/dsp"
//不同的声音有着不同的播放参数,这些参数可以使用file命令获得
#define Sample_Size 16 //there're two kinds of bits,8 bits and 16 bits
#define Sample_Rate 8000 //sampling rate
int play_sound(char *filename, int samplebits, int samplerate){
struct stat stat_buf;
unsigned char * buf = NULL;
int handler,fd;
int result;
int arg,status;
printf("samplebits = %d samplerate = %d\n", samplebits, samplerate);
//打开声音文件,将文件读入内存
fd=open(filename,O_RDONLY);
if(fd<0) return -1;
if(fstat(fd,&stat_buf)){
close(fd);
return -1;
}
if(!stat_buf.st_size){
close(fd);
return -1;
}
buf=(unsigned char *)malloc(stat_buf.st_size);
if(!buf){
close(fd);
return -1;
}
if(read(fd,buf,stat_buf.st_size)<0){
free(buf);
close(fd);
return -1;
}
//打开声卡设备,并设置声卡播放参数,这些参数必须与声音文件参数一致
handler=open(Audio_Device,O_WRONLY);
if(handler==-1){
perror("open Audio_Device fail");
return -1;
}
arg=samplerate;
status=ioctl(handler,SOUND_PCM_WRITE_RATE,&arg);
if(status==-1){
perror("error from SOUND_PCM_WRITE_RATE ioctl");
return -1;
}
arg=samplebits;
status=ioctl(handler,SOUND_PCM_WRITE_BITS,&arg);
if(status==-1){
perror("error from SOUND_PCM_WRITE_BITS ioctl");
return -1;
}
result=write(handler,buf,stat_buf.st_size);
if(result==-1){
perror("Fail to play the sound!");
return -1;
}
free(buf);
close(fd);
close(handler);
return result;
}
int main(int argc, char *argv[])
{
play_sound(argv[1], atoi(argv[2]), atoi(argv[3]));
return 0;
}