diff options
author | Robin Gareus <robin@gareus.org> | 2015-08-05 22:14:57 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-08-05 22:14:57 +0200 |
commit | 35a9c631c16c14a9be8a91722568a3d7b3402e7e (patch) | |
tree | fbbd68449d05bd65ad986a8fcbaf51ddb0d544b5 | |
parent | 093df74a9c8d4762e16d19d972a10566f57b790a (diff) |
VST replaceProcessing () != in-place processing.
-rw-r--r-- | libs/ardour/vst_plugin.cc | 22 |
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; } |