VST2接口dll入口点
我正在构建一个VST2插件。我想知道什么时候创建一个插件窗口:在加载DLL(在我的情况下在InitInstance
),或其他点(也许AEffEditor::open
)?VST2接口dll入口点
我有子类AEffEditor
。我在InitInstance
中创建了一个窗口,并在AEffEditor::open
和AEffEditor::close
中显示和隐藏窗口。
看起来InitInstance
(DLL负载)是不是创建一个窗口的正确点,但然后呢?
E.g.主机正在为2个插入实例创建3个窗口(一个加载dll)。
另一个问题:什么时候是InitInstance
(dll负载)调用?在主机启动和每次发送/插入?
我应该为每个dll加载创建一个窗口(m_pMainWnd
)或在单独的线程中创建它们并跟踪窗口?即m_pMainWnd
会不同或将是同一个单一窗口?
VST编辑器窗口应该嵌入到主机应用程序窗口中。这意味着您需要一个窗口引用(如果您使用Cockos extensions,则需要窗口引用(Windows上的HWND,Mac上的Mac上的WindowRef或带有Coco的Mac上的NSView),以便能够创建窗口。
当调用AEffEditor :: open时,VST API只传递该窗口引用。当AEffEditor :: close被调用时它变得无效(即使文档对它不是很具体)。因此,您需要在AEffEditor :: open(作为传递给您的窗口的子窗口)内创建窗口,并在AEffEditor :: close中将其销毁。
由此可见,您需要为每个插件创建一个单独的窗口实例。用户可以将插件的多个实例放入不同的轨道,并且他/她预期对其中一个插件的更改不会影响其他插件。
如果'open()'创建窗口(并且'close()'销毁它),那么窗口如何保存其数据?我认为“打开”和“关闭”是为了显示和隐藏“现有”窗口,而不是用于创建和销毁。或者我错了? – user1288043
@ user1288043 VST插件窗口(“效果编辑器”)反映了您的插件的当前状态。通常这个状态将是VST参数。无论如何,您需要保存这些数据以保存,恢复,银行/预设切换,也许作为您的插件对象的成员变量。编辑器需要是“哑巴”,任何调整应该更新参数。并且任何不是由GUI调整(如自动化或预设更改)引起的参数更改都需要反映出来。就像经典的模型/视图模式一样。 – cyco130
通过在'open()'中创建一个窗口(如果尚不存在的话)来解决。 – user1288043