更新现有 DSP 插件

[与此页面关联的功能(Windows 媒体播放器 SDK)是旧版功能。 它已被 MediaPlayer 取代。 MediaPlayer 已针对Windows 10和Windows 11进行了优化。 如果可能,Microsoft 强烈建议新代码使用 MediaPlayer 而不是 Windows 媒体播放器 SDK。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

在 Windows 媒体播放器 11 SDK 发布之前创建的 DSP 插件可能无法按预期工作,在 Windows Vista 上运行的 Windows 媒体播放器 11。 为了确保在 Windows Vista 上运行 Windows 媒体播放器 11 的客户可以使用你的插件,你必须对 DSP 插件代码进行一些更改,重新编译项目,并将更新后的插件分发给客户。

使用最新版本的 Windows 媒体播放器 插件向导创建的项目将包含所需的更新。 请参阅Windows 媒体播放器 11 的 DSP 插件向导汇报。 (最好运行向导来创建新的示例项目,然后使用 Visual Studio 附带的 Windiff.exe 等工具来检查示例代码与生产代码之间的差异。)

需要对任何现有 DSP 插件进行三main更改:

  • 更改插件的注册方式。 现有插件可能将线程模型注册为“单元”。 在 Windows Vista 上运行的 Windows 媒体播放器 11 要求 DSP 插件将线程模型注册为“两者”。 可以通过更改 projectname.rgs 文件中的线程模型值来解决此问题,如下所示:

    val ThreadingModel = s 'Both'
    
    

    注意

    将线程模型指定为“Both”将删除 COM 为调用自定义接口提供的任何序列化。 如果从多个线程调用自定义接口,则必须自行提供此序列化。

     

    Windows 媒体播放器 11 可确保正确序列化对 DMO 接口的调用。

    1. 使用新的插件类型添加对 IWMPMediaPluginRegistrar::WMPRegisterPlayerPluginIWMPMediaPluginRegistrar::WMPUnRegisterPlayerPlugin 的调用: projectnamedll.cpp 文件中的 dllRegisterServer 中的WMP_PLUGINTYPE_DSP_OUTOFPROC和 DllUnregisterServer。 有关详细信息,请参阅这些方法的参考页。
    2. 创建和分发代理/存根 DLL,以便对插件类上实现或由插件类创建的任何自定义接口启用 COM 封送处理。 自定义接口是定义和实现以供插件对象使用的任何专有接口。 这包括属性页使用的自定义接口(如果提供了),但也可能包括连接到 UI 插件的接口(例如)。 插件向导创建的自定义接口的一个示例是 Iprojectname。 非自定义接口的接口示例包括 IMediaObjectIWMPPluginEnable

如果 DSP 插件处理音频,则还必须添加对以下新音频格式的支持:

  • WAVE_FORMAT_IEEE_FLOAT
  • 使用子格式KSDATAFORMAT_SUBTYPE_IEEE_FLOAT WAVE_FORMAT_EXTENSIBLE。

如果 DSP 插件处理视频,则必须添加对 NV12 视频格式的支持。

有关如何处理这些格式类型的示例,请参阅向导创建的示例音频或视频 DSP 插件。

关于代理/存根项目

为 DSP 插件创建代理/存根 DLL 项目的最简单方法是运行 DSP 插件向导。 这将创建一个示例代理/存根项目,可对其进行修改以使用现有代码。 需要进行以下更改:

  1. 从代码中删除自定义接口的任何现有定义。 例如,Windows 媒体播放器 10 SDK 中的 DSP 插件向导使用接口关键字 (keyword) 在 projectname.h 文件中创建了 Iprojectname接口定义。
  2. 在代理/存根项目的 IDL 文件中定义自定义接口。
  3. 在main项目之前生成代理/存根项目。 如果两个项目是同一解决方案的一部分,则可以将 Visual Studio 配置为自动执行此操作。
  4. MIDL 编译器将创建一个名称为 projectname_h.h 格式的新头文件。 必须在 projectname.h) 中将此标头包含在 main 项目中 (。 它包含自定义接口的定义。

分发更新的插件

可以像以前一样在用户的计算机上安装更新的插件。 但是,现在还必须分发和注册代理/存根 DLL。

DSP 插件开发人员概述