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


    程序实现了在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");
    }
    

      

  • 相关阅读:
    CI 知识 :Git介绍及常用操作
    虚拟机的迁移(热迁移)
    kvm虚拟化网络管理
    Zabbix -----安装
    Mariadb 主从
    keepalived + lvs marster 与 backup 之间的 高可用
    LVS 负载均衡 (VS/DR模式 与 VS/TUN 模式)
    linux下部署tomcat 上线jpress博客系统
    docker (2)---存储、网络(利用docker容器上线静态网站)
    openstack(2) -------RabbitMQ集群部署
  • 原文地址:https://www.cnblogs.com/Daniel-G/p/3984872.html
Copyright © 2020-2023  润新知