X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fplugin_insert.cc;h=ba61e43e9ca9031a89ce89ae955bdea2e3be1c6d;hb=9a0b1cce075f32768197d001f269a191869cc4e6;hp=78f65963302cd77ac90a0d756075385d95560343;hpb=4aeebb914eedf9279e4904786ce42518611de137;p=ardour.git diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 78f6596330..ba61e43e9c 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -35,15 +35,13 @@ #include "ardour/ladspa_plugin.h" #include "ardour/plugin.h" #include "ardour/plugin_insert.h" -#include "ardour/port.h" -#include "ardour/route.h" #ifdef LV2_SUPPORT #include "ardour/lv2_plugin.h" #endif -#ifdef VST_SUPPORT -#include "ardour/vst_plugin.h" +#ifdef WINDOWS_VST_SUPPORT +#include "ardour/windows_vst_plugin.h" #endif #ifdef LXVST_SUPPORT @@ -54,7 +52,6 @@ #include "ardour/audio_unit.h" #endif -#include "ardour/audioengine.h" #include "ardour/session.h" #include "ardour/types.h" @@ -94,7 +91,11 @@ PluginInsert::set_count (uint32_t num) uint32_t diff = num - _plugins.size(); for (uint32_t n = 0; n < diff; ++n) { - add_plugin_with_activation (plugin_factory (_plugins[0])); + boost::shared_ptr p = plugin_factory (_plugins[0]); + add_plugin (p); + if (active ()) { + p->activate (); + } if (require_state) { /* XXX do something */ @@ -132,13 +133,17 @@ PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, Au ChanCount PluginInsert::output_streams() const { - ChanCount out = _plugins.front()->get_info()->n_outputs; + assert (!_plugins.empty()); - DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1\n", out)); + PluginInfoPtr info = _plugins.front()->get_info(); - if (out == ChanCount::INFINITE) { - return _plugins.front()->output_streams (); + if (info->reconfigurable_io()) { + ChanCount out = _plugins.front()->output_streams (); + // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out)); + return out; } else { + ChanCount out = info->n_outputs; + // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size())); out.set_audio (out.n_audio() * _plugins.size()); out.set_midi (out.n_midi() * _plugins.size()); return out; @@ -148,9 +153,20 @@ PluginInsert::output_streams() const ChanCount PluginInsert::input_streams() const { - ChanCount in = _plugins[0]->get_info()->n_inputs; + assert (!_plugins.empty()); + + ChanCount in; + + PluginInfoPtr info = _plugins.front()->get_info(); + + if (info->reconfigurable_io()) { + assert (_plugins.size() == 1); + in = _plugins.front()->input_streams(); + } else { + in = info->n_inputs; + } - DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static input streams = %1, match using %2\n", in, _match.method)); + DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method)); if (_match.method == Split) { @@ -171,17 +187,13 @@ PluginInsert::input_streams() const } return in; - } else if (in == ChanCount::INFINITE) { - - return _plugins[0]->input_streams (); - } else { for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { in.set (*t, in.get (*t) * _plugins.size ()); } + return in; - } } @@ -322,24 +334,18 @@ PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t of ChanMapping in_map (in_streams); ChanMapping out_map (out_streams); - + bool valid; if (_match.method == Split) { /* fix the input mapping so that we have maps for each of the plugin's inputs */ in_map = ChanMapping (natural_input_streams ()); /* copy the first stream's buffer contents to the others */ /* XXX: audio only */ - Sample const * mono = bufs.get_audio (in_map.get (DataType::AUDIO, 0)).data (offset); - for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) { - memcpy (bufs.get_audio (in_map.get (DataType::AUDIO, i)).data (offset), mono, sizeof (Sample) * nframes); - } - } - - if (_match.method == Hide) { - /* Silence the hidden input buffers */ - for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { - for (uint32_t i = in_streams.get(*t); i < (in_streams.get(*t) + _match.hide.get(*t)); ++i) { - bufs.get(*t, i).silence (nframes); + uint32_t first_idx = in_map.get (DataType::AUDIO, 0, &valid); + if (valid) { + Sample const * mono = bufs.get_audio (first_idx).data (offset); + for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) { + memcpy (bufs.get_audio (in_map.get (DataType::AUDIO, i, &valid)).data (offset), mono, sizeof (Sample) * nframes); } } } @@ -463,7 +469,7 @@ PluginInsert::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end * at the transitions of "active" */ - uint32_t out = _plugins[0]->get_info()->n_outputs.n_audio(); + uint32_t out = output_streams().n_audio (); for (uint32_t n = 0; n < out; ++n) { bufs.get_audio (n).silence (nframes); @@ -475,15 +481,15 @@ PluginInsert::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end /* does this need to be done with MIDI? it appears not */ - uint32_t in = _plugins[0]->get_info()->n_inputs.n_audio(); - uint32_t out = _plugins[0]->get_info()->n_outputs.n_audio(); + uint32_t in = input_streams ().n_audio (); + uint32_t out = output_streams().n_audio (); if (out > in) { /* not active, but something has make up for any channel count increase */ - + for (uint32_t n = out - in; n < out; ++n) { - memcpy (bufs.get_audio(n).data(), bufs.get_audio(in - 1).data(), sizeof (Sample) * nframes); + memcpy (bufs.get_audio (n).data(), bufs.get_audio(in - 1).data(), sizeof (Sample) * nframes); } } @@ -492,6 +498,12 @@ PluginInsert::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end } _active = _pending_active; + + /* we have no idea whether the plugin generated silence or not, so mark + * all buffers appropriately. + */ + + bufs.set_is_silent (false); } void @@ -596,8 +608,8 @@ PluginInsert::plugin_factory (boost::shared_ptr other) #ifdef LV2_SUPPORT boost::shared_ptr lv2p; #endif -#ifdef VST_SUPPORT - boost::shared_ptr vp; +#ifdef WINDOWS_VST_SUPPORT + boost::shared_ptr vp; #endif #ifdef LXVST_SUPPORT boost::shared_ptr lxvp; @@ -612,9 +624,9 @@ PluginInsert::plugin_factory (boost::shared_ptr other) } else if ((lv2p = boost::dynamic_pointer_cast (other)) != 0) { return boost::shared_ptr (new LV2Plugin (*lv2p)); #endif -#ifdef VST_SUPPORT - } else if ((vp = boost::dynamic_pointer_cast (other)) != 0) { - return boost::shared_ptr (new VSTPlugin (*vp)); +#ifdef WINDOWS_VST_SUPPORT + } else if ((vp = boost::dynamic_pointer_cast (other)) != 0) { + return boost::shared_ptr (new WindowsVSTPlugin (*vp)); #endif #ifdef LXVST_SUPPORT } else if ((lxvp = boost::dynamic_pointer_cast (other)) != 0) { @@ -701,7 +713,9 @@ PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) PluginInsert::Match PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCount& out) const { - if (_plugins.front()->reconfigurable_io()) { + PluginInfoPtr info = _plugins.front()->get_info(); + + if (info->reconfigurable_io()) { /* Plugin has flexible I/O, so delegate to it */ bool const r = _plugins.front()->can_support_io_configuration (in, out); if (!r) { @@ -711,8 +725,8 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo return Match (Delegate, 1); } - ChanCount inputs = _plugins[0]->get_info()->n_inputs; - ChanCount outputs = _plugins[0]->get_info()->n_outputs; + ChanCount inputs = info->n_inputs; + ChanCount outputs = info->n_outputs; bool no_inputs = true; for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { @@ -803,17 +817,22 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & in, ChanCo by feeding them silence. */ - bool can_hide = false; + bool could_hide = false; + bool cannot_hide = false; ChanCount hide_channels; for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { if (inputs.get(*t) > in.get(*t)) { + /* there is potential to hide, since the plugin has more inputs of type t than the insert */ hide_channels.set (*t, inputs.get(*t) - in.get(*t)); - can_hide = true; + could_hide = true; + } else if (inputs.get(*t) < in.get(*t)) { + /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */ + cannot_hide = true; } } - if (can_hide) { + if (could_hide && !cannot_hide) { out = outputs; return Match (Hide, 1, hide_channels); } @@ -891,8 +910,8 @@ PluginInsert::set_state(const XMLNode& node, int version) type = ARDOUR::LADSPA; } else if (prop->value() == X_("lv2")) { type = ARDOUR::LV2; - } else if (prop->value() == X_("vst")) { - type = ARDOUR::VST; + } else if (prop->value() == X_("windows-vst")) { + type = ARDOUR::Windows_VST; } else if (prop->value() == X_("lxvst")) { type = ARDOUR::LXVST; } else if (prop->value() == X_("audiounit")) { @@ -907,11 +926,11 @@ PluginInsert::set_state(const XMLNode& node, int version) prop = node.property ("unique-id"); if (prop == 0) { -#ifdef VST_SUPPORT +#ifdef WINDOWS_VST_SUPPORT /* older sessions contain VST plugins with only an "id" field. */ - if (type == ARDOUR::VST) { + if (type == ARDOUR::Windows_VST) { prop = node.property ("id"); } #endif @@ -1148,29 +1167,20 @@ PluginInsert::PluginControl::set_value (double user_val) { /* FIXME: probably should be taking out some lock here.. */ - double const plugin_val = user_to_plugin (user_val); - for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) { - (*i)->set_parameter (_list->parameter().id(), plugin_val); + (*i)->set_parameter (_list->parameter().id(), user_val); } boost::shared_ptr iasp = _plugin->_impulseAnalysisPlugin.lock(); if (iasp) { - iasp->set_parameter (_list->parameter().id(), plugin_val); + iasp->set_parameter (_list->parameter().id(), user_val); } AutomationControl::set_value (user_val); } double -PluginInsert::PluginControl::user_to_plugin (double val) const -{ - /* no known transformations at this time */ - return val; -} - -double -PluginInsert::PluginControl::user_to_ui (double val) const +PluginInsert::PluginControl::internal_to_interface (double val) const { if (_logarithmic) { if (val > 0) { @@ -1184,7 +1194,7 @@ PluginInsert::PluginControl::user_to_ui (double val) const } double -PluginInsert::PluginControl::ui_to_user (double val) const +PluginInsert::PluginControl::interface_to_internal (double val) const { if (_logarithmic) { val = exp (val); @@ -1193,20 +1203,6 @@ PluginInsert::PluginControl::ui_to_user (double val) const return val; } -/** Convert plugin values to UI values. See pbd/controllable.h */ -double -PluginInsert::PluginControl::plugin_to_ui (double val) const -{ - return user_to_ui (plugin_to_user (val)); -} - -double -PluginInsert::PluginControl::plugin_to_user (double val) const -{ - /* no known transformations at this time */ - return val; -} - XMLNode& PluginInsert::PluginControl::get_state () { @@ -1224,8 +1220,7 @@ double PluginInsert::PluginControl::get_value () const { /* FIXME: probably should be taking out some lock here.. */ - - return plugin_to_user (_plugin->get_parameter (_list->parameter())); + return _plugin->get_parameter (_list->parameter()); } boost::shared_ptr @@ -1254,29 +1249,34 @@ PluginInsert::collect_signal_for_analysis (framecnt_t nframes) _signal_analysis_collect_nframes_max = nframes; } -/** Add a plugin to our list and activate it if we have already been activated */ +/** Add a plugin to our list */ void -PluginInsert::add_plugin_with_activation (boost::shared_ptr plugin) +PluginInsert::add_plugin (boost::shared_ptr plugin) { plugin->set_insert_info (this); _plugins.push_back (plugin); - if (active()) { - plugin->activate (); +} + +void +PluginInsert::realtime_handle_transport_stopped () +{ + for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { + (*i)->realtime_handle_transport_stopped (); } } -/** Add a plugin to our list */ void -PluginInsert::add_plugin (boost::shared_ptr plugin) +PluginInsert::realtime_locate () { - plugin->set_insert_info (this); - _plugins.push_back (plugin); + for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { + (*i)->realtime_locate (); + } } void -PluginInsert::realtime_handle_transport_stopped () +PluginInsert::monitoring_changed () { for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { - (*i)->realtime_handle_transport_stopped (); + (*i)->monitoring_changed (); } }