问题描述
本地c ++应用程序正在使用c ++ / winrt类实例化并使用winrt::Windows::Media::Audio::AudioGraph
。
在AudioGraph
内部,可以向图节点添加效果。有一些已经创建的效果(如回声效果),但也有可能创建自定义音频效果。
自定义音频效果类必须为Windows Runtime Component
。通过在idl文件中使用Windows.Media.Effects.IBasicAudioEffect
接口创建类(并提供实现),可以在Windows运行时组件c ++ / winrt项目中创建自定义音频效果。这将生成winmd,lib和winrt头文件。
在这一点上,一切都很好并且可以正常工作。但是要实例化音频效果,需要先注册它,而这种陡峭的空间我不见了。当我要实例化音频效果类时,应用程序在运行时抛出“ Class not register”消息异常,并且当我要在AudioGraph
节点中实例化音频异常时也抛出异常“无法激活音频效果”。
我不知道如何从本机c ++应用程序注册Windows运行时组件。
此处https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/custom-audio-effects描述了创建和使用自定义音频效果的步骤。代码在C#中,并在UWP应用程序中使用,但可以将其几乎1:1转换为c ++ / winrt。
解决方法
本文解决了这个问题:
可以通过修改应用程序清单文件(而不是文档中建议的Windows运行时组件软件包清单)来使用免注册WinRT(从Windows 10 1903开始):
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<file name="WinRTComponent.dll">
<activatableClass
name="WinRTComponent.Class1"
threadingModel="both"
xmlns="urn:schemas-microsoft-com:winrt.v1" />
<activatableClass
name="WinRTComponent.Class2"
threadingModel="both"
xmlns="urn:schemas-microsoft-com:winrt.v1" />
</file>
</assembly>