姐贵vs比利王 magnet:【转】Linux环境下用c语言写的播放wav文件的小程序

来源:百度文库 编辑:中财网 时间:2024/04/30 13:20:47
本程序可以读取.wav文件,然后进行播放。
使用前,请确认您是否安装音频驱动。
确认方法:cat /etc/sndstat,如果显示无此设备,则没有安装驱动。
安装驱动很简单,到oss.com上下载音频驱动,然后按照网上的教程进行就可以了。

源代码如下:
  1. #include 
  2. #include 
  3. #include 
  4. #include 
  5. #include 
  6. #include 
  7. #include 
  8. /* 下面的三个参数是跟具体文件相关的,文件什么样,就要设置成什么样 */
  9. #define RATE 11025  
  10. #define SIZE 16    
  11. #define CHANNELS 1  // 1表示单声道,2为立体声
  12. /* ................ */
  13. unsigned char buf[RATE*SIZE/8]; //buf里面正好放一秒钟的音频,下面的计时还要用
  14. int main()
  15. {
  16.     int fd;
  17.     int wavfd; //wav文件的描述符
  18.     int arg;        /* ..ioctl..... */
  19.     int status;   /* ........ */
  20.                 /* ...... */
  21.     fd = open("/dev/dsp", O_RDWR);      
  22.     if (fd < 0) {
  23.         printf("open of /dev/dsp failed");
  24.         exit(1);
  25. }
  26.     wavfd = open("12193767609.wav",O_RDONLY);
  27.     if (wavfd < 0) {
  28.         printf("open of wav failed");
  29.         exit(1);
  30.   }
  31.  
  32. /* .......... */
  33.     arg = SIZE;
  34.     status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
  35.     if (status == -1)
  36.          perror("SOUND_PCM_WRITE_BITS ioctl failed");
  37.     if (arg != SIZE)
  38.          perror("unable to set sample size");
  39.  
  40. /* .......... */
  41.     arg = CHANNELS;
  42.     status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
  43.     if (status == -1)
  44.         perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
  45.     if (arg != CHANNELS)
  46.         perror("unable to set number of channels");
  47.  
  48. /* .......... */
  49.      arg = RATE;
  50.          status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
  51.      if (status == -1)
  52.          perror("SOUND_PCM_WRITE_WRITE ioctl failed");
  53.  
  54.     /* 从wav文件中读buf大小的内容,然后写入/etc/dsp中,直到文件结束 */
  55.      int time = 0; //动态显示播放时间用

  56.      while (status = read(wavfd, buf, sizeof(buf)) > 0) {
  57.          write(fd, buf, sizeof(buf));
  58.          printf("%ds, enjoy .../n",time++); 

  59.           /* 以下三句,用于在更改播放文件的参数时,播放掉缓冲区内的内容,可以用,更保险*/    
  60.          /*status = ioctl(fd, SOUND_PCM_SYNC, 0);
  61.            if (status == -1)
  62.                perror("SOUND_PCM_SYNC ioctl failed");
  63.           */         
  64.         }
  65. }
本程序中需要一个.wav文件才能播放,你可以到百度mp3上去搜索一个.wav文件,放到程序目录下。然后,把程序中的文件名改成该音频的文件名。
ps:可以用file 文件名命令来查看该wav文件的属性,以便据此来更改程序中的播放参数。