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,不编辑。

如果是情报区,不编辑。

2VST允许编辑

在接收到编辑许可后,还需要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 中声明)来询问插件的播放状态。您可以传递 kVstTransportChangedkVstTransportPlaying 标志让您的插件对传输更改做出相应的反应。

但是,某些主机可能会很顽皮,并且在仅更改播放位置而不是传输状态时不会暂停/恢复。我不确定在处理过程中查询时间信息的 CPU 成本有多大,但您可以尝试在那里这样做,以查看主机是否在安排中跳来跳去。

【讨论】:

似乎 foobar VST 很“调皮”,仅在音频格式更改时才调用 resume() 而不是在流/歌曲更改时调用。但是感谢您提供时间信息的想法,我会尝试的。 想一想,我记得之前在开发一个大型 VST 插件,之前在 process() 中要求提供传输信息,所以也许这没什么大不了的。但我想作为一般规则,不要转发优化......如果该调用是您使插件工作所需的,请实现它,然后对其进行基准测试。 ;) 哦,getTimeInfo() 总是返回 NULL,看来这个特殊的 Foobar VST 包装器并没有提供任何有用的东西。我希望其他一些主机会更好。 嗯,这可能是因为它本身不是一个合适的音序器。但他们绝对应该提供至少基本的播放信息。也许您可以以某种方式询问社区和/或向他们提交错误报告?

以上是关于VST实例编辑的主要内容,如果未能解决你的问题,请参考以下文章

VST实例绘制VST

vst实例 创建VST

如何在代码中实例化 Vst3 插件?对于 vst3 主机应用程序

VST实例(10) hint(提示)

VST SDK & VST 模块 SDK

VST实例拖拽(drag&drop)