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");
}

  

时间: 2024-11-10 11:18:26

Linux下音频编程-输出音频文件的相关文章

Linux下Socket编程

http://blog.chinaunix.net/uid-20733992-id-3450058.html 原文地址:Linux下Socket编程 作者:yulianliu1218 Linux下Socket编程 什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. Socket接口设计者最先是将接口放在Unix操作系统里面

Linux下Shell编程

Linux的shell编程 1.什么是shell? 当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shell(外壳)的程序. shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序.一般的Linux系统都将bash作为默认的shell. 2.几种流行的shell 目前流行的shell有ash.bash.ksh.csh.zsh等,可以用下面的命令来查看she

Linux下gcc编译生成动态链接库*.so文件并调用它 是转载的

动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助.1.动态库的编译 下面通过一个例子来介绍如何生成一个动态库.这里有一个头文件:so_test.h,三个.c文件:test_a.c.test_b.c.test_c.c,我们将这几个文件编译成一个动态库:libtest.so. //so_test.h:#include "stdio.h"

Linux下C编程入门

1.首先,以Ubuntu 64-bit操作系统下为例 图中的sudo su表示的是快速进入到root管理员下.这里的密码默认的是安装后的Ubunto操作系统中自定义的用户名的密码,此处以用户toto,密码:123456为例 2.在/demo目录下创建以下三个文件(看截图): 注意:其中add.c的内容如下(通过vi编辑器编辑add.c): 其中的add.h(用于声明同级目录下的add.c文件中编写的函数).截图如下: 3.关于自定义add.h函数的引用,在main.c中的写法如下: 4.编译ad

根据《linux兵书》目录 在kali上操作 第8章 Linux下的编程

第8章  浑水摸鱼:Linux下的编程 175 8.1  Linux下常用的开发工具 176 8.1.1  GCC 176 8.1.2  CVS 176 8.1.3  Perl 176 8.1.4  Linux上的Delphi--Kylix 177 8.2  Linux下的Vi文本编辑器 177 8.2.1  Vi编辑器介绍 178 8.2.2  启动Vi编辑器 179 8.2.3  显示Vi中的行号 180 8.2.4  光标移动操作 181 8.2.5  屏幕命令 182 8.2.6  文本

linux 下 poll 编程

poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述符的个数将.poll 函数如下: #include <poll.h> int poll(struct pollfd *fdarray, unsigned long nfds, int timeout) 第一个参数指向结构数组第一个元素的指针,每个数组都是一个 pollfd 结构iouyonghu制定额是某个给定描述符的条件. struct pollfd { int fd; short eve

Linux下shell编程实例

1. 判断一文件是不是块或字符设备文件,如果是将其拷贝到 /dev 目录下 read -p "input a file:" filename if [ -b $filename -o -c $filename ] then cp $filename /dev/ fi 2.编写一个脚本,进行简单的减法运算,要求提示输入变量 #!/bin/bash read -p "input a number:" num1 read -p "input another nu

linux下Bash编程组合测试及编写脚本(五)

linux下Bash编程组合测试及编写综合脚本(五) 1.Bash编程组合测试条件 -a: 与关系 -o: 或关系 !: 非关系 表示方法1:[ $# -gt 100 -a $# -le 500 ] 表示方法2:[ $# -gt 100 ] && [ $# -le 500 ] 2.编写一个任意添加与删除用户的脚本,要求如下: 2.1:如果脚本选项是--add:,将添加用户; 如果选项是--del,将删除用户,如果是--help显示帮助信息 2.2:脚本选项后面的参数可任意指定多个用户并且用

Linux下的输入/输出重定向

Linux环境中支持输入输出重定向,用符号<和>来表示.0.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出,比如 2>lee.dat 表示将错误信息输出到文件lee.dat中. 同时,还可以在这三个标准输入输出之间实现重定向,比如将错误信息重定向到标准输出,可以用 2>&1来实现.Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪.这一点非常有用,当我们不需要回显程序的所有信