码迷,mamicode.com
首页 > 系统相关 > 详细

Linux下音频编程-输出音频文件

时间:2014-09-21 21:29:51      阅读:343      评论:0      收藏:0      [点我收藏+]

标签:blog   io   os   使用   ar   文件   div   sp   on   

程序实现了在Linux下播放Ok.wav的功能。程序首先调用fstat函数获得文件相关信息(主要是文件大小信息)。通过malloc函数分配指定的内存空间,并将online.wav读入内存;然后,打开声卡设备文件,设置声卡参数;再调用write函数完成文件的播放。

简要的实例,代码如下:

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

#define Audio_Device "/dev/dsp"

//不同的声音有着不同的播放参数,这些参数可以使用file命令获得

#define Sample_Size 16 //there‘re two kinds of bits,8 bits and 16 bits
#define Sample_Rate 8000 //sampling rate

int play_sound(char *filename){
    struct stat stat_buf;
    unsigned char * buf = NULL;
    int handler,fd;
    int result;
    int arg,status;
   
    //打开声音文件,将文件读入内存
    fd=open(filename,O_RDONLY);
    if(fd<0) return -1;
    if(fstat(fd,&stat_buf)){
        close(fd);
        return -1;
    }

    if(!stat_buf.st_size){
        close(fd);
        return -1;
   }
   buf=malloc(stat_buf.st_size);
   if(!buf){
      close(fd);
      return -1;
   }

   if(read(fd,buf,stat_buf.st_size)<0){
      free(buf);
      close(fd);
      return -1;
   }

   //打开声卡设备,并设置声卡播放参数,这些参数必须与声音文件参数一致
   handler=open(Audio_Device,O_WRONLY);
   if(handler==-1){
       perror("open Audio_Device fail");
       return -1;
   }
  
   arg=Sample_Rate;
   status=ioctl(handler,SOUND_PCM_WRITE_RATE,&arg);
   if(status==-1){
      perror("error from SOUND_PCM_WRITE_RATE ioctl");
      return -1;
   }

   arg=Sample_Size;
   status=ioctl(handler,SOUND_PCM_WRITE_BITS,&arg);
   if(status==-1){
      perror("error from SOUND_PCM_WRITE_BITS ioctl");
      return -1;
   }
  
   result=write(handler,buf,stat_buf.st_size);
   if(result==-1){
      perror("Fail to play the sound!");
      return -1;
   }

   free(buf);
   close(fd);
   close(handler);
   return result;
}

void main(void)
{
   play_sound("/root/Online.wav");
}

  

Linux下音频编程-输出音频文件

标签:blog   io   os   使用   ar   文件   div   sp   on   

原文地址:http://www.cnblogs.com/Daniel-G/p/3984872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!