2 * Copyright (C) 2010-2012 Paul Davis <paul@linuxaudiosystems.com>
3 * Copyright (C) 2011-2012 David Robillard <d@drobilla.net>
4 * Copyright (C) 2013-2017 Robin Gareus <robin@gareus.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 #include "ardour/ardour.h"
24 #include "ardour/buffer.h"
25 #include "ardour/buffer_manager.h"
26 #include "ardour/buffer_set.h"
27 #include "ardour/process_thread.h"
28 #include "ardour/thread_buffers.h"
30 using namespace ARDOUR;
35 release_thread_buffer (void* arg)
37 BufferManager::put_thread_buffers ((ThreadBuffers*) arg);
40 Glib::Threads::Private<ThreadBuffers> ProcessThread::_private_thread_buffers (release_thread_buffer);
43 ProcessThread::init ()
45 /* denormal protection is per thread */
49 ProcessThread::ProcessThread ()
54 ProcessThread::~ProcessThread ()
59 ProcessThread::get_buffers ()
61 ThreadBuffers* tb = BufferManager::get_thread_buffers ();
64 _private_thread_buffers.set (tb);
68 ProcessThread::drop_buffers ()
70 ThreadBuffers* tb = _private_thread_buffers.get();
72 BufferManager::put_thread_buffers (tb);
73 _private_thread_buffers.set (0);
77 ProcessThread::get_silent_buffers (ChanCount count)
79 ThreadBuffers* tb = _private_thread_buffers.get();
82 BufferSet* sb = tb->silent_buffers;
85 assert(sb->available() >= count);
88 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
89 for (size_t i= 0; i < count.get(*t); ++i) {
90 sb->get_available(*t, i).clear();
98 ProcessThread::get_scratch_buffers (ChanCount count, bool silence)
100 ThreadBuffers* tb = _private_thread_buffers.get();
103 BufferSet* sb = tb->scratch_buffers;
106 if (count != ChanCount::ZERO) {
107 assert(sb->available() >= count);
108 sb->set_count (count);
110 sb->set_count (sb->available());
114 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
115 for (uint32_t i = 0; i < sb->count().get(*t); ++i) {
116 sb->get_available (*t, i).clear();
125 ProcessThread::get_noinplace_buffers (ChanCount count)
127 ThreadBuffers* tb = _private_thread_buffers.get();
130 BufferSet* sb = tb->noinplace_buffers;
133 if (count != ChanCount::ZERO) {
134 assert(sb->available() >= count);
135 sb->set_count (count);
137 sb->set_count (sb->available());
144 ProcessThread::get_route_buffers (ChanCount count, bool silence)
146 ThreadBuffers* tb = _private_thread_buffers.get();
149 BufferSet* sb = tb->route_buffers;
152 if (count != ChanCount::ZERO) {
153 assert(sb->available() >= count);
154 sb->set_count (count);
156 sb->set_count (sb->available());
160 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
161 for (uint32_t i = 0; i < sb->count().get(*t); ++i) {
162 sb->get_available (*t, i).clear();
171 ProcessThread::get_mix_buffers (ChanCount count)
173 ThreadBuffers* tb = _private_thread_buffers.get();
176 BufferSet* mb = tb->mix_buffers;
179 assert (mb->available() >= count);
180 mb->set_count(count);
185 ProcessThread::gain_automation_buffer()
187 ThreadBuffers* tb = _private_thread_buffers.get();
190 gain_t *g = tb->gain_automation_buffer;
196 ProcessThread::trim_automation_buffer()
198 ThreadBuffers* tb = _private_thread_buffers.get();
201 gain_t *g = tb->trim_automation_buffer;
207 ProcessThread::send_gain_automation_buffer()
209 ThreadBuffers* tb = _private_thread_buffers.get();
212 gain_t* g = tb->send_gain_automation_buffer;
218 ProcessThread::scratch_automation_buffer()
220 ThreadBuffers* tb = _private_thread_buffers.get();
223 gain_t* g = tb->scratch_automation_buffer;
229 ProcessThread::pan_automation_buffer()
231 ThreadBuffers* tb = _private_thread_buffers.get();
234 pan_t** p = tb->pan_automation_buffer;