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; }