Linux环境下用c语言写的播放wav文件的小程序

本文介绍了一个使用C语言编写的简单程序,该程序能够读取并播放WAV格式的音频文件。通过设置音频参数如采样率、位深度及声道数等,程序实现了与音频硬件的交互,同时提供了播放进度的动态显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/noah1987/archive/2008/10/21/3118934.aspx

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

源代码如下:

  1. #include <unistd.h>
  2. #include <fcntl.h>
  3. #include <sys/types.h>
  4. #include <sys/ioctl.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <linux/soundcard.h>
  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文件的属性,以便据此来更改程序中的播放参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值