程序实现了在Linux下播放Ok.wav的功能。程序首先调用fstat函数获得文件相关信息(主要是文件大小信息)。通过malloc函数分配指定的内存空间,并将online.wav读入内存;然后,打开声卡设备文件,设置声卡参数;再调用write函数完成文件的播放。
简要的实例,代码如下:
- #include<unistd.h>
- #include<fcntl.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<stdlib.h>
- #include<stdio.h>
- #include<linux/soundcard.h>
-
- #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){
- struct stat stat_buf;
- unsigned char * buf = NULL;
- int handler,fd;
- int result;
- int arg,status;
-
- //打开声音文件,将文件读入内存
- 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=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=Sample_Rate;
- status=ioctl(handler,SOUND_PCM_WRITE_RATE,&arg);
- if(status==-1){
- perror("error from SOUND_PCM_WRITE_RATE ioctl");
- return -1;
- }
-
- arg=Sample_Size;
- 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;
- }
-
- void main(void)
- {
- play_sound("/root/Online.wav");
- }