X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fprocess_thread.cc;h=efcc47fee38cc39abc7153bf4907af3e8d3ec0cb;hb=8e48655981ae4b7c64d2a55e01f903eed01b6727;hp=58d51bef4e3d75a9d869eee7f22794e9460d03db;hpb=8771e00fab8d10f46b9862afe920ee77fae7b197;p=ardour.git diff --git a/libs/ardour/process_thread.cc b/libs/ardour/process_thread.cc index 58d51bef4e..efcc47fee3 100644 --- a/libs/ardour/process_thread.cc +++ b/libs/ardour/process_thread.cc @@ -18,7 +18,7 @@ */ #include -#include "ardour/audioengine.h" + #include "ardour/buffer.h" #include "ardour/buffer_manager.h" #include "ardour/buffer_set.h" @@ -29,22 +29,20 @@ using namespace ARDOUR; using namespace Glib; using namespace std; -Private* ProcessThread::_private_thread_buffers = 0; - static void release_thread_buffer (void* arg) { BufferManager::put_thread_buffers ((ThreadBuffers*) arg); } +Glib::Threads::Private ProcessThread::_private_thread_buffers (release_thread_buffer); + void ProcessThread::init () { - _private_thread_buffers = new Private (release_thread_buffer); } ProcessThread::ProcessThread () - : _thread (0) { } @@ -58,22 +56,22 @@ ProcessThread::get_buffers () ThreadBuffers* tb = BufferManager::get_thread_buffers (); assert (tb); - _private_thread_buffers->set (tb); + _private_thread_buffers.set (tb); } void ProcessThread::drop_buffers () { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); BufferManager::put_thread_buffers (tb); - _private_thread_buffers->set (0); + _private_thread_buffers.set (0); } BufferSet& ProcessThread::get_silent_buffers (ChanCount count) { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); BufferSet* sb = tb->silent_buffers; @@ -92,9 +90,9 @@ ProcessThread::get_silent_buffers (ChanCount count) } BufferSet& -ProcessThread::get_scratch_buffers (ChanCount count) +ProcessThread::get_scratch_buffers (ChanCount count, bool silence) { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); BufferSet* sb = tb->scratch_buffers; @@ -107,13 +105,67 @@ ProcessThread::get_scratch_buffers (ChanCount count) sb->set_count (sb->available()); } + if (silence) { + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + for (uint32_t i = 0; i < sb->count().get(*t); ++i) { + sb->get(*t, i).clear(); + } + } + } + + 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) +{ + ThreadBuffers* tb = _private_thread_buffers.get(); + assert (tb); + + BufferSet* sb = tb->route_buffers; + assert (sb); + + if (count != ChanCount::ZERO) { + assert(sb->available() >= count); + sb->set_count (count); + } else { + sb->set_count (sb->available()); + } + + if (silence) { + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + for (uint32_t i = 0; i < sb->count().get(*t); ++i) { + sb->get(*t, i).clear(); + } + } + } + return *sb; } BufferSet& ProcessThread::get_mix_buffers (ChanCount count) { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); BufferSet* mb = tb->mix_buffers; @@ -127,7 +179,7 @@ ProcessThread::get_mix_buffers (ChanCount count) gain_t* ProcessThread::gain_automation_buffer() { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); gain_t *g = tb->gain_automation_buffer; @@ -135,10 +187,32 @@ ProcessThread::gain_automation_buffer() return g; } +gain_t* +ProcessThread::trim_automation_buffer() +{ + ThreadBuffers* tb = _private_thread_buffers.get(); + assert (tb); + + gain_t *g = tb->trim_automation_buffer; + assert (g); + return g; +} + +gain_t* +ProcessThread::send_gain_automation_buffer() +{ + ThreadBuffers* tb = _private_thread_buffers.get(); + assert (tb); + + gain_t* g = tb->send_gain_automation_buffer; + assert (g); + return g; +} + pan_t** ProcessThread::pan_automation_buffer() { - ThreadBuffers* tb = _private_thread_buffers->get(); + ThreadBuffers* tb = _private_thread_buffers.get(); assert (tb); pan_t** p = tb->pan_automation_buffer;