Linuxでのオーディオプログラミング-オーディオファイルの出力

2020 ワード

プログラムは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");

}