文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院操作系统 Linux深入OSS(Open Sound System)的开发
精品推荐
特别推荐
·高效使用Linux的七个好习惯
·为何Linux比Windows更安全?
·Linux和Unix最常用的网络命令
·Linux系统下安全防护十大招数
·Linux各种服务器的架设
·Linux操作系统下用单网卡捆绑双IP
·恢复被误删除的Linux文件
·在Linux服务器上做备份和恢复
·Linux中网络参数的意义及其应用
·linux知识大全
·解析Linux服务器远程控制技术
·新手关于Linux系统的一些错误认识
·Linux系统至少有五大点比Vista更好
·Linux攻略 关于Apache安装、配置、优化
·详细讲解Linux操作系统的进程管理的功能
·解决Linux和Windows双系统的引导问题
·新手学堂:Linux操作系统安全性能检查笔记
·600个优秀网站
·提高Linux操作系统网速的方法
·Linux系统下挂载硬盘光驱和U盘的方法
热点TOP10
·网络组建大全(包括企业网、校园网、网吧和基础知识)
·Linux常用命令详解
·Linux各种服务器的架设
·linux知识大全
·Linux文件和目录访问权限设置
·LINUX 常见问题1000个详细解答
·Linux学习手册
·Red Hat Linux 安装BroadCom网卡驱动
·如何查看Linux下系统占用的资源(top、free、uptime)
·用.iso文件从硬盘安装redhat linux 7.3
·为Canon PIXMA iP1000喷墨打印机安装驱动程序
·RedHat linux 8.0下内核编译步骤和说明
·Linux系统下挂载硬盘光驱和U盘的方法
·RedHat Linux 9升级内核
·Slax本土化:移动硬盘上的Linux中文套件
·详细讲解Linux操作系统的进程管理的功能
·linux下通过脚本实现自动重启程序
·在Linux服务器上做备份和恢复
·Linux Apache Web 服务器终极教程
·正宗888葫芦 博彩游戏

深入OSS(Open Sound System)的开发

日期:2007年4月8日 作者: 查看:[大字体 中字体 小字体]


 本文将对OSS(Open Sound System)的开发进行一些深入的讨论,具体的内容包括:播放音频的时延问题,并定量的对不同的缓冲区配置进行分析;非阻塞write;应用程序对驱动程序中DMA buffer的直接访问。这些是在深入OSS的开发过程中,开发者会遇到的一些实际问题,比如,在开发基于Linux平台的游戏程序时,就必须要考虑到如何降低播放音频的时延,使得在需要的时候,能够将游戏的音效尽快地播放出来,并与画面的进行保持同步。
  
  在讨论这些方面时,除了从使用的角度介绍以外,还结合具体的驱动实现,分析这些功能对应的内部原理,以加深读者的理解。
  
  为了在阅读文章时有一个共同的认识,本文首先简单介绍了OSS的一些基本内容。
  
  1.OSS简介
  OSS的层次结构非常简单,应用程序通过API(定义于 )访问OSS driver,OSS driver控制声卡。如下图所示:
  

 深入OSS(Open Sound System)的开发(图一)


  声卡中主要有两个基本装置:Mixer和CODEC(ADC/DAC)。Mixer用来控制输入音量的大小,对应的设备文件为/dev/mixer;CODEC用来实现录音(模拟信号转变为数字信号)和播放声音(数字信号转变为模拟信号)的功能,对应的设备文件为/dev/dsp。
  
  开发OSS应用程序的一般流程是:
  1)包含OSS头文件:#include
  2)打开设备文件,返回文件描述符
  3)使用ioctl设置设备的参数,控制设备的特性
  4)对于录音,从设备读(read)
  5)对于播放,向设备写(write)
  6)关闭打开的设备
  
  2.缓冲区设置的性能分析
  在设置驱动内部的缓冲区时,存在一个矛盾:在声卡驱动程序中,为了防止抖动的出现,保证播放的性能,设置了内部缓冲区-DMA buffer。在播放时,应用程序通过驱动程序首先将音频数据从应用程序缓冲区-APP buffer,写入到DMA buffer。接着,由DMA控制器把DMA buffer中的音频数据发送到DAC(Digital-Analog Converter)。某些时刻CPU非常的繁忙,比如正在从磁盘读入数据,或者正在重画屏幕,没有时间向DMA buffer放入新的音频数据。DAC由于没有输入新的音频数据,导致声音播放的间断,这就出现了声音的抖动现象。此时,需要将DMA buffer设置的足够大,使得DAC始终有数据播放。但是,DMA buffer的增大使得每次从APP buffer拷贝的时间也变长,导致了更大的播放延迟。这对于那些延迟敏感的应用场合,如与用户有交互的音频应用程序,就会出现问题。
  
  对于这个矛盾,可以从两个不同的方面分别着手解决。驱动程序采用多缓冲(Multi-buffering)的方式,即将大的DMA buffer分割成多个小的缓冲区,称之为fragment,它们的大小相同。驱动程序开始时只需等待两个fragment满了就开始播放。这样可以通过增加fragment的个数来增加缓冲区的大小,但同时每个fragment被限制在合适的大小,也不影响时延。音频驱动程序中的多缓冲机制一般会利用底层DMA控制器的scatter-gather功能。
  
  另一方面,应用程序也可指导驱动程序选择合适大小的缓冲区,使得在没有抖动的情况下,时延尽可能的小。特别的,应用程序将驱动程序中的缓冲通过mmap映射到自己地址空间后,会以自己的方式来处理这些缓冲区(与驱动程序的不一定一致),这时应用程序往往会先根据自己的需要设置驱动程序中内部缓冲区的大小。
  
  在OSS的ioctl接口中,SNDCTL_DSP_SETFRAGMENT就是用来设置驱动程序内部缓冲区大小。具体的用法如下:
  
  int param;
  param = ( 0x0004 << 16) + 0x000a;
  if (ioctl(audio_fd, SNDCTL_DSP_SETFRAGMENT, ¶m) == -1) { 
          ...error handling...
  }
  
  参数param由两部分组成:低16位为fragment的大小,此处0x000a表示fragment大小为2^0xa,即1024字节;高16位为fragment的数量,此处为0x0004,即4个fragement。设置好fragment参数后,通过ioctl的SNDCTL_DSP_SETFRAGMENT命令调整驱动程序中的缓冲区。
  
  为了给音频程序的开发者展示缓冲区配置对播放效果的影响,我们将对缓冲区配置与播放性能的关系进行测试。下面首先介绍测试的环境,包括测试方法的原理和测试结果的含义;接着针对两种情况进行测试,并解释测试的结果。
  
  测试环境
  测试是在PC机上进行的,具体的测试环境参见下表。
  

深入OSS(Open Sound System)的开发(图二)


[1] [2] [3] 下一页 




上一篇:做了make_recover却不能恢复的解决办法

下一篇:用Apache+Tomcat创建与管理Web服务器

深入OSS(Open Sound System)的开发 相关文章:
·EZ-USB 68013A开发指南
·Visual Studio 2005集成开发环境图解
·windows 2003服务器配置VPN实现各种网络环境VSS协同开发
·在.NET 应用程序中用System.Web.Mail 发送电子邮件
·openssl的man中文文档
·兵之利器 软件开发辅助工具纵览
·XPCOM--LINUX下的组件开发技术
·开发WDM型的USB设备驱动程序
·DirectX游戏开发入门
·samba和openldap结合实战
深入OSS(Open Sound System)的开发 相关软件:
·孙鑫VC++从入门到精通开发详解视频教程FLASH版
·中国少年儿童智力开发百科全书(上中下)高清PDF全彩图书
·深入理解计算机系统电子杂志 PDF
·Cooolsoft MP3 Sound Cutter (音频截取工具) V1.41 绿色版
·Sound ForgeV8.0d build 128
·Sony Sound Forge9.0a
·嵌入式系统应用开发技术 wmv 视频教程
·盟军敢死队-深入敌后
·PHP+MySQL网络开发技术
·全脑开发大师IQ EQ MQ

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.vipcn.com
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.vipcn.com All Rights Reserved. 鄂ICP备05000083号Powered by:vipcn