add "no-inplace" buffers.
authorRobin Gareus <robin@gareus.org>
Fri, 25 Mar 2016 23:40:51 +0000 (00:40 +0100)
committerRobin Gareus <robin@gareus.org>
Fri, 25 Mar 2016 23:40:51 +0000 (00:40 +0100)
When allowing to cross-connect plugin-ports, inplace processing can
no longer be used. We need a complete set of independent input and
output buffers.

Since scratch and silent buffers are used by the various plugin
implementations we cannot re-use them in the PluginInsert.
Besides we need a complete BufferSet which can hold both: ins + outs.

libs/ardour/ardour/process_thread.h
libs/ardour/ardour/session.h
libs/ardour/ardour/thread_buffers.h
libs/ardour/process_thread.cc
libs/ardour/session.cc
libs/ardour/thread_buffers.cc

index ee2e522378bc3ffb23b8b23a0ff7b41e578a1bbc..cd1087f2a4f0572307cc94ec30028fdb760db471 100644 (file)
@@ -47,6 +47,7 @@ public:
 
        static BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
        static BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = false);
+       static BufferSet& get_noinplace_buffers (ChanCount count = ChanCount::ZERO);
        static BufferSet& get_route_buffers (ChanCount count = ChanCount::ZERO, bool silence = false);
        static BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
        static gain_t* gain_automation_buffer ();
index 9e0cf6ec0849d8b46d1da392e5cba8fb7b2cec2b..49b9d7c45e6f2d67c8a70a65fca49c5bd14f562b 100644 (file)
@@ -236,7 +236,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        void process (pframes_t nframes);
 
        BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
-       BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = true );
+       BufferSet& get_noinplace_buffers (ChanCount count = ChanCount::ZERO);
+       BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = true);
        BufferSet& get_route_buffers (ChanCount count = ChanCount::ZERO, bool silence = true);
        BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
 
index f018ee4c2279a3d413a3b522f7de48cde1ddbfa8..598d8f3947857a9bec96f21d5bf4ff80b4fcc7c6 100644 (file)
@@ -39,6 +39,7 @@ public:
 
        BufferSet* silent_buffers;
        BufferSet* scratch_buffers;
+       BufferSet* noinplace_buffers;
        BufferSet* route_buffers;
        BufferSet* mix_buffers;
        gain_t*    gain_automation_buffer;
index cf48c50c70e7c73796196a5ef619056e4d22f1d6..efcc47fee38cc39abc7153bf4907af3e8d3ec0cb 100644 (file)
@@ -116,6 +116,25 @@ ProcessThread::get_scratch_buffers (ChanCount count, bool silence)
        return *sb;
 }
 
+BufferSet&
+ProcessThread::get_noinplace_buffers (ChanCount count)
+{
+       ThreadBuffers* tb = _private_thread_buffers.get();
+       assert (tb);
+
+       BufferSet* sb = tb->noinplace_buffers;
+       assert (sb);
+
+       if (count != ChanCount::ZERO) {
+               assert(sb->available() >= count);
+               sb->set_count (count);
+       } else {
+               sb->set_count (sb->available());
+       }
+
+       return *sb;
+}
+
 BufferSet&
 ProcessThread::get_route_buffers (ChanCount count, bool silence)
 {
index d668fb46e768cf32707ddde67be8785a0c9fb72b..edae568645e8e92634b445eb054a7567b76952e7 100644 (file)
@@ -5938,6 +5938,12 @@ Session::get_scratch_buffers (ChanCount count, bool silence)
        return ProcessThread::get_scratch_buffers (count, silence);
 }
 
+BufferSet&
+Session::get_noinplace_buffers (ChanCount count)
+{
+       return ProcessThread::get_noinplace_buffers (count);
+}
+
 BufferSet&
 Session::get_route_buffers (ChanCount count, bool silence)
 {
index 2336ee50bc866327ce802a8323788e59d2a0092d..36ffbb70da5aeb267b9c8c811aded4ac5e31fd79 100644 (file)
@@ -30,6 +30,7 @@ using namespace std;
 ThreadBuffers::ThreadBuffers ()
        : silent_buffers (new BufferSet)
        , scratch_buffers (new BufferSet)
+       , noinplace_buffers (new BufferSet)
        , route_buffers (new BufferSet)
        , mix_buffers (new BufferSet)
        , gain_automation_buffer (0)
@@ -71,6 +72,7 @@ ThreadBuffers::ensure_buffers (ChanCount howmany, size_t custom)
                }
 
                scratch_buffers->ensure_buffers (*t, count, size);
+               noinplace_buffers->ensure_buffers (*t, count + count, size); // in + out
                mix_buffers->ensure_buffers (*t, count, size);
                silent_buffers->ensure_buffers (*t, count, size);
                route_buffers->ensure_buffers (*t, count, size);