rework VST processing/buffering (no more alloca).
authorRobin Gareus <robin@gareus.org>
Wed, 5 Aug 2015 21:24:52 +0000 (23:24 +0200)
committerRobin Gareus <robin@gareus.org>
Wed, 5 Aug 2015 21:24:52 +0000 (23:24 +0200)
TODO: check Bufferset/VSTBuffer, eventually remove
the VST_IN_PLACE ifdef’s

libs/ardour/ardour/vst_plugin.h
libs/ardour/vst_plugin.cc

index 3450e2a480d22fc0b938590380574feb459865fe..07eca4004243f379f2e719d2ea2b37961c2960ca 100644 (file)
@@ -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
 };
 
 }
index 7544865af19b139cd908029a1e6c808bb677a093..b32db6a6d309a3df4cc24d50bd21784f6c79a399 100644 (file)
 
 #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
        }