VST实例编辑
Posted Luo大哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VST实例编辑相关的知识,希望对你有一定的参考价值。
VST的单元格支持编辑,使用普通的编辑很简单,VST提供了一个编辑器,是一个继承自TCUSTOMEDIT的编辑器。
TStringEditLink = class(TInterfacedObject, IVTEditLink);
1、发出编辑请求
向VST发出编辑请求,有以下三种方式:
第一种方式是,VST可以在treeoptions里设置toEditable,可在鼠标放到单元格时,经过EditDelay设置的毫秒后开始编辑;
第二种方式是,也可在点击某单元格后,按键盘的F2,开始编辑。
前面两种编辑是有条件的:selectionoptions里不能包含“toFullRowSelect”。
第三种方式是直接调用函数editnode。
本程序请求编辑是通过双击单元格发出请求。事件是“onNodedbClick”代码如下:
procedure TForm2.vstNodeDblClick(Sender: TBaseVirtualTree; const HitInfo: THitInfo); begin if not Assigned(HitInfo.HitNode) then Exit; if not HitInfo.HitColumn in [0,1,2,4,5] then Exit; if sender.GetNodeLevel(HitInfo.HitNode)=0 then Exit; Sender.EditNode(HitInfo.HitNode,HitInfo.HitColumn); end;
本程序编辑的条件是:
如果没有点中节点,不编辑;
如果column不是指定column,不编辑。
如果是情报区,不编辑。
2、VST允许编辑
在接收到编辑许可后,还需要VST允许才能进行编辑。允许的指令在事件onediting中编写,如果不写代码,自动认可允许编辑。
代码如下:
procedure TForm2.vstEditing(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean); begin Allowed:=(Column in [0,1,3..5]) and (Sender.GetNodeLevel(node)=1); end;
实际条件和前面是一致的。
3、创建编辑器
如果没有代码,自动使用TstringEditLink,在事件“OnCreateEditor ”中写代码。
本程序引用了自写单元editlink,创建编辑器代码如下:
procedure TForm2.vstCreateEditor(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink); var sl:TStringList; begin sl:=TStringList.Create; case Column of 4: begin sl.Add(\'单跑道\'); sl.Add(\'多跑道\'); EditLink:=tcomboeditlink.createof(sl); end; 5: begin sl.Add(\'主用\'); sl.Add(\'备用\'); EditLink:=tcomboeditlink.createof(sl); end; end; FreeAndNil(sl); end;
column是4和5的时候,创建的是下拉选择框,其它时候使用了默认的TstringEditLink。
我们的编辑器是一个combobox的下拉框,需要在创建的时候添加下拉框的items;
4、保存编辑结果
编辑的结果处理在事件“onnewtext”中处理。如果不进行处理,编辑将无视处理结果。
代码如下:
procedure TForm2.vstNewText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; NewText: string); begin with pcodes(Sender.GetNodeData(node))^ do begin case column of 0:icao:=NewText; 1:iata:=NewText; 3:names:=NewText; 4:rwy_style:=NewText; 5:apt_type:=NewText; end; end; end;
运行如下:
编辑前:
编辑时:
编辑完成后:
VST 音频插件如何检测来自 VST 主机的流中断?
【中文标题】VST 音频插件如何检测来自 VST 主机的流中断?【英文标题】:How can VST audio plugin detect stream interrupts from VST host? 【发布时间】:2011-08-03 18:16:08 【问题描述】:我开发了一个简单的 VST 插件。该插件有一个带有音频样本的内部缓冲区,如果音频流被中断,则应清除该缓冲区。
现在,如果我在某些媒体播放器中使用此插件(例如带有 VST 包装器插件的 Foobar),并且我使用搜索栏跳到歌曲中的某个位置或切换到新歌曲,我仍然会听到以前音频的尾音.
是否有任何 VST 回调或被调用来通知插件有关此类流中断的东西?
【问题讨论】:
【参考方案1】:没有确切的通知挂钩,但很容易查看播放是开始还是停止。当传输停止和启动时,主机应该分别调用您的插件的suspend()
和resume()
。在这些调用中,您可以通过调用getTimeInfo()
(在 audioeffectx.h 中声明)来询问插件的播放状态。您可以传递 kVstTransportChanged
和 kVstTransportPlaying
标志让您的插件对传输更改做出相应的反应。
但是,某些主机可能会很顽皮,并且在仅更改播放位置而不是传输状态时不会暂停/恢复。我不确定在处理过程中查询时间信息的 CPU 成本有多大,但您可以尝试在那里这样做,以查看主机是否在安排中跳来跳去。
【讨论】:
似乎 foobar VST 很“调皮”,仅在音频格式更改时才调用 resume() 而不是在流/歌曲更改时调用。但是感谢您提供时间信息的想法,我会尝试的。 想一想,我记得之前在开发一个大型 VST 插件,之前在process()
中要求提供传输信息,所以也许这没什么大不了的。但我想作为一般规则,不要转发优化......如果该调用是您使插件工作所需的,请实现它,然后对其进行基准测试。 ;)
哦,getTimeInfo() 总是返回 NULL,看来这个特殊的 Foobar VST 包装器并没有提供任何有用的东西。我希望其他一些主机会更好。
嗯,这可能是因为它本身不是一个合适的音序器。但他们绝对应该提供至少基本的播放信息。也许您可以以某种方式询问社区和/或向他们提交错误报告?以上是关于VST实例编辑的主要内容,如果未能解决你的问题,请参考以下文章