驱动程序---音频 MDD 和 PDD
大多数 Windows CE 设备驱动程序都由一个平台相关驱动程序 (PDD) 和一个模型设备驱动程序 (MDD) 组成。整体式驱动程序 将所有 PDD 和 MDD 组合到一个驱动程序中。分层驱动程序 没有组合它们。
MDD 具有下列特征:
• |
包含给定类型的所有驱动程序所共有的代码。 |
• |
调用 PDD 函数以访问硬件。 |
• |
链接到 PDD 层,并且定义MDD 期望在该层中调用的设备驱动程序服务提供程序接口 (DDSI) 函数。 |
• |
向操作系统 (OS) 公开设备驱动程序接口 (DDI) 函数。 OS 的其他部分可以调用这些函数。相关设备可以共享相同的 DDI。整体式驱动程序还公开 DDI 函数。 |
• |
处理中断处理。 |
• |
可供开发人员重用。 |
• |
可以链接到多个 PDD。 |
• |
通常不需要进行更改。 如果进行了更改,则在将驱动程序迁移到将来的版本时可能会遇到麻烦。 |
• |
包含任何中断服务线程 (IST)。 |
PDD 具有下列特征:
• |
由硬件平台特有的代码组成。 |
• |
可能需要修改硬件平台。 |
• |
专门用于使用特定的 MDD 实现。 |
• |
公开 MDD 调用的 DDSI 函数。 整体式驱动程序不公开 DDSI 函数。 |
以下列表显示了在实现分层驱动程序和整体式驱动程序之间进行取舍时的注意事项:
• |
分层驱动程序可能只需要修改 PDD。 |
• |
分层驱动程序增加了设备驱动程序中的函数调用的系统开销,因为 MDD 调用到 PDD 中。 |
• |
整体式驱动程序改进了驱动程序性能,因为它将 MDD 和 PDD 到组合一个层之中,这消除了 MDD 对 PDD 进行的函数调用。 |
• |
整体式驱动程序更难以迁移到将来版本的 Windows CE,因为 Windows CE 所包含的大多数设备驱动程序都被划分为一个 PDD 和一个 MDD。 |
• |
如果设备的功能与 MDD 层中的函数执行的任务很好地匹配,则整体式驱动程序可以更简单、更有效。 |
不管是实现分层驱动程序还是实现整体式驱动程序,都可以将任何示例驱动程序的源代码作为实现的基础。
另请参阅
Windows CE Drivers | Driver Development Tools | Driver Debugging | How to Use the CETK to Test a Driver | Drivers: Post-Development Tasks
作为直接使用统一音频模型 (UAM) 或实现流式接口的替代方法,可以使用 Microsoft 提供的模型设备驱动程序 (MDD) 库。该库通过音频设备驱动程序服务提供程序接口 (DDSI) 函数实现了流式接口函数。
如果您使用 Wavemdd.lib,则必须创建匹配的、实现了这些音频 DDSI 函数的平台相关驱动程序 (PDD) 库。PDD 库通常被称为 Wavepdd.lib(尽管不要求这样)。然后,可以将这两个库链接起来,以构成音频驱动程序(通常称为 Wavedev.dll)。
一般情况下,音频硬件支持比通常适用于文件的操作集更大的操作集。例如,文件不具有音量控制和播放速度控制,但音频硬件通常具有这些控制。
流式接口的 DeviceIOControl 部分允许对文件进行任意操作,从而使得可以使用 WAV_IOControl 函数来操纵音频硬件。为了向音频硬件发送命令,OS 向 WAV_IOControl 传递了各种消息。例如,为了让音频硬件做好录制准备,中间件使用 WAV_IOControl 向音频驱动程序发送 WIDM_PREPARE 消息。
发送到音频驱动程序的消息类似于基于 Windows 的桌面 OS 上的用户模式音频驱动程序(如 Mmdrv.dll)所使用的那些消息。
因为音频驱动程序完全依赖于 DeviceIOControl 函数消息,所以流式接口的其余部分的实现相对简单。特别地,WAV_Read、WAV_Seek 和 WAV_Write 函数仅仅是返回常数值的存根。
其他流式接口函数应该完全实现,并且遵循在这些函数的 Microsoft Windows CE API Reference 中描述的约定。
下图显示了使用 MDD 库的音频驱动程序的交互。
如图所示,播放和录制声音的第一步是创建一个从应用程序到 OS 的调用。OS 将此类调用转换为对音频驱动程序的 WAV_IOControl 调用。执行这一转换的 OS 技术为 Wave API Manager。然后,音频驱动程序对硬件执行适当的操作。
设备管理器只加载和注册音频驱动程序;它并不直接参与该驱动程序的操作。
像标准流式接口驱动程序一样,音频驱动程序使用注册表项来存储配置信息以及将其本身公布给 OS。
如果该音频驱动程序尚未列在 Platform.reg 中,请创建一个 HKEY_LOCAL_MACHINE\Drivers\Builtin\Audio 注册表项来存储配置信息。
当该音频驱动程序在启动时加载时,设备管理器会为该驱动程序创建一个 HKEY_LOCAL_MACHINE\Drivers\Active 注册表项。因为设备管理器只在启动时检查音频驱动程序,所以附加音频硬件的驱动程序仍然需要在注册表的 \Builtin\Audio 部分中具有它们的注册表条目,尽管它们的硬件未内置到基于 Windows CE 的运行时映像中。
有关基于 PCI 的驱动程序的驱动程序加载模型的信息,请参阅 PCI Bus Driver Loading Process。
以下列表显示了音频驱动程序的流式接口函数:
• |
WAV_Close |
• |
WAV_Deinit |
• |
WAV_Init |
• |
WAV_IOControl |
• |
WAV_Open |
• |
WAV_PowerDown |
• |
WAV_PowerUp |
• |
WAV_Read |
• |
WAV_Seek |
• |
WAV_Write |
有关这些函数的详细信息,请参阅 Waveform Audio Driver Functions。有关流式接口驱动程序的详细信息,请参阅 Stream Interface Driver Development Concepts。
以下列表显示了音频驱动程序的 DDSI 函数:
• |
PDD_AudioDeinitialize |
• |
PDD_AudioGetInterruptType |
• |
PDD_AudioInitialize |
• |
PDD_AudioMessage |
• |
PDD_AudioPowerHandler |
• |
PDD_WaveProc |
有关这些函数的详细信息,请参阅 Audio PDD Functions。
另请参阅
Audio Driver Development Concepts | Stream Interface Driver Development Concepts