《ASIO 音频驱动开发指南》 张佩.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《ASIO音频驱动开发指南》 张佩 目前来说,音频驱动开发是个相对窄小的技术范畴,因为生产厂家的相对集中和垄断,导致这个市场不是很火热。 国内做过ASIO音频驱动的,更是少得可怜。我从百度上搜索ASIO关键字,得到的资料几乎都是同一份粗犷简介的拷贝, 不仅笼统,而且简直浪费:无休止的复制是一种浪费,哪怕是在网络上。 我不得不寻找更多的资料,可发布这个规范的厂商,德国的Steinberg公司的官方网站上的资料同样过于俭省,我 能得到的只是一份称之为SDK的包,里面有ASIO的源代码和一份SDK文档??两者都很简明,简直是春秋笔法。我后来 又在维基百科上找到了几份资源,却证明是很有用的。 我对所有能找到的资源进行学习,一段时间以来,小有收获。我愿意共享我的成绩,如果有后来者的话,但愿能给 予力所能及的帮助。1. ASIO的作用 关于这一点,你可以从网上得到很多说明。ASIO能达到的效果就是低延迟low latency。它的原理是尽量绕过WDM 驱动框架中,能导致声音延迟的模块,而把PCM数据流,发送到尽量底层的设备对象中。WDM驱动框架中,最突出的模块 是KMixer驱动,它完成声音的最终转换,把input的数据流转换为统一的格式,发送给下面的驱动(内核流驱动)处理。 在KMixer这里,所有的数据流都有至少50ms的延迟??所谓延迟,是对数据流的转换、处理所花费的时间。问题是,不 是所有的数据流都是需要转换的,有些数据在传进来之前就已经是转换好的PCM格式了。但按照标准的流程,他们也必须 到KMixer里面来走一遍,这就导致了无效的延迟时间。 ASIO的原理其实很简单,它最有价值的部分,其实是由硬件提供的支持。ASIO驱动是User层实现的,数据在ASIO 驱动中被处理好,出来的时候就直接调用硬件驱动提供的接口,由ASIO声卡直接处理这些数据流。目前支持ASIO的声卡 很贵,而且很稀少。一般被专业人士所使用。 2. ASIO驱动实现(及例程) 这里说的驱动,跟Windows的内核驱动完全是两码事。你简直可以把ASIO驱动看成是一个用户程序。 1)COM形式 ASIO驱动被实现成COM组件的形式,所以你必须提供标准的COM接口: DllRegisterServer DllUnregisterServer DllCanUnloadNow DllGetClassObject 我在这里不想介绍太多的关于COM的东西,否则就牵扯太多了。我将介绍最贴切ASIO的一些内容。在 DllRegisterServer接口函数中,你必须调用SDK库函数RegisterAsioDriver在注册表中注册你的ASIO驱动。在这里我 要劝告你的是:绝大多数情况下,不要试图去修改SDK库函数,虽然你拥有它的源代码。尝试去理解它并使用它。另外要 说明的是,ASIO不是开源项目,Steinberg是对它拥有版权的。 LONG RegisterAsioDriver CLSID clsid,char *szdllname,char *szregname,char *szasiodesc,char *szthreadmodel 你要提供一个Class ID,可以用工具生成以保证其唯一性。第二个参数是你生成的驱动模块的文件名(dll)。第三 个是你想要注册的名字,可以任意指定,不可以为空。第四个是描述字符串,也可以任意指定,也可以为空。 细心研读RegisterAsioDriver中的注册位置和信息,或许能对你有一些帮助。谁知道呢? DllUnregisterServer用来卸载COM组建,在其中你必须调用UnregisterAsioDriver函数,以清除掉你在注册表中 的设置。 DllCanUnloadNow函数是系统询问COM组件本身,是否可以将它卸载时调用的。在其中你必须判断COM是否有活动对 象或者是否组件正被锁定,如果是这样,就表示目前不能被卸载,要返回S_FALSE。否则返回S_OK,系统接下来进行卸载 操作。 if CClassFactory::IsLocked || CBaseObject::ObjectsActive 1 return S_FALSE; else return S_OK; DllGetClassObject函数用来取得一个驱动接口实例,也就是我们下面要讲到的ASIOSample接口类。 2)ASIO驱动类(ASIOSample) 在SDK中已经定义了一个纯虚拟接口类:IASIO。它包含了全部ASIO框架所需要的接口,兹列于下,我略做注释。 interface IASIO : public IUnknown virtual ASIOBool initvoid *sysHandle 0;

文档评论(0)

shiermeng + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档