X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fprocess_thread.cc;h=196b88410004b2601c35095669bd5a333ec9f059;hb=4abb907a8278c8ab05cd82cb11dfe5a22abc28c5;hp=ae7466c7f054e2518790d31ba121538d23deee57;hpb=c40437430acf4b65d8acb8b084eae8cd2f6f5402;p=ardour.git diff --git a/libs/ardour/process_thread.cc b/libs/ardour/process_thread.cc index ae7466c7f0..196b884100 100644 --- a/libs/ardour/process_thread.cc +++ b/libs/ardour/process_thread.cc @@ -1,24 +1,26 @@ /* - Copyright (C) 2010 Paul Davis - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - 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. - -*/ + * Copyright (C) 2010-2012 Paul Davis + * Copyright (C) 2011-2012 David Robillard + * Copyright (C) 2013-2017 Robin Gareus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ #include +#include "ardour/ardour.h" #include "ardour/buffer.h" #include "ardour/buffer_manager.h" #include "ardour/buffer_set.h" @@ -29,22 +31,24 @@ 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); + 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); + /* denormal protection is per thread */ + ARDOUR::setup_fpu (); } ProcessThread::ProcessThread () { + init (); } ProcessThread::~ProcessThread () @@ -54,29 +58,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); + 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); + 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); @@ -91,13 +95,59 @@ 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); + + BufferSet* sb = tb->scratch_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_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); + ThreadBuffers* tb = _private_thread_buffers.get(); + assert (tb); - BufferSet* sb = tb->scratch_buffers; - assert (sb); + BufferSet* sb = tb->route_buffers; + assert (sb); if (count != ChanCount::ZERO) { assert(sb->available() >= count); @@ -106,18 +156,26 @@ 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_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; @@ -126,32 +184,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->gain_automation_buffer; - assert (g); - return g; + 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); + 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->send_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; }