From a5291222493a2d620246fce3c2eede73d579364d Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 20 Nov 2020 20:14:52 +0100 Subject: [PATCH] Optimize stem and direct-out export --- libs/ardour/export_channel.cc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/libs/ardour/export_channel.cc b/libs/ardour/export_channel.cc index 33eca5efbd..60472437f8 100644 --- a/libs/ardour/export_channel.cc +++ b/libs/ardour/export_channel.cc @@ -120,12 +120,18 @@ PortExportChannel::read (Sample const *& data, samplecnt_t samples) const Sample* port_buffer = ab.data(); ab.set_written (true); (*di)->write (port_buffer, samples); - // TODO optimze, get_read_vector() - for (uint32_t i = 0; i < samples; ++i) { - Sample spl; - (*di)->read (&spl, 1); - _buffer[i] += spl; + + PBD::RingBuffer::rw_vector vec; + (*di)->get_read_vector (&vec); + assert (vec.len[0] + vec.len[1] >= samples); + + samplecnt_t to_write = std::min (samples, (samplecnt_t) vec.len[0]); + mix_buffers_no_gain (&_buffer[0], vec.buf[0], to_write); + to_write = std::min (to_write - samples, (samplecnt_t) vec.len[1]); + if (to_write > 0) { + mix_buffers_no_gain (&_buffer[vec.len[0]], vec.buf[1], to_write); } + ++di; }