diff options
author | Robin Gareus <robin@gareus.org> | 2015-08-05 23:24:52 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-08-05 23:24:52 +0200 |
commit | 8a08d990580d38e3a1edb641205f05389a0eb1cc (patch) | |
tree | b593956b8c5fc35dabe5f97f87eadc2c11577dce /libs/ardour | |
parent | 35a9c631c16c14a9be8a91722568a3d7b3402e7e (diff) |
rework VST processing/buffering (no more alloca).
TODO: check Bufferset/VSTBuffer, eventually remove
the VST_IN_PLACE ifdef’s
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/vst_plugin.h | 4 | ||||
-rw-r--r-- | libs/ardour/vst_plugin.cc | 41 |
2 files changed, 41 insertions, 4 deletions
diff --git a/libs/ardour/ardour/vst_plugin.h b/libs/ardour/ardour/vst_plugin.h index 3450e2a480..07eca40042 100644 --- a/libs/ardour/ardour/vst_plugin.h +++ b/libs/ardour/ardour/vst_plugin.h @@ -97,6 +97,10 @@ protected: AEffect* _plugin; MidiBuffer* _midi_out_buf; +#ifndef VST_IN_PLACE + float ** _audio_out_buf; + uint32_t _audio_out_buf_cnt; +#endif }; } diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc index 7544865af1..b32db6a6d3 100644 --- a/libs/ardour/vst_plugin.cc +++ b/libs/ardour/vst_plugin.cc @@ -35,6 +35,10 @@ #include "i18n.h" +#ifndef VST_IN_PLACE +#define MAX_VST_BUFFERSIZE 8192 +#endif + using namespace std; using namespace PBD; using namespace ARDOUR; @@ -44,13 +48,22 @@ VSTPlugin::VSTPlugin (AudioEngine& engine, Session& session, VSTHandle* handle) , _handle (handle) , _state (0) , _plugin (0) +#ifndef VST_IN_PLACE + , _audio_out_buf (0) + , _audio_out_buf_cnt (0) +#endif { } VSTPlugin::~VSTPlugin () { - +#ifndef VST_IN_PLACE + for (uint32_t i = 0; i < _audio_out_buf_cnt; ++i) { + free (_audio_out_buf[i]); + } + free (_audio_out_buf); +#endif } void @@ -63,6 +76,23 @@ VSTPlugin::set_plugin (AEffect* e) _plugin->dispatcher (_plugin, effSetSampleRate, 0, 0, NULL, (float) _session.frame_rate()); _plugin->dispatcher (_plugin, effSetBlockSize, 0, _session.get_block_size(), NULL, 0.0f); +#ifndef VST_IN_PLACE + if (_audio_out_buf_cnt != _plugin->numOutputs) { + for (uint32_t i = 0; i < _audio_out_buf_cnt; ++i) { + free (_audio_out_buf[i]); + } + free (_audio_out_buf); + _audio_out_buf_cnt = _plugin->numOutputs; + _audio_out_buf = (float**) malloc (_audio_out_buf_cnt * sizeof(float*)); + /* think. Should this be part of the BufferSet ? + * in which case it would be dynamically sized, but then again + * every BufferSet would have N[?] extra VST audio buffers. + */ + for (uint32_t i = 0; i < _audio_out_buf_cnt; ++i) { + _audio_out_buf[i] = (float*) malloc (MAX_VST_BUFFERSIZE * sizeof(float)); + } + } +#endif } void @@ -563,6 +593,11 @@ VSTPlugin::connect_and_run (BufferSet& bufs, : silent_bufs.get_audio(0).data(offset); } +#ifndef VST_IN_PLACE + assert (nframes <= MAX_VST_BUFFERSIZE); + assert (_plugin->numOutputs <= _audio_out_buf_cnt); +#endif + uint32_t out_index = 0; for (i = 0; i < (int32_t) _plugin->numOutputs; ++i) { uint32_t index; @@ -576,9 +611,7 @@ VSTPlugin::connect_and_run (BufferSet& bufs, 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)); + outs[i] = _audio_out_buf[i]; } #endif } |