#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
#include "ardour/audio_unit.h"
#endif
-#include "ardour/audioengine.h"
#include "ardour/session.h"
#include "ardour/types.h"
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<Plugin> p = plugin_factory (_plugins[0]);
+ add_plugin (p);
+ if (active ()) {
+ p->activate ();
+ }
if (require_state) {
/* XXX do something */
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;
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) {
}
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;
-
}
}
/* 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, &valid)).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);
- }
- }
-
- 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);
}
}
}
* 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);
/* 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);
}
}
}
_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
#ifdef LV2_SUPPORT
boost::shared_ptr<LV2Plugin> lv2p;
#endif
-#ifdef VST_SUPPORT
- boost::shared_ptr<VSTPlugin> vp;
+#ifdef WINDOWS_VST_SUPPORT
+ boost::shared_ptr<WindowsVSTPlugin> vp;
#endif
#ifdef LXVST_SUPPORT
boost::shared_ptr<LXVSTPlugin> lxvp;
} else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
#endif
-#ifdef VST_SUPPORT
- } else if ((vp = boost::dynamic_pointer_cast<VSTPlugin> (other)) != 0) {
- return boost::shared_ptr<Plugin> (new VSTPlugin (*vp));
+#ifdef WINDOWS_VST_SUPPORT
+ } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
+ return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
#endif
#ifdef LXVST_SUPPORT
} else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
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) {
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) {
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")) {
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
{
/* 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<Plugin> 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) {
}
double
-PluginInsert::PluginControl::ui_to_user (double val) const
+PluginInsert::PluginControl::interface_to_internal (double val) const
{
if (_logarithmic) {
val = exp (val);
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 ()
{
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<Plugin>
_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> plugin)
+PluginInsert::add_plugin (boost::shared_ptr<Plugin> 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> 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 ();
}
}