PortClass音频
+ -

PortClass流式音频架构

2021-07-01 230 0

在Windows操作系统中,PortClass仅用于纯音频设备驱动的开发,其配合内核流式驱动模块ks.sys实现音频设备驱动的开发。

avstream

内核流式驱动模块ks.sys包含两部分内容,一部分是提供内核通用的流式驱动模块,另一部分是avstream模块。avstream模块即可用于开发音频设备驱动,也可用于开发视频驱动,但portclass只能用于开发音频驱动。

Windows音频引擎架构图

下图显示了音频引擎内部结构的简化布局。

Windows音频引擎架构图

PortClass流式音频架构

和视频一样,windows的WDM流媒体将音频内核驱动程序抽象为音频过滤器(filter),每个音频过滤器实现一个特定的功能。音频过滤器一般具有输入输出管脚(pin)。输入管脚用于从上游过滤器中获取音频流数据,输出管脚用于将本过滤器处理后的音频流数据流出至下一级音频过滤器。音频过滤器之间通过输入输出管脚连起在一起形成过滤器系统。

为了简化音频硬件驱动程序的开发,WDM音频驱动程序模型将硬件接口问题与WDM流滤波器实现问题隔离开来。它通过将驱动程序代码组织成单独处理这些问题的组件,并通过精确定义这些组件之间的接口来实现这一点。所有组件都被称为“驱动程序”,尽管并非所有组件都被操作系统识别为“驱动程序”:

在Windows WDM音频驱动架构中,音频 miniport 驱动控制物理音频设备,并实现硬件指定的功能接口。
通常每个音频miniport驱动都实现了其特定的音频功能,但通常一个音频设备支持多种功能,因此,基于此硬件开发的音频驱动程序公开多个miniport接口。在许多情况下,一个给定的驱动程序将公开一个特定接口的多个实例。

如下图所示:

PortClass音频架构

对于一个音频驱动程序,这里我们称为适配器驱动(Adapter Driver).
这种分层方法允许用最少的软件开发工作来支持物理设备。如果硬件制造商希望声卡支持WDM流,则该声卡支持的每个功能都需要执行以下步骤:

1.确定该功能是否与已存在微型端口驱动程序的硬件兼容。如果是这样,请使用现有的微型端口驱动程序来支持该功能。如果找不到这样的兼容硬件…

2.确定功能是否与现有端口驱动程序支持的功能足够相似。如果是这样,请编写一个微型端口驱动程序来支持该功能,并遵守与所标识的端口驱动程序相关联的微型端口接口规范。如果找不到这样的端口驱动程序…

3.编写支持该功能的微驱动程序,符合流类驱动程序的接口规范。

所以驱动的开发重点是微型端口驱动程序接口和适配器驱动程序的开发。

微软提供的MiniPort驱动类型如下:
MiniPort驱动
可以看到,我们可以根据PortClass类驱动提供的基本PortClass基类开发对应的PortClass类驱动,并实例化它们。

0 篇笔记 写笔记

PortClass中的COM
一般的Windows驱动我们采用的是WDM驱动架构,最近的Windows驱动架构WDF也是建立在WDM基础上的。这些基于WDM的一般设备驱动可以应付大部分的设备驱动,如串口,PCI,USB等通用设备驱动。但是微软的关于流的处理的一些服务及驱动采用的面向对象的设计方法,是基于COM进行开发的,典型的像......
PortClass流式音频架构
在Windows操作系统中,PortClass仅用于纯音频设备驱动的开发,其配合内核流式驱动模块ks.sys实现音频设备驱动的开发。内核流式驱动模块ks.sys包含两部分内容,一部分是提供内核通用的流式驱动模块,另一部分是avstream模块。avstream模块即可用于开发音频设备驱动,也可用......
PortClass音频驱动程序架构
音频适配器驱动程序是最低层的音频驱动,对下实现对硬件的操作,以上提供端口驱动的函数回调。所以音频适配器驱动的代码来自两部分,一部分是厂商提供的硬件驱动代码,一般是由portclass提供的通用音频驱动模块。入口函数因为适配器驱动程序是作为内核模式驱动程序服务安装的,所以和其它驱动一样,由操作系统加......
PortClass提供的音频MINI端口驱动
PortClass提供了以下几种MiniPort驱动类型。Cyclic DMA wave input and output:此类Mini端口驱动程序支持访问ISA和其他声卡的基于DMA的wave I/O功能。接口专门处理循环(autoinit)DMA缓冲区,流问题由端口驱动程序解决。Scatt......
PortClass InitializeAdapterDriver函数
InitializeAdapterDriver函数是PortClass驱动DriverEntry调用的第一个函数,也是惟一的函数。该函数的功能和其它的MINI小端口驱动一样,都是初始化相应的MIN小端口驱动框架的“结构体”,并使用系统提供的类驱动的回调函数来初始化相应的IRP回调函数,而我们函数的第......
PortClass PcAddAdapterDevice函数
PcAddAdapterDevice函数在WDK中声名如下:PORTCLASSAPI NTSTATUS NTAPI PcAddAdapterDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalD......
PortClass 自定义启动函数StartDevice
通过上一节知道,IPR_MN_START_DEVICE的回调函数其实是PnpStartDevice,不过兜兜转转,最终执行的是我们在通过在PcAddAdapterDevcie函数的第三参数StartDevice。当然在执行我们自定义的这个StartDevice函数之前,PortClass框架类已经通......
PortClass 电源管理
电源管理实现的COM是AdapterPowerMgr,继承于IAdapterPowerManagement和CUnknown,用于电源的管理。class AdapterPowerMgr: public IAdapterPowerManagement, public CUnkn......
PortClass 拓扑结构实现原理
PortClass音频设备驱动中,除了设计电源管理之外,另一些重要的结构就是实现音频设备的MiniPort驱动。我们知道,PortClass提供了多种MiniPort端口驱动,我们只需要继承,并实例化并生成设备拓扑结构就行了。但多种MiniPort端口驱动的类型很多,我们一般选择Topology端......
PortClass IMiniportTopology拓扑结构的实现
需要实现IMiniportTopology的为:class Topology: public IMiniportTopology, public CUnknown{};当然Topology和WaveCyclic类为了实现上图的拓结构图,需要返回相应的拓结连接关系图,系统会调......
PortClass IMiniportWaveCyclic拓扑结构的实现
需要实现IMiniportWaveCyclic的类分别为:class WaveCyclic: public IMiniportWaveCyclic, public CUnknown{};当然WaveCyclic类为了实现上图的拓结构图,需要返回相应的拓结连接关系图,系统......
PortClass IMiniportWaveCyclicStream
IMiniportWaveCyclicStream接口表示流经WaveCyclicFilter上引脚的音频流。该过滤器包装了WaveCycle渲染或捕获设备,并通过将WaveCycle端口驱动程序与WaveCycle微型端口驱动程序配对来实现。需要实现IMiniportWaveCyclicStre......
WDM-UAA音频驱动简介
UAA全称Microsoft Universal Audio Architecture.Windows内核音频体系包括两大部分,分别为WDM和KS(kernel stream)组件。并且其支持的操作系统从Windows 98至现在最新的Windows 11.Windows对支持符合UAA规范的P......
PortClass电源管理回调函数及调用时机
PortClass电源管理使用IAdapterPowerManagement类实例来回调。class AdapterPowerMgr: public IAdapterPowerManagement, public CUnknown其三个回调函数分别为:PowerChan......
CUnknown和INonDelegatingUnknown
CUnknown继承于INonDelegatingUnknown,并且CUnknown是所有COM的基类。class CUnknown : public INonDelegatingUnknown而INonDelegatingUnknown是一个虚基结构体。INonDelegatingUnkn......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!