PluginInsert::~PluginInsert ()
{
+ for (CtrlOutMap::const_iterator i = _control_outputs.begin(); i != _control_outputs.end(); ++i) {
+ boost::dynamic_pointer_cast<ReadOnlyControl>(i->second)->drop_references ();
+ }
}
void
set<Evoral::Parameter> a = _plugins.front()->automatable ();
for (uint32_t i = 0; i < plugin->parameter_count(); ++i) {
- if (!plugin->parameter_is_control (i) || !plugin->parameter_is_input (i)) {
+ if (!plugin->parameter_is_control (i)) {
+ continue;
+ }
+ if (!plugin->parameter_is_input (i)) {
+ _control_outputs[i] = boost::shared_ptr<ReadOnlyControl> (new ReadOnlyControl (plugin, i));
continue;
}
Evoral::Parameter param (PluginAutomation, 0, i);
_bypass_port = plugin->designated_bypass_port ();
+ /* special case VST effSetBypass */
+ if (_bypass_port == UINT32_MAX -1) {
+ // emulate VST Bypass
+ Evoral::Parameter param (PluginAutomation, 0, _bypass_port);
+ ParameterDescriptor desc;
+ desc.label = _("Plugin Enable");
+ desc.toggled = true;
+ desc.normal = 1;
+ desc.lower = 0;
+ desc.upper = 1;
+ boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
+ boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
+ add_control (c);
+ }
+
if (_bypass_port != UINT32_MAX) {
boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
if (0 == (ac->flags () & Controllable::NotAutomatable)) {
activate ();
}
boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
- ac->set_value (yn ? 1.0 : 0.0, Controllable::NoGroup);
+ const double val = yn ? 1.0 : 0.0;
+ ac->set_value (val, Controllable::NoGroup);
+
+#ifdef ALLOW_VST_BYPASS_TO_FAIL // yet unused, see also vst_plugin.cc
+ /* special case VST.. bypass may fail */
+ if (_bypass_port == UINT32_MAX - 1) {
+ /* check if bypass worked */
+ if (ac->get_value () != val) {
+ warning << _("PluginInsert: VST Bypass failed, falling back to host bypass.") << endmsg;
+ // set plugin to enabled (not-byassed)
+ ac->set_value (1.0, Controllable::NoGroup);
+ // ..and use host-provided hard-bypass
+ if (yn) {
+ activate ();
+ } else {
+ deactivate ();
+ }
+ return;
+ }
+ }
+#endif
ActiveChanged ();
}
}
}
}
+boost::shared_ptr<ReadOnlyControl>
+PluginInsert::control_output (uint32_t num) const
+{
+ CtrlOutMap::const_iterator i = _control_outputs.find (num);
+ if (i == _control_outputs.end ()) {
+ return boost::shared_ptr<ReadOnlyControl> ();
+ } else {
+ return (*i).second;
+ }
+}
string
PluginInsert::describe_parameter (Evoral::Parameter param)
assert (out == internal_output_streams ());
}
ret->configure_io (internal_input_streams (), out);
+ ret->set_owner (_owner);
_impulseAnalysisPlugin = ret;
} else {
ret = _impulseAnalysisPlugin.lock();