Linux下的声音设备编程比大多数人想象的要简单得多。一般说来,我们常用的声音设备是内部扬声器和声卡,它们都对应/dev目录下的一个或多个设备文件,我们象打开普通文件一样打开它们,用ioctl()函数设置一些参数,然后对这些打开的特殊文件进写操作。

  由于这些文件不是普通的文件,所以我们不能用ANSI C(标准C)的fopen、fclose等来操作文件,而应该使用系统文件I/O处理函数(open、read、write、lseek和close)来处理这些设备文件。ioctl()或许是Linux下最庞杂的函数,它可以控制各种文件的属性,在Linux声音设备编程中,最重要的就是使用此函数正确设置必要的参数。

以下程序实现了在Linux下播放Online.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;

}

int main(void)

{

play_sound("/root/Online.wav");

exit(0);

}

Linux下c语言简单实现播放wav相关推荐

  1. linux下C语言简单实现线程池

    0 前言 网上关于线程池的例子还是不少,简单明了的倒是比较少,看了网上的资料,打算借鉴网上的一些例子,自己实现以下. 线程的概念就不多说,首先说一下多线程的好处:多线程技术主要解决处理器单元内多个线程 ...

  2. Linux下C语言调用paly播放音频文件

    一.安装sox播放器 sox播放器支持流行的多种类型的音频文件 sudo apt-get install sox sudo apt-get install sox libsox-fmt-all 二.在 ...

  3. linux系统wav驱动下载,linux下alsa架构音频驱动播放wav格式文件

    #include struct WAV_HEADER { char rld[4]; //riff 标志符号 int rLen; char wld[4]; //格式类型(wave) char fld[4 ...

  4. Linux 应用程序 嵌汇编,Linux下C语言嵌汇编

    Using Assembly Language in Linux. Intel和AT&T汇编语法差异: 1.前缀: Intel汇编寄存器和立即数无需前缀.后者寄存器前缀为%,立即数前缀为$. ...

  5. Linux下C语言编程-进程的创建

    Linux下C语言编程-进程的创建 作者:hoyt 1.进程的概念 Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命令.那么操作系统是怎么实现多用户的环境呢?在现代的操作 ...

  6. linux的vi命令输入C,Linux中C语言简单实现之vi篇(详细内容)

    一.vi编辑器介绍 vi是UNIX和Linux操作系统使用的全屏幕文本编辑器,任何一台安装了UNIX或Linux的计算机都会提供vi编辑器,是一个功能强大的编辑器. 1.vi有三种操作模式:命令模式. ...

  7. GCC编译器简明教程(Linux下C语言开发环境的搭建)

    GCC编译器简明教程(Linux下C语言开发环境的搭建) 市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境(例如GNOME.KDE.Unity等)和各种常用的必 ...

  8. 您知道Linux下C语言编程的一些注意事项吗_教育中国

    您知道Linux下C语言编程的一些注意事项吗_教育中国 云风的 BLOG: 一个 C 接口设计的问题 一个 C 接口设计的问题 C 语言在本质上,参数传递都是值传递.不像 Pascal 和 C++ 可 ...

  9. linux下c语言调用mysql,Linux下C语言操作MYSQL总结

    Linux下C语言操作MYSQL总结 发布时间:2006-12-17 00:40:00来源:红联作者:anciens 下文的用到的数据库表: 数据库中存在表table, 有name(varchar类型 ...

最新文章

  1. Sun地系统架构师考试(SCEA)
  2. 零基础也可现学苹果Swift语言?太傻太天真
  3. Maven : maven异常记录-must be unique maven duplicate declaration of version
  4. 3年出货5000万颗!国内老牌芯片商用平头哥玄铁处理器研发新芯片
  5. 「leetcode」本周小结!(回溯算法系列一)
  6. Linux 运维必备的 13 款实用工具,拿好了~
  7. MFC---CComboBox控件添加字符串函数InsertString
  8. Vbs判断两个Excel文件的内容--将两个Excel文件相同内容写入新建的Excel文件内
  9. 遇见C++ Lambda
  10. js传参不是数字_js中函数传参方式
  11. 解决海外安卓设备,WIFI“已连接 但无法访问互联网”问题
  12. device_register分析
  13. Day4 数据分析 Excel图表【零基础】
  14. Win10文件无法重命名
  15. 3A(AF AE AWB)综述
  16. 新唐M251 CORTEX-M23内核移植TencentOS tiny教程
  17. GitHub分享的微软开源计算器项目
  18. iOS-app store 的应用下架,这个下架的应用名称 多久后才可以使用?
  19. 心灵成长的六个定律 (1) - By 武志红
  20. python中self image_Python3用tkinter和PIL实现看图工具

热门文章

  1. 重启计算机一直转圈圈,Win10系统开机一直转圈圈进不了系统解决方法
  2. cordic的FPGA实现(三)sin、cos函数运算与源码分析
  3. 未来五年国内将建逾300座微电网工程
  4. 项目管理实用经验,项目负责人必看
  5. Latex中大括号内换行显示
  6. linux添加新字体
  7. Oracle Data Guard 角色转换
  8. 7-2 地下迷宫探索 (30分)
  9. Atitit. 高级软件project师and 普通的差别 高级编程的门槛总结
  10. uDig简介和下载安装与设置中文语言包