如何对各种音频设备进行操作是在Linux上进行音频编程的关键,通过内核提供的一组系统调用,应用程序能够访问声卡驱动程序提供的各种音频设备接口,这是在Linux下进行音频编程最简单也是最直接的方法。

1. 访问音频设备

无论是OSS还是ALSA,都是以内核驱动程序的形式运行在Linux内核空间中的,应用程序要想访问声卡这一硬件设备,必须借助于Linux内核所提供的系统调用(system call)。从程序员的角度来说,对声卡的操作在很大程度上等同于对磁盘文件的操作:首先使用open系统调用建立起与硬件间的联系,此时返回的文件描述符将作为随后操作的标识;接着使用read系统调用从设备接收数据,或者使用write系统调用向设备写入数据,而其它所有不符合读/写这一基本模式的操作都可以由ioctl系统调用来完成;最后,使用close系统调用告诉Linux内核不会再对该设备做进一步的处理。

open系统调用
系统调用open可以获得对声卡的访问权,同时还能为随后的系统调用做好准备,其函数原型如下所示:

       #include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);

参数pathname是将要被打开的设备文件的名称,对于声卡来讲一般是/dev/dsp。参数flags用来指明应该以什么方式打开设备文件,它可以是O_RDONLY、O_WRONLY或者O_RDWR,分别表示以只读、只写或者读写的方式打开设备文件;参数mode通常是可选的,它只有在指定的设备文件不存在时才会用到,指明新创建的文件应该具有怎样的权限。
如果open系统调用能够成功完成,它将返回一个正整数作为文件标识符,在随后的系统调用中需要用到该标识符。如果open系统调用失败,它将返回-1,同时还会设置全局变量errno,指明是什么原因导致了错误的发生。

read系统调用
系统调用read用来从声卡读取数据,其函数原型如下所示:

       #include <unistd.h>ssize_t read(int fd, void *buf, size_t count);

参数fd是设备文件的标识符,它是通过之前的open系统调用获得的;参数buf是指向缓冲区的字符指针,它用来保存从声卡获得的数据;参数count则用来限定从声卡获得的最大字节数。如果read系统调用成功完成,它将返回从声卡实际读取的字节数,通常情况会比count的值要小一些;如果read系统调用失败,它将返回-1,同时还会设置全局变量errno,来指明是什么原因导致了错误的发生。

write系统调用
系统调用write用来向声卡写入数据,其函数原型如下所示:

<span style="font-size:18px;">       #include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);</span>

系统调用write和系统调用read在很大程度是类似的,差别只在于write是向声卡写入数据,而read则是从声卡读入数据。参数fd同样是设备文件的标识符,它也是通过之前的open系统调用获得的;参数buf是指向缓冲区的字符指针,它保存着即将向声卡写入的数据;参数count则用来限定向声卡写入的最大字节数。 
如果write系统调用成功完成,它将返回向声卡实际写入的字节数;如果read系统调用失败,它将返回-1,同时还会设置全局变量errno,来指明是什么原因导致了错误的发生。无论是read还是write,一旦调用之后Linux内核就会阻塞当前应用程序,直到数据成功地从声卡读出或者写入为止。

ioctl系统调用
系统调用ioctl可以对声卡进行控制,凡是对设备文件的操作不符合读/写基本模式的,都是通过ioctl来完成的,它可以影响设备的行为,或者返回设备的状态,其函数原型如下所示:

<span style="font-size:18px;">       #include <sys/ioctl.h>int ioctl(int d, int request, ...);</span><span style="font-size:14px;">
</span>

参数fd是设备文件的标识符,它是在设备打开时获得的;如果设备比较复杂,那么对它的控制请求相应地也会有很多种,参数request的目的就是用来区分不同的控制请求;通常说来,在对设备进行控制时还需要有其它参数,这要根据不同的控制请求才能确定,并且可能是与硬件设备直接相关的。

close系统调用
当应用程序使用完声卡之后,需要用close系统调用将其关闭,以便及时释放占用的硬件资源,其函数原型如下所示:

<span style="font-size:14px;">       #include <unistd.h>int close(int fd);
</span>

参数fd是设备文件的标识符,它是在设备打开时获得的。一旦应用程序调用了close系统调用,Linux内核就会释放与之相关的各种资源,因此建议在不需要的时候尽量及时关闭已经打开的设备。

【Linux系统编程应用】Linux音频编程接口相关推荐

  1. linux 版本的scipy,Linux 系统中 SciPy (Python 3) 编程环境

    Linux 系统中 SciPy (Python 3) 编程环境 SciPy (pronounced "Sigh Pie") is a Python-based ecosystem ...

  2. LINUX系统程序设计中C/C++编程工具使用

    LINUX系统程序设计中C/C++编程工具使用 一.实验目的 掌握gcc编译器的使用 掌握gdb调试器的使用 掌握make工程管理器的使用 理解Makefile文件的格式,掌握Makefile文件的编 ...

  3. Linux 系统中 SciPy (Python 3) 编程环境

    Linux 系统中 SciPy (Python 3) 编程环境 SciPy (pronounced "Sigh Pie") is a Python-based ecosystem ...

  4. 连接linux系统的mysql,Linux系统MySQL开启远程连接

    1.远程连接上Linux系统,确保Linux系统已经安装上了MySQL数据库.登陆数据库.mysql -uroot -p(密码). 2.创建用户用来远程连接 GRANT ALL PRIVILEGES ...

  5. imx6ull移植Linux系统第二篇——Linux内核的移植

    imx6ull移植Linux系统第二篇--Linux内核的移植 花了大概两周的时间,把Linux的移植认真学了一遍,期间踩了不少坑,花费了不少时间去解决各种奇奇怪怪的问题,最终完成了uboot.系统镜 ...

  6. Alpine linux 小内存版,Alpine Linux系统-Alpine Linux系统【轻量级Linux】下载v3.11.0 最新版-西西软件下载...

    Alpine Linux系统[轻量级Linux],Alpine Linux其实就是一个清凉版的Linux系统,通过牺牲一些不常用的功能和特性来达到更加轻巧的体积以及更快的响应速度.Alpine Lin ...

  7. linux系统清理内存,Linux实验室:五个清理磁盘空间小妙招

    1删除安装包:清空系统APT缓存 玩儿电脑最怕的就是卡慢,那么电脑卡慢应该怎么解决呢?对于windows系统来说,你可能有各种免费的杀毒软件.全家桶帮你清空系统空间,那么Linux系统怎么办?今天笔者 ...

  8. linux系统的笔记本,Linux:开源的免费操作系统_笔记本电脑_笔记本评测-中关村在线...

    ■linux Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协议 ...

  9. Linux系统之部署Linux管理面板1Panel

    Linux系统之部署Linux管理面板1Panel 一.1Panel介绍 1.1Panel简介 2.1Panel特点 二.本地环境规划 1.本此实践目的 2.本地环境规划 三.检查本地环境 1.检查操 ...

  10. linux进程创建心得体会,Linux系统下计算机C语言编程心得体会

    摘    要:C语言编程是目前计算机领域中应用较为广泛的编程语言, 很多信息系统都基于C语言编程实现.Linux系统是免费且可以自由传播的操作系统, 支持多用户.多平台应用, 实际生活中应用也较为广泛 ...

最新文章

  1. Python上下文语法with小述
  2. java short long_谈谈Java中整数类型(short int long)的存储方式
  3. 在 Linux 系统中安装Load Generator ,并在windows 调用
  4. linux 磁盘查看sbli,Linux磁盘配额应用
  5. Lombok常用注解和功能
  6. des 向量 java_在JAVA中使用DES算法
  7. 程序员为什么想进大厂,看看年终奖你们就知道了
  8. jQuery-input输入框下拉提示层
  9. ajax+++fc,06. 实做AJAX(SEFC)
  10. ie8 不支持 position:fixed 的简单解决办法
  11. bios还原默认设置
  12. MySQL练习题及答案(图书管理数据库)
  13. MATLAB信号处理——信号与系统的分析基础(4)
  14. 博弈论(1)—— 零和与非零和
  15. Word设置默认隐藏页面间空白
  16. 前端手把手教你js实现附件预览和下载得功能实现
  17. Java的反编译工具提供官网下载
  18. 指南针 android gps,北斗GPS指南针app
  19. Qt 多线程中地信号与槽
  20. Jmeter关联,正则表达式提取器使用2

热门文章

  1. 用javascript实现自动隐藏页面字段
  2. C#中的委托与事件[翻译]
  3. 五阶行列式的对角线之和,函数实现
  4. 过程工程中的计算机应用基础,CDIO工程教育培养模式在《计算机应用基础》课中的应用...
  5. C语言学习之用选择法对10个整数排序
  6. php 登录重定向,PHP登录后重定向
  7. php扩展库加密如何解密,如何利用Mcrypt扩展库进行加密和解密_PHP教程
  8. WebDriver API 元素定位(三)
  9. mysql-学习-7-20170517-mysql分区
  10. jQuery ajax - getScript() 方法