linux音频播放c程序,Linux 下的C语言实现播放WAV文件

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define OPEN_DSP_FAILED 0x00000001 /*打开 dsp 失败!*/

#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_WRONLY); /*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("/windows/C/WINDOWS/Media/Windows Startup.wav",44100,2,16);//注意播放文件的路径哦!!

fprintf(stderr,"value is %d",value);

return 0;

}

以上代码在嵌入式LINUX平台上测试OK!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值