summaryrefslogtreecommitdiff
path: root/libs/ardour/vst_plugin.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-08-05 22:14:57 +0200
committerRobin Gareus <robin@gareus.org>2015-08-05 22:14:57 +0200
commit35a9c631c16c14a9be8a91722568a3d7b3402e7e (patch)
treefbbd68449d05bd65ad986a8fcbaf51ddb0d544b5 /libs/ardour/vst_plugin.cc
parent093df74a9c8d4762e16d19d972a10566f57b790a (diff)
VST replaceProcessing () != in-place processing.
Diffstat (limited to 'libs/ardour/vst_plugin.cc')
-rw-r--r--libs/ardour/vst_plugin.cc22
1 files changed, 22 insertions, 0 deletions
diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc
index daf096e80e..7544865af1 100644
--- a/libs/ardour/vst_plugin.cc
+++ b/libs/ardour/vst_plugin.cc
@@ -568,9 +568,19 @@ VSTPlugin::connect_and_run (BufferSet& bufs,
uint32_t index;
bool valid = false;
index = out_map.get(DataType::AUDIO, out_index++, &valid);
+#ifdef VST_IN_PLACE
outs[i] = (valid)
? bufs.get_audio(index).data(offset)
: scratch_bufs.get_audio(0).data(offset);
+#else
+ if (!valid) {
+ outs[i] = scratch_bufs.get_audio(0).data(offset);
+ } else {
+ // TODO if this fixes various VST issues,
+ // maintain a dedicated buffer, the stack may not be large enough
+ outs[i] = (float*)alloca (nframes * sizeof(float));
+ }
+#endif
}
if (bufs.count().n_midi() > 0) {
@@ -597,6 +607,18 @@ VSTPlugin::connect_and_run (BufferSet& bufs,
_plugin->processReplacing (_plugin, &ins[0], &outs[0], nframes);
_midi_out_buf = 0;
+#ifndef VST_IN_PLACE
+ out_index = 0;
+ for (i = 0; i < (int32_t) _plugin->numOutputs; ++i) {
+ uint32_t index;
+ bool valid = false;
+ index = out_map.get(DataType::AUDIO, out_index++, &valid);
+ if (!valid) {
+ continue;
+ }
+ copy_vector (bufs.get_audio(index).data(offset), outs[i], nframes * sizeof(float));
+ }
+#endif
return 0;
}