diff options
Diffstat (limited to 'src/server/InputPort.cpp')
-rw-r--r-- | src/server/InputPort.cpp | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/src/server/InputPort.cpp b/src/server/InputPort.cpp index fc2abd56..1b4c4501 100644 --- a/src/server/InputPort.cpp +++ b/src/server/InputPort.cpp @@ -68,40 +68,28 @@ InputPort::apply_poly(RunContext& context, Raul::Maid& maid, uint32_t poly) bool InputPort::get_buffers(BufferFactory& bufs, + PortImpl::GetFn get, Raul::Array<Voice>* voices, uint32_t poly, - bool real_time) const + size_t num_in_arcs) const { - const size_t num_arcs = real_time ? _arcs.size() : _num_arcs; - if (is_a(PortType::ATOM) && !_value.is_valid()) { poly = 1; } - if (is_a(PortType::AUDIO) && num_arcs == 0) { + if (is_a(PortType::AUDIO) && num_in_arcs == 0) { // Audio input with no arcs, use shared zero buffer for (uint32_t v = 0; v < poly; ++v) { voices->at(v).buffer = bufs.silent_buffer(); } return false; - - } else if (num_arcs == 1 && !is_a(PortType::ATOM)) { - if (real_time) { - if (!_arcs.front().must_mix()) { - // Single non-mixing connection, use buffers directly - for (uint32_t v = 0; v < poly; ++v) { - voices->at(v).buffer = _arcs.front().buffer(v); - } - return false; - } - } } // Otherwise, allocate local buffers for (uint32_t v = 0; v < poly; ++v) { voices->at(v).buffer.reset(); - voices->at(v).buffer = bufs.get_buffer( - buffer_type(), _value.type(), _buffer_size, real_time); + voices->at(v).buffer = (bufs.*get)( + buffer_type(), _value.type(), _buffer_size); voices->at(v).buffer->clear(); if (_value.is_valid()) { voices->at(v).buffer->set_value(_value); @@ -110,6 +98,32 @@ InputPort::get_buffers(BufferFactory& bufs, return true; } +bool +InputPort::pre_get_buffers(BufferFactory& bufs, + Raul::Array<Voice>* voices, + uint32_t poly) const +{ + return get_buffers(bufs, &BufferFactory::get_buffer, voices, poly, _num_arcs); +} + +bool +InputPort::setup_buffers(RunContext& ctx, BufferFactory& bufs, uint32_t poly) +{ + if (is_a(PortType::ATOM) && !_value.is_valid()) { + poly = 1; + } + + if (_arcs.size() == 1 && !is_a(PortType::ATOM) && !_arcs.front().must_mix()) { + // Single non-mixing connection, use buffers directly + for (uint32_t v = 0; v < poly; ++v) { + _voices->at(v).buffer = _arcs.front().buffer(v); + } + return false; + } + + return get_buffers(bufs, &BufferFactory::claim_buffer, _voices, poly, _arcs.size()); +} + void InputPort::add_arc(RunContext& context, ArcImpl* c) { |