- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)