linux平台下读取声音并播放

来源:互联网 发布:软件开发人员培训学校 编辑:程序博客网 时间:2024/05/22 06:56

平台:linux

windows下读取声音应用windows下的API,那么如果直接移植到嵌入式等系统下的话,是肯定执行不出来的。那么,就得改成在linux下可以执行的方式。(以上个人意见,不一定对哈!)

下面给出linux下读取音频并播放的程序,在linux下调试通过。

#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      /*打开  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_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;
}


int main()
{
    int value;

    //千万注意播放文件的路径!!!
//    value = P8100_Audio_Play("/windows/C/WINDOWS/Media/Windows Startup.wav",44100,2,16);//如果不在同一个工作目录下则使用绝对路径,但是移植时要注意这个问题。
value = P8100_Audio_Play("22.wav",44100,2,16); //如果此代码和音频文件在一个工作目录下,则直接写音频文件名。也可使用相对路径,即代码和音频所在文件夹在一个工作目录下,相对路径格式“voice\\22.wav” ,其中voice是存放音频的文件夹,这样就可以很方便的移植了。至于\\这个就是路径的有的一个\就可以,有的得两个,因为有一个\是转义字符。


    fprintf(stderr,"value is %d",value);
    return 0;
}


好了就这些吧,说的越多错误就越多!毕竟水平有限!

原创粉丝点击