summaryrefslogtreecommitdiff
path: root/libs/ardour/vst_plugin.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-08-05 23:24:52 +0200
committerRobin Gareus <robin@gareus.org>2015-08-05 23:24:52 +0200
commit8a08d990580d38e3a1edb641205f05389a0eb1cc (patch)
treeb593956b8c5fc35dabe5f97f87eadc2c11577dce /libs/ardour/vst_plugin.cc
parent35a9c631c16c14a9be8a91722568a3d7b3402e7e (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/vst_plugin.cc')
-rw-r--r--libs/ardour/vst_plugin.cc41
1 files changed, 37 insertions, 4 deletions
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
}