VST2 接口 dll 入口点
Posted
技术标签:
【中文标题】VST2 接口 dll 入口点【英文标题】:VST2 interface dll entry points 【发布时间】:2015-01-01 17:19:51 【问题描述】:我正在构建一个 VST2 插件。我想知道何时创建插件窗口:加载 dll(在我的情况下为 InitInstance
)或其他一些点(可能是 AEffEditor::open
)?
我已经继承了AEffEditor
。我正在InitInstance
中创建一个窗口,并在AEffEditor::open
和AEffEditor::close
中显示和隐藏该窗口。
看来InitInstance
(dll加载)不是创建窗口的正确点,但那什么时候?
例如主机正在为 2 个插入实例创建 3 个窗口(一个在加载 dll 时)。
另一个问题:InitInstance
(dll 加载)何时被调用?在主机启动时和每次发送/插入时?
我应该为每个 dll 加载创建一个窗口 (m_pMainWnd
) 还是在单独的线程中创建它们并跟踪窗口? IE。 m_pMainWnd
会不同还是相同的单个窗口?
【问题讨论】:
通过在open()
中创建一个不存在的窗口来解决。
【参考方案1】:
VST 编辑器窗口应该嵌入到宿主应用程序窗口中。这意味着您需要对该主机窗口的窗口引用(Windows 上的 HWND、带有 Carbon 的 Mac 上的 WindowRef 或带有 Cocoa 的 Mac 上的 NSView,如果您使用 Cockos extensions)才能创建您的窗口。
VST API 仅在调用 AEffEditor::open 时传递该窗口引用。当调用 AEffEditor::close 时它变得无效(即使文档不是很具体)。因此,您需要在 AEffEditor::open 中创建您的窗口(作为传递给您的窗口的子窗口)并在 AEffEditor::close 中销毁它。
因此,您需要为每个插件实例创建一个单独的窗口。用户可以将多个插件实例放在不同的轨道中,并且他/她希望对其中一个实例所做的更改不会影响另一个。
【讨论】:
如果open()
创建了窗口(而close()
销毁了它),那么窗口如何保存它的数据呢?我认为open
和close
用于显示和隐藏“现有”窗口,而不是用于创建和销毁。还是我错了?
@user1288043 VST 插件窗口(“效果编辑器”)反映了插件的当前状态。通常,此状态将是 VST 参数。您需要将此数据保存在某个地方以保存、恢复、存储库/预设切换,可能作为插件对象的成员变量。编辑器需要“愚蠢”,任何调整都应该更新参数。并且任何不是由 GUI 调整引起的参数更改(如自动化或预设更改)都需要反映。就像在经典的模型/视图模式中一样。以上是关于VST2 接口 dll 入口点的主要内容,如果未能解决你的问题,请参考以下文章