X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fprocess_thread.cc;h=3864a898fa2d649fe4e998a3936b47b7db6cbe17;hb=5fa05b403ca21a6573d07b921dc14f0769dc9fc7;hp=e36639aaf53e601c8f3fe6e6af555fca30d0d269;hpb=3ea10b38bbb4b471178793f68fbd3a0ee74449f6;p=ardour.git diff --git a/libs/ardour/process_thread.cc b/libs/ardour/process_thread.cc index e36639aaf5..3864a898fa 100644 --- a/libs/ardour/process_thread.cc +++ b/libs/ardour/process_thread.cc @@ -14,11 +14,10 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ #include -#include "ardour/audioengine.h" + #include "ardour/buffer.h" #include "ardour/buffer_manager.h" #include "ardour/buffer_set.h" @@ -29,22 +28,20 @@ using namespace ARDOUR; using namespace Glib; using namespace std; -Private* ProcessThread::_private_thread_buffers = 0; - -static void +static void release_thread_buffer (void* arg) { - BufferManager::put_thread_buffers ((ThreadBuffers*) 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) { } @@ -55,31 +52,29 @@ ProcessThread::~ProcessThread () void ProcessThread::get_buffers () { - ThreadBuffers* tb = BufferManager::get_thread_buffers (); + ThreadBuffers* tb = BufferManager::get_thread_buffers (); - assert (tb); - _private_thread_buffers->set (tb); - cerr << "ProcThread " << this << " using TBs at " << tb << " (aka. " << _private_thread_buffers->get() << endl; + assert (tb); + _private_thread_buffers.set (tb); } void ProcessThread::drop_buffers () { - ThreadBuffers* tb = _private_thread_buffers->get(); - assert (tb); - BufferManager::put_thread_buffers (tb); - _private_thread_buffers->set (0); - cerr << "ProcThread " << this << " dropped TBs\n"; + ThreadBuffers* tb = _private_thread_buffers.get(); + assert (tb); + BufferManager::put_thread_buffers (tb); + _private_thread_buffers.set (0); } BufferSet& ProcessThread::get_silent_buffers (ChanCount count) { - ThreadBuffers* tb = _private_thread_buffers->get(); - assert (tb); + ThreadBuffers* tb = _private_thread_buffers.get(); + assert (tb); - BufferSet* sb = tb->silent_buffers; - assert (sb); + BufferSet* sb = tb->silent_buffers; + assert (sb); assert(sb->available() >= count); sb->set_count(count); @@ -94,13 +89,13 @@ 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(); - assert (tb); + ThreadBuffers* tb = _private_thread_buffers.get(); + assert (tb); - BufferSet* sb = tb->scratch_buffers; - assert (sb); + BufferSet* sb = tb->scratch_buffers; + assert (sb); if (count != ChanCount::ZERO) { assert(sb->available() >= count); @@ -109,18 +104,72 @@ 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(); - assert (tb); + ThreadBuffers* tb = _private_thread_buffers.get(); + assert (tb); - BufferSet* mb = tb->mix_buffers; + BufferSet* mb = tb->mix_buffers; - assert (mb); + assert (mb); assert (mb->available() >= count); mb->set_count(count); return *mb; @@ -129,21 +178,54 @@ ProcessThread::get_mix_buffers (ChanCount count) gain_t* ProcessThread::gain_automation_buffer() { - ThreadBuffers* tb = _private_thread_buffers->get(); - assert (tb); + ThreadBuffers* tb = _private_thread_buffers.get(); + assert (tb); + + gain_t *g = tb->gain_automation_buffer; + assert (g); + 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; +} + +gain_t* +ProcessThread::scratch_automation_buffer() +{ + ThreadBuffers* tb = _private_thread_buffers.get(); + assert (tb); - gain_t *g = tb->gain_automation_buffer; - assert (g); - return g; + gain_t* g = tb->scratch_automation_buffer; + assert (g); + return g; } pan_t** ProcessThread::pan_automation_buffer() { - ThreadBuffers* tb = _private_thread_buffers->get(); - assert (tb); + ThreadBuffers* tb = _private_thread_buffers.get(); + assert (tb); - pan_t** p = tb->pan_automation_buffer; - assert (p); - return p; + pan_t** p = tb->pan_automation_buffer; + assert (p); + return p; }