LINUX下播放WAV的C程序。利用OSS接口

#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <linux/soundcard.h>

#define OPEN_DSP_FAILED     0x00000001    /*open dsp failed!*/
#define SAMPLERATE_STATUS     0x00000002    /*samplerate status failed*/
#define SET_SAMPLERATE_FAILED  0x00000003       /*set samplerate failed*/
#define CHANNELS_STATUS       0x00000004    /*Channels status failed*/
#define SET_CHANNELS_FAILED    0x00000005    /*set channels failed*/
#define FMT_STATUS       0x00000006    /*FMT status failed*/
#define SET_FMT_FAILED     0x00000007    /*set fmt failed*/
#define OPEN_FILE_FAILED        0x00000008    /*opem filed failed*/

int P8100_Audio_Play(char *pathname,int nSampleRate,int nChannels,int fmt)
{
 int dsp_fd,mix_fd,status,arg;
 dsp_fd = open("/dev/dsp" , O_RDWR);   /*open dsp*/
 if(dsp_fd < 0) 
 {
  return  OPEN_DSP_FAILED;
 }
 arg = nSampleRate;
 status = ioctl(dsp_fd,SOUND_PCM_WRITE_RATE,&arg); /*set samplerate*/
 if(status < 0)
 {
  close(dsp_fd);
  return SAMPLERATE_STATUS;
 } 
 if(arg != nSampleRate)
 {
  close(dsp_fd);
  return SET_SAMPLERATE_FAILED;
 } 
 arg = nChannels;  /*set channels*/   
 status = ioctl(dsp_fd, SOUND_PCM_WRITE_CHANNELS, &arg); 
 if(status < 0)
 {
  close(dsp_fd);
  return CHANNELS_STATUS;
 } 
 if( arg != nChannels)
 {
  close(dsp_fd);
  return SET_CHANNELS_FAILED;
 }
 arg = fmt; /*set bit fmt*/
 status = ioctl(dsp_fd, SOUND_PCM_WRITE_BITS, &arg); 
 if(status < 0)
 {
  close(dsp_fd);
  return FMT_STATUS;
 } 
 if(arg != fmt)
 {
  close(dsp_fd);
  return SET_FMT_FAILED;
 }/*到此设置好了DSP的各个参数*/             
 FILE *file_fd = fopen(pathname,"r");
 if(file_fd == NULL)
 {
  close(dsp_fd);
  return OPEN_FILE_FAILED;
 }
 int num = 3*nChannels*nSampleRate*fmt/8;
 int get_num; 
 char buf[num];
 while(feof(file_fd) == 0)
 {
  get_num = fread(buf,1,num,file_fd);
  write(dsp_fd,buf,get_num);
  if(get_num != num)
  {
   close(dsp_fd);
   fclose(file_fd);
   return 0;
  } 
 }
 close(dsp_fd);
 fclose(file_fd);
 return 0; 
}
/*
*test
*/
int main()
{
 int value;
 value = P8100_Audio_Play("hello.wav",44100,2,16);
 fprintf(stderr,"value is %d",value);
 return 0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值