+
+ // Silence collect buffers to copy data to, can't use silence() because consecutive calls won't work
+ for (uint32_t i = 0; i < outputs; ++i) {
+ ARDOUR::AudioBuffer &buf = _collect_bufferset.get_audio(i);
+ ARDOUR::Sample *d = buf.data();
+ memset(d, 0, sizeof(ARDOUR::Sample)*_buffer_size);
+ }
+
+ if (f == 0) {
+ //std::cerr << "0: no latency, copying full buffer, trivial.." << std::endl;
+ for (uint32_t i = 0; i < outputs; ++i) {
+ memcpy(_collect_bufferset.get_audio(i).data(),
+ _bufferset.get_audio(inputs + i).data(), _buffer_size * sizeof(float));
+ }
+ } else {
+ //int C = 0;
+ //std::cerr << (++C) << ": latency is " << f << " frames, doing split processing.." << std::endl;
+ framecnt_t target_offset = 0;
+ framecnt_t frames_left = _buffer_size; // refaktoroi
+ do {
+ if (f >= _buffer_size) {
+ //std::cerr << (++C) << ": f (=" << f << ") is larger than buffer_size, still trying to reach the actual output" << std::endl;
+ // there is no data in this buffer regarding to the input!
+ f -= _buffer_size;
+ } else {
+ // this buffer contains either the first, last or a whole bu the output of the impulse
+ // first part: offset is 0, so we copy to the start of _collect_bufferset
+ // we start at output offset "f"
+ // .. and copy "buffer size" - "f" - "offset" frames
+
+ framecnt_t length = _buffer_size - f - target_offset;
+
+ //std::cerr << (++C) << ": copying " << length << " frames to _collect_bufferset.get_audio(i)+" << target_offset << " from bufferset at offset " << f << std::endl;
+ for (uint32_t i = 0; i < outputs; ++i) {
+ memcpy(_collect_bufferset.get_audio(i).data(target_offset),
+ _bufferset.get_audio(inputs + i).data() + f,
+ length * sizeof(float));
+ }
+
+ target_offset += length;
+ frames_left -= length;
+ f = 0;
+ }
+ if (frames_left > 0) {
+ // Silence the buffers
+ for (uint32_t i = 0; i < inputs; ++i) {
+ ARDOUR::AudioBuffer &buf = _bufferset.get_audio(i);
+ ARDOUR::Sample *d = buf.data();
+ memset(d, 0, sizeof(ARDOUR::Sample)*_buffer_size);
+ }
+
+ _plugin->connect_and_run (_bufferset, target_offset, target_offset + _buffer_size, 1.0, in_map, out_map, _buffer_size, 0);
+ }
+ } while ( frames_left > 0);
+
+ }
+
+