From 35a9c631c16c14a9be8a91722568a3d7b3402e7e Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 5 Aug 2015 22:14:57 +0200 Subject: VST replaceProcessing () != in-place processing. --- libs/ardour/vst_plugin.cc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) 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; } -- cgit v1.2.3